From eda8b9c884ca97b6d6a8b9f19556c821391ef45af286f4e93f0626f4609d402c Mon Sep 17 00:00:00 2001 From: Wolfgang Rosenauer Date: Sun, 13 Apr 2014 14:47:41 +0000 Subject: [PATCH] Accepting request 229482 from devel:ARM:Factory - add mozilla-aarch64-599882cfb998.patch, mozilla-aarch64-bmo-810631.patch, mozilla-aarch64-bmo-962488.patch, mozilla-aarch64-bmo-963030.patch, mozilla-aarch64-bmo-963027.patch, mozilla-aarch64-bmo-963028.patch, mozilla-aarch64-bmo-963029.patch, mozilla-aarch64-bmo-963023.patch, mozilla-aarch64-bmo-963024.patch, mozilla-aarch64-bmo-963031.patch: AArch64 porting OBS-URL: https://build.opensuse.org/request/show/229482 OBS-URL: https://build.opensuse.org/package/show/mozilla:Factory/MozillaFirefox?expand=0&rev=376 --- MozillaFirefox.changes | 14 + MozillaFirefox.spec | 51 +- mozilla-aarch64-599882cfb998.diff | 32 + mozilla-aarch64-bmo-810631.patch | 100372 +++++++++++++++++++++++++++ mozilla-aarch64-bmo-962488.patch | 80 + mozilla-aarch64-bmo-963023.patch | 115 + mozilla-aarch64-bmo-963024.patch | 517 + mozilla-aarch64-bmo-963027.patch | 29 + mozilla-aarch64-bmo-963028.patch | 54 + mozilla-aarch64-bmo-963029.patch | 43 + mozilla-aarch64-bmo-963030.patch | 32 + mozilla-aarch64-bmo-963031.patch | 30 + 12 files changed, 101355 insertions(+), 14 deletions(-) create mode 100644 mozilla-aarch64-599882cfb998.diff create mode 100644 mozilla-aarch64-bmo-810631.patch create mode 100644 mozilla-aarch64-bmo-962488.patch create mode 100644 mozilla-aarch64-bmo-963023.patch create mode 100644 mozilla-aarch64-bmo-963024.patch create mode 100644 mozilla-aarch64-bmo-963027.patch create mode 100644 mozilla-aarch64-bmo-963028.patch create mode 100644 mozilla-aarch64-bmo-963029.patch create mode 100644 mozilla-aarch64-bmo-963030.patch create mode 100644 mozilla-aarch64-bmo-963031.patch diff --git a/MozillaFirefox.changes b/MozillaFirefox.changes index cc71422..5475088 100644 --- a/MozillaFirefox.changes +++ b/MozillaFirefox.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Mon Apr 7 15:34:31 UTC 2014 - dmueller@suse.com + +- add mozilla-aarch64-599882cfb998.patch, + mozilla-aarch64-bmo-810631.patch, + mozilla-aarch64-bmo-962488.patch, + mozilla-aarch64-bmo-963030.patch, + mozilla-aarch64-bmo-963027.patch, + mozilla-aarch64-bmo-963028.patch, + mozilla-aarch64-bmo-963029.patch, + mozilla-aarch64-bmo-963023.patch, + mozilla-aarch64-bmo-963024.patch, + mozilla-aarch64-bmo-963031.patch: AArch64 porting + ------------------------------------------------------------------- Mon Mar 24 16:18:44 UTC 2014 - dvaleev@suse.com diff --git a/MozillaFirefox.spec b/MozillaFirefox.spec index 38712d2..2d3caa9 100644 --- a/MozillaFirefox.spec +++ b/MozillaFirefox.spec @@ -113,13 +113,25 @@ Patch18: mozilla-ppc64le-mfbt.patch Patch19: mozilla-ppc64le-webrtc.patch Patch20: mozilla-ppc64le-xpcom.patch Patch21: mozilla-ppc64-xpcom.patch +# Gecko/Toolkit AArch64 Porting +Patch36: mozilla-aarch64-599882cfb998.diff +Patch37: mozilla-aarch64-bmo-810631.patch +Patch38: mozilla-aarch64-bmo-962488.patch +Patch39: mozilla-aarch64-bmo-963030.patch +Patch40: mozilla-aarch64-bmo-963027.patch +Patch41: mozilla-aarch64-bmo-963028.patch +Patch42: mozilla-aarch64-bmo-963029.patch +Patch43: mozilla-aarch64-bmo-963023.patch +Patch44: mozilla-aarch64-bmo-963024.patch +Patch45: mozilla-aarch64-bmo-963031.patch + # Firefox/browser -Patch30: firefox-browser-css.patch -Patch31: firefox-kde.patch -Patch32: firefox-kde-114.patch -Patch33: firefox-no-default-ualocale.patch -Patch34: firefox-multilocale-chrome.patch -Patch35: firefox-branded-icons.patch +Patch100: firefox-browser-css.patch +Patch101: firefox-kde.patch +Patch102: firefox-kde-114.patch +Patch103: firefox-no-default-ualocale.patch +Patch104: firefox-multilocale-chrome.patch +Patch105: firefox-branded-icons.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires(post): coreutils shared-mime-info desktop-file-utils Requires(postun): shared-mime-info desktop-file-utils @@ -152,7 +164,7 @@ Obsoletes: libproxy1-pacrunner-mozjs <= 0.4.7 %define _google_api_key AIzaSyD1hTe85_a14kr1Ks8T3Ce75rvbR1_Dx7Q %define branding 1 %define localize 1 -%ifarch ppc ppc64 ppc64le s390 s390x ia64 %arm +%ifarch aarch64 ppc ppc64 ppc64le s390 s390x ia64 %arm %define crashreporter 0 %else %define crashreporter 1 @@ -259,15 +271,26 @@ cd $RPM_BUILD_DIR/mozilla %patch19 -p1 %patch20 -p1 %patch21 -p1 -# -%patch30 -p1 -%patch31 -p1 +%patch36 -p1 +%patch37 -p1 +%patch38 -p1 +%patch39 -p1 +%patch40 -p1 +%patch41 -p1 +%patch42 -p1 +%patch43 -p1 +%patch44 -p1 +%patch45 -p1 + +# Firefox +%patch100 -p1 +%patch101 -p1 %if %suse_version >= 1140 -%patch32 -p1 +%patch102 -p1 %endif -%patch33 -p1 -%patch34 -p1 -%patch35 -p1 +%patch103 -p1 +%patch104 -p1 +%patch105 -p1 %build # no need to add build time to binaries diff --git a/mozilla-aarch64-599882cfb998.diff b/mozilla-aarch64-599882cfb998.diff new file mode 100644 index 0000000..5f25296 --- /dev/null +++ b/mozilla-aarch64-599882cfb998.diff @@ -0,0 +1,32 @@ + +diff --git a/js/src/assembler/wtf/Platform.h b/js/src/assembler/wtf/Platform.h +--- a/js/src/assembler/wtf/Platform.h ++++ b/js/src/assembler/wtf/Platform.h +@@ -205,16 +205,23 @@ + #endif + + /* WTF_CPU_S390 - S390 32-bit */ + #if defined(__s390__) + #define WTF_CPU_S390 1 + #define WTF_CPU_BIG_ENDIAN 1 + #endif + ++#if defined(__aarch64__) ++#define WTF_CPU_AARCH64 1 ++#if defined(__AARCH64EB__) ++#define WTF_CPU_BIG_ENDIAN 1 ++#endif ++#endif ++ + /* WTF_CPU_X86 - i386 / x86 32-bit */ + #if defined(__i386__) \ + || defined(i386) \ + || defined(_M_IX86) \ + || defined(_X86_) \ + || defined(__THW_INTEL) + #define WTF_CPU_X86 1 + #endif + + + + diff --git a/mozilla-aarch64-bmo-810631.patch b/mozilla-aarch64-bmo-810631.patch new file mode 100644 index 0000000..ae443eb --- /dev/null +++ b/mozilla-aarch64-bmo-810631.patch @@ -0,0 +1,100372 @@ + +# HG changeset patch +# User Ryan VanderMeulen +# Date 1395835684 14400 +# Node ID 1c6abf8c653a8788f5f2cb30779e46647ac8d504 +# Parent 9afe2a1145bd2962684186fe78d0fc4773630144 +Bug 810631 - Update libffi to version 3.1rc1. + +diff --git a/js/src/ctypes/libffi/ChangeLog b/js/src/ctypes/libffi/ChangeLog +--- a/js/src/ctypes/libffi/ChangeLog ++++ b/js/src/ctypes/libffi/ChangeLog +@@ -1,4259 +1,4883 @@ +-2010-08-05 Dan Witte +- +- * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the +- debug CRT when --enable-debug is given. +- * configure.ac: Define it. +- * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately. +- +-2010-08-04 Dan Witte +- +- * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64 +- platforms. +- * src/x86/ffi.c: Remove redundant ifdef checks. +- * src/prep_cif.c: Push stack space computation into src/x86/ffi.c +- for X86_ANY so return value space doesn't get added twice. +- +-2010-08-03 Neil Rashbrooke +- +- * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy. +- +-2010-07-22 Dan Witte +- +- * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI. +- * src/prep_cif.c: Fix ABI assertion. +- * src/cris/ffi.c: Ditto. +- +-2010-07-10 Evan Phoenix +- +- * src/closures.c (selinux_enabled_check): Fix strncmp usage bug. +- +-2010-07-07 Dan Horák +- +- * include/ffi.h.in: Protect #define with #ifndef. +- * src/powerpc/ffitarget.h: Ditto. +- * src/s390/ffitarget.h: Ditto. +- * src/sparc/ffitarget.h: Ditto. +- +-2010-05-11 Dan Witte +- +- * doc/libffi.tex: Document previous change. +- +-2010-05-11 Makoto Kato +- +- * src/x86/ffi.c (ffi_call): Don't copy structs passed by value. +- +-2010-05-05 Michael Kohler +- +- * src/dlmalloc.c (dlfree): Fix spelling. +- * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto. +- * configure.ac: Ditto. +- * configure: Rebuilt. +- +-2010-04-13 Dan Witte +- +- * msvcc.sh: Build with -W3 instead of -Wall. +- * src/powerpc/ffi_darwin.c: Remove build warnings. +- * src/x86/ffi.c: Ditto. +- * src/x86/ffitarget.h: Ditto. +- +-2010-03-30 Dan Witte +- +- * msvcc.sh: Disable build warnings. +- * README (tested): Clarify windows build procedure. +- +-2010-03-14 Matthias Klose +- +- * src/x86/ffi64.c: Fix typo in comment. +- * src/x86/ffi.c: Use /* ... */ comment style. +- +-2010-07-07 Neil Roberts +- +- * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to +- 16-bytes. +- +-2010-07-02 Jakub Jelinek +- +- * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes. +- * Makefile.in: Regenerated. +- +-2010-05-19 Rainer Orth +- +- * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as +- output, too. +- (libffi_cv_as_ascii_pseudo_op): Check for .ascii. +- (libffi_cv_as_string_pseudo_op): Check for .string. +- * configure: Regenerate. +- * fficonfig.h.in: Regenerate. +- * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error. +- +-2010-04-07 Jakub Jelinek +- +- * regex.c (byte_re_match_2_internal): Avoid set but not used +- warning. +- +-2010-04-02 Ralf Wildenhues +- +- * Makefile.in: Regenerate. +- * aclocal.m4: Regenerate. +- * include/Makefile.in: Regenerate. +- * man/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- +-2010-03-15 Rainer Orth +- +- * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test. +- * configure: Regenerate. +- * fficonfig.h.in: Regenerate. +- * libffi/src/x86/unix64.S (.eh_frame) +- [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type. +- +-2010-02-24 Rainer Orth +- +- * doc/libffi.texi (The Closure API): Fix typo. +- * doc/libffi.info: Remove. +- +-2010-02-15 Matthias Klose +- +- * src/arm/sysv.S (__ARM_ARCH__): Define for processor +- __ARM_ARCH_7EM__. +- +-2010-01-07 Rainer Orth +- +- PR libffi/40701 +- * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL, +- PRIuLL, PRId64, PRIu64, PRIuPTR): Define. +- * testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on +- alpha*-dec-osf*. +- * testsuite/libffi.call/cls_align_uint64.c: Likewise. +- * testsuite/libffi.call/cls_ulonglong.c: Likewise. +- * testsuite/libffi.call/return_ll1.c: Likewise. +- * testsuite/libffi.call/stret_medium2.c: Likewise. +- * testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast +- MAP_FAILED to char *. +- +-2010-01-06 Rainer Orth +- +- * src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__. +- +-2009-12-31 Anthony Green +- +- * README: Update for libffi 3.0.9. +- +-2009-12-27 Matthias Klose +- +- * configure.ac (HAVE_LONG_DOUBLE): Define for mips when +- appropriate. +- * configure: Rebuilt. +- +-2009-12-26 Anthony Green +- +- * testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for +- avr32*-*-*. +- * testsuite/libffi.call/cls_double_va.c: Ditto. +- +-2009-12-26 Andreas Tobler +- +- * testsuite/libffi.call/ffitest.h: Conditionally include stdint.h +- and inttypes.h. +- * testsuite/libffi.special/unwindtest.cc: Ditto. +- +-2009-12-26 Andreas Tobler +- +- * configure.ac: Add amd64-*-openbsd*. +- * configure: Rebuilt. +- * testsuite/lib/libffi-dg.exp (libffi_target_compile): Link +- openbsd programs with -lpthread. +- +-2009-12-26 Anthony Green +- +- * testsuite/libffi.call/cls_double_va.c, +- testsuite/libffi.call/cls_longdouble.c, +- testsuite/libffi.call/cls_longdouble_va.c, +- testsuite/libffi.call/cls_pointer.c, +- testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for +- mips*-*-* and arm*-*-*. +- * testsuite/libffi.call/cls_align_longdouble_split.c, +- testsuite/libffi.call/cls_align_longdouble_split2.c, +- testsuite/libffi.call/stret_medium2.c, +- testsuite/libffi.call/stret_medium.c, +- testsuite/libffi.call/stret_large.c, +- testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*. +- +-2009-12-31 Kay Tietz +- +- * testsuite/libffi.call/ffitest.h, +- testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix +- definitions. +- +-2009-12-31 Carlo Bramini +- +- * configure.ac (AM_LTLDFLAGS): Define for windows hosts. +- * Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS. +- * configure: Rebuilt. +- * Makefile.in: Rebuilt. +- +-2009-12-31 Anthony Green +- Blake Chaffin. +- +- * testsuite/libffi.call/huge_struct.c: New test case from Blake +- Chaffin @ Apple. +- +-2009-12-28 David Edelsohn +- +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to +- local variables. +- (aix_adjust_aggregate_sizes): New function. +- (ffi_prep_cif_machdep): Call it. +- +-2009-12-26 Andreas Tobler +- +- * configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets. +- * configure: Regenerate. +- * fficonfig.h.in: Likewise. +- * src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for +- Solaris/x86. +- +-2009-12-26 Andreas Schwab +- +- * src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count +- when a float arguments is passed in memory. +- (ffi_closure_helper_SYSV): Mark general registers as used up when +- a 64bit or soft-float long double argument is passed in memory. +- +-2009-12-25 Matthias Klose +- +- * man/ffi_call.3: Fix #include in examples. +- * doc/libffi.texi: Add dircategory. +- +-2009-12-25 Frank Everdij +- +- * include/ffi.h.in: Placed '__GNUC__' ifdef around +- '__attribute__((aligned(8)))' in ffi_closure, fixes compile for +- IRIX MIPSPro c99. +- * include/ffi_common.h: Added '__sgi' define to non +- '__attribute__((__mode__()))' integer typedefs. +- * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, +- ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. +- (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added +- FFI_LONGDOUBLE support and alignment(N32 only). +- * src/mips/ffitarget.h: Corrected '#include ' for IRIX and +- fixed non '__attribute__((__mode__()))' integer typedefs. +- * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' +- since they are Linux/GNU Assembler specific. +- +-2009-12-25 Bradley Smith +- +- * configure.ac, Makefile.am, src/avr32/ffi.c, +- src/avr32/ffitarget.h, +- src/avr32/sysv.S: Add AVR32 port. +- * configure, Makefile.in: Rebuilt. +- +-2009-12-21 Andreas Tobler +- +- * configure.ac: Make i?86 build on FreeBSD and OpenBSD. +- * configure: Regenerate. +- +-2009-12-15 John David Anglin +- +- * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. +- +-2009-12-13 John David Anglin +- +- * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE +- type on HP-UX. +- +-2009-12-11 Eric Botcazou +- +- * src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long +- double' arguments. +- +-2009-12-11 Eric Botcazou +- +- * testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10. +- +-2009-12-10 Rainer Orth +- +- PR libffi/40700 +- * src/closures.c [X86_64 && __sun__ && __svr4__] +- (FFI_MMAP_EXEC_WRIT): Define. +- +-2009-12-08 David Daney +- +- * testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-* +- * testsuite/libffi.call/cls_align_longdouble_split2.c: Same. +- * testsuite/libffi.call/stret_large.c: Same. +- * testsuite/libffi.call/cls_align_longdouble_split.c: Same. +- * testsuite/libffi.call/stret_large2.c: Same. +- * testsuite/libffi.call/stret_medium2.c: Same. +- +-2009-12-07 David Edelsohn +- +- * src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump +- typo. +- +-2009-12-05 David Edelsohn +- +- * src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64 +- code. +- * src/powerpc/aix_closure.S: Same. +- +-2009-12-05 Ralf Wildenhues +- +- * Makefile.in: Regenerate. +- * configure: Regenerate. +- * include/Makefile.in: Regenerate. +- * man/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- +-2009-12-04 David Edelsohn +- +- * src/powerpc/aix_closure.S: Reorganize 64-bit code to match +- linux64_closure.S. +- +-2009-12-04 Uros Bizjak +- +- PR libffi/41908 +- * src/x86/ffi64.c (classify_argument): Update from +- gcc/config/i386/i386.c. +- (ffi_closure_unix64_inner): Do not use the address of two consecutive +- SSE registers directly. +- * testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail +- for x86_64 linux targets. +- +-2009-12-04 David Edelsohn +- +- * src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment +- pfr for long double split between fpr13 and stack. +- +-2009-12-03 David Edelsohn +- +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and +- fparg_count twice for long double. +- +-2009-12-03 David Edelsohn +- +- PR libffi/42243 +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses. +- +-2009-12-03 Uros Bizjak +- +- * testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string. +- Remove xfails for x86 linux targets. +- +-2009-12-02 David Edelsohn +- +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64 +- case. +- +-2009-12-01 David Edelsohn +- +- * src/powerpc/aix.S (ffi_call_AIX): Convert to more standard +- register usage. Call ffi_prep_args directly. Add long double +- return value support. +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment +- applies to FFI_TYPE_DOUBLE. Correct fpr_base increment typo. +- Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases. +- (ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit +- mode. +- (ffi_closure_helper_DARWIN): Remove nf and ng counters. Move temp +- into case. +- * src/powerpc/aix_closure.S: Maintain 16 byte stack alignment. +- Allocate result area between params and FPRs. +- +-2009-11-30 David Edelsohn +- +- PR target/35484 +- * src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and +- AIX64. +- * src/powerpc/aix.S: Implement AIX64 version. +- * src/powerpc/aix_closure.S: Implement AIX64 version. +- (ffi_closure_ASM): Use extsb, lha and displament addresses. +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64 +- support. +- (ffi_prep_cif_machdep): Same. +- (ffi_call): Same. +- (ffi_closure_helper_DARWIN): Same. +- +-2009-11-02 Andreas Tobler +- +- PR libffi/41908 +- * testsuite/libffi.call/testclosure.c: New test. +- +-2009-09-28 Kai Tietz +- +- * src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu +- assembly version use of ___chkstk. +- +-2009-09-23 Matthias Klose +- +- PR libffi/40242, PR libffi/41443 +- * src/arm/sysv.S (__ARM_ARCH__): Define for processors +- __ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__, +- __ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__. +- Change the conditionals to __SOFTFP__ || __ARM_EABI__ +- for -mfloat-abi=softfp to work. +- +-2009-09-17 Loren J. Rittle +- +- PR testsuite/32843 (strikes again) +- * src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to +- enable proper extension on char and short. +- +-2009-09-15 David Daney +- +- * src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special +- handling for FFI_TYPE_POINTER. +- * src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT, +- FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT, +- FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT, +- FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines. +- (FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations. +- (enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float. +- * src/mips/n32.S (ffi_call_N32): Add handling for soft-float +- structure and pointer returns. +- (ffi_closure_N32): Add handling for pointer returns. +- * src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags, +- calc_n32_return_struct_flags): Handle soft-float. +- (ffi_prep_cif_machdep): Handle soft-float, fix pointer handling. +- (ffi_call_N32): Declare proper argument types. +- (ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle +- soft-float. +- +-2009-08-24 Ralf Wildenhues +- +- * configure.ac (AC_PREREQ): Bump to 2.64. +- +-2009-08-22 Ralf Wildenhues +- +- * Makefile.am (install-html, install-pdf): Remove. +- * Makefile.in: Regenerate. +- +- * Makefile.in: Regenerate. +- * aclocal.m4: Regenerate. +- * configure: Regenerate. +- * fficonfig.h.in: Regenerate. +- * include/Makefile.in: Regenerate. +- * man/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- +-2009-07-30 Ralf Wildenhues +- +- * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. +- +-2009-07-24 Dave Korn +- +- PR libffi/40807 +- * src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending +- return types for X86_WIN32. +- * src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types. +- (_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV, +- _ffi_closure_STDCALL): Likewise. +- +- * src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin. +- (dlmmap, dlmunmap): Also use these functions on Cygwin. +- +-2009-07-11 Richard Sandiford +- +- PR testsuite/40699 +- PR testsuite/40707 +- PR testsuite/40709 +- * testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and +- 2009-06-30 commits. +- +-2009-07-01 Richard Sandiford +- +- * testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path +- to "" before adding paths. (This reinstates an assignment that +- was removed by my 2009-06-30 commit, but changes the initial +- value from "." to "".) +- +-2009-07-01 H.J. Lu +- +- PR testsuite/40601 +- * testsuite/lib/libffi-dg.exp (libffi-init): Properly set +- gccdir. Adjust ld_library_path for gcc only if gccdir isn't +- empty. +- +-2009-06-30 Richard Sandiford +- +- * testsuite/lib/libffi-dg.exp (libffi-init): Don't add "." +- to ld_library_path. Use add_path. Add just find_libgcc_s +- to ld_library_path, not every libgcc multilib directory. +- +-2009-06-16 Wim Lewis +- +- * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are +- supposed to be callee-saved. +- * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of +- return buffer for odd-size structs. +- +-2009-06-16 Andreas Tobler +- +- PR libffi/40444 +- * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add +- allow_stack_execute for Darwin. +- +-2009-06-16 Andrew Haley +- +- * configure.ac (TARGETDIR): Add missing blank lines. +- * configure: Regenerate. +- +-2009-06-16 Andrew Haley +- +- * testsuite/libffi.call/cls_align_sint64.c, +- testsuite/libffi.call/cls_align_uint64.c, +- testsuite/libffi.call/cls_longdouble_va.c, +- testsuite/libffi.call/cls_ulonglong.c, +- testsuite/libffi.call/return_ll1.c, +- testsuite/libffi.call/stret_medium2.c: Fix printf format +- specifiers. +- * testsuite/libffi.call/ffitest.h, +- testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. +- +-2009-06-15 Andrew Haley +- +- * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. +- * testsuite/libffi.call/err_bad_abi.c: Likewise. +- +-2009-06-12 Andrew Haley +- +- * Makefile.am: Remove info_TEXINFOS. +- +-2009-06-12 Andrew Haley +- +- * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, +- testsuite/libffi.call/cls_align_uint64.c, +- testsuite/libffi.call/cls_ulonglong.c, +- testsuite/libffi.call/return_ll1.c, +- testsuite/libffi.call/stret_medium2.c: Fix printf format +- specifiers. +- testsuite/libffi.special/unwindtest.cc: include stdint.h. +- +-2009-06-11 Timothy Wall +- +- * Makefile.am, +- configure.ac, +- include/ffi.h.in, +- include/ffi_common.h, +- src/closures.c, +- src/dlmalloc.c, +- src/x86/ffi.c, +- src/x86/ffitarget.h, +- src/x86/win64.S (new), +- README: Added win64 support (mingw or MSVC) +- * Makefile.in, +- include/Makefile.in, +- man/Makefile.in, +- testsuite/Makefile.in, +- configure, +- aclocal.m4: Regenerated +- * ltcf-c.sh: properly escape cygwin/w32 path +- * man/ffi_call.3: Clarify size requirements for return value. +- * src/x86/ffi64.c: Fix filename in comment. +- * src/x86/win32.S: Remove unused extern. +- +- * testsuite/libffi.call/closure_fn0.c, +- testsuite/libffi.call/closure_fn1.c, +- testsuite/libffi.call/closure_fn2.c, +- testsuite/libffi.call/closure_fn3.c, +- testsuite/libffi.call/closure_fn4.c, +- testsuite/libffi.call/closure_fn5.c, +- testsuite/libffi.call/closure_fn6.c, +- testsuite/libffi.call/closure_stdcall.c, +- testsuite/libffi.call/cls_12byte.c, +- testsuite/libffi.call/cls_16byte.c, +- testsuite/libffi.call/cls_18byte.c, +- testsuite/libffi.call/cls_19byte.c, +- testsuite/libffi.call/cls_1_1byte.c, +- testsuite/libffi.call/cls_20byte.c, +- testsuite/libffi.call/cls_20byte1.c, +- testsuite/libffi.call/cls_24byte.c, +- testsuite/libffi.call/cls_2byte.c, +- testsuite/libffi.call/cls_3_1byte.c, +- testsuite/libffi.call/cls_3byte1.c, +- testsuite/libffi.call/cls_3byte2.c, +- testsuite/libffi.call/cls_4_1byte.c, +- testsuite/libffi.call/cls_4byte.c, +- testsuite/libffi.call/cls_5_1_byte.c, +- testsuite/libffi.call/cls_5byte.c, +- testsuite/libffi.call/cls_64byte.c, +- testsuite/libffi.call/cls_6_1_byte.c, +- testsuite/libffi.call/cls_6byte.c, +- testsuite/libffi.call/cls_7_1_byte.c, +- testsuite/libffi.call/cls_7byte.c, +- testsuite/libffi.call/cls_8byte.c, +- testsuite/libffi.call/cls_9byte1.c, +- testsuite/libffi.call/cls_9byte2.c, +- testsuite/libffi.call/cls_align_double.c, +- testsuite/libffi.call/cls_align_float.c, +- testsuite/libffi.call/cls_align_longdouble.c, +- testsuite/libffi.call/cls_align_longdouble_split.c, +- testsuite/libffi.call/cls_align_longdouble_split2.c, +- testsuite/libffi.call/cls_align_pointer.c, +- testsuite/libffi.call/cls_align_sint16.c, +- testsuite/libffi.call/cls_align_sint32.c, +- testsuite/libffi.call/cls_align_sint64.c, +- testsuite/libffi.call/cls_align_uint16.c, +- testsuite/libffi.call/cls_align_uint32.c, +- testsuite/libffi.call/cls_align_uint64.c, +- testsuite/libffi.call/cls_dbls_struct.c, +- testsuite/libffi.call/cls_double.c, +- testsuite/libffi.call/cls_double_va.c, +- testsuite/libffi.call/cls_float.c, +- testsuite/libffi.call/cls_longdouble.c, +- testsuite/libffi.call/cls_longdouble_va.c, +- testsuite/libffi.call/cls_multi_schar.c, +- testsuite/libffi.call/cls_multi_sshort.c, +- testsuite/libffi.call/cls_multi_sshortchar.c, +- testsuite/libffi.call/cls_multi_uchar.c, +- testsuite/libffi.call/cls_multi_ushort.c, +- testsuite/libffi.call/cls_multi_ushortchar.c, +- testsuite/libffi.call/cls_pointer.c, +- testsuite/libffi.call/cls_pointer_stack.c, +- testsuite/libffi.call/cls_schar.c, +- testsuite/libffi.call/cls_sint.c, +- testsuite/libffi.call/cls_sshort.c, +- testsuite/libffi.call/cls_uchar.c, +- testsuite/libffi.call/cls_uint.c, +- testsuite/libffi.call/cls_ulonglong.c, +- testsuite/libffi.call/cls_ushort.c, +- testsuite/libffi.call/err_bad_abi.c, +- testsuite/libffi.call/err_bad_typedef.c, +- testsuite/libffi.call/float2.c, +- testsuite/libffi.call/huge_struct.c, +- testsuite/libffi.call/nested_struct.c, +- testsuite/libffi.call/nested_struct1.c, +- testsuite/libffi.call/nested_struct10.c, +- testsuite/libffi.call/nested_struct2.c, +- testsuite/libffi.call/nested_struct3.c, +- testsuite/libffi.call/nested_struct4.c, +- testsuite/libffi.call/nested_struct5.c, +- testsuite/libffi.call/nested_struct6.c, +- testsuite/libffi.call/nested_struct7.c, +- testsuite/libffi.call/nested_struct8.c, +- testsuite/libffi.call/nested_struct9.c, +- testsuite/libffi.call/problem1.c, +- testsuite/libffi.call/return_ldl.c, +- testsuite/libffi.call/return_ll1.c, +- testsuite/libffi.call/stret_large.c, +- testsuite/libffi.call/stret_large2.c, +- testsuite/libffi.call/stret_medium.c, +- testsuite/libffi.call/stret_medium2.c, +- testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead +- of checking for MMAP. Use intptr_t instead of long casts. +- +-2009-06-11 Kaz Kojima +- +- * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. +- * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. +- * testsuite/libffi.call/err_bad_typedef.c: Likewise. +- +-2009-06-09 Andrew Haley +- +- * src/x86/freebsd.S: Add missing file. +- +-2009-06-08 Andrew Haley +- +- Import from libffi 3.0.8: +- +- * doc/libffi.texi: New file. +- * doc/libffi.info: Likewise. +- * doc/stamp-vti: Likewise. +- * man/Makefile.am: New file. +- * man/ffi_call.3: New file. +- +- * Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S, +- src/dlmalloc.c. +- (nodist_libffi_la_SOURCES): Add X86_FREEBSD. +- +- * configure.ac: Bump version to 3.0.8. +- parisc*-*-linux*: Add. +- i386-*-freebsd* | i386-*-openbsd*: Add. +- powerpc-*-beos*: Add. +- AM_CONDITIONAL X86_FREEBSD: Add. +- AC_CONFIG_FILES: Add man/Makefile. +- +- * include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void). +- +-2009-06-08 Andrew Haley +- +- * README: Import from libffi 3.0.8. +- +-2009-06-08 Andrew Haley +- +- * testsuite/libffi.call/err_bad_abi.c: Add xfails. +- * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. +- * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. +- * testsuite/libffi.call/err_bad_typedef.c: Add xfails. +- +- * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. +- * testsuite/libffi.call/stret_medium.c: Likewise. +- * testsuite/libffi.call/stret_large2.c: Likewise. +- * testsuite/libffi.call/stret_large.c: Likewise. +- +-2008-12-26 Timothy Wall +- +- * testsuite/libffi.call/cls_longdouble.c, +- testsuite/libffi.call/cls_longdouble_va.c, +- testsuite/libffi.call/cls_align_longdouble.c, +- testsuite/libffi.call/cls_align_longdouble_split.c, +- testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected +- failures on x86_64 cygwin/mingw. +- +-2008-12-22 Timothy Wall +- +- * testsuite/libffi.call/closure_fn0.c, +- testsuite/libffi.call/closure_fn1.c, +- testsuite/libffi.call/closure_fn2.c, +- testsuite/libffi.call/closure_fn3.c, +- testsuite/libffi.call/closure_fn4.c, +- testsuite/libffi.call/closure_fn5.c, +- testsuite/libffi.call/closure_fn6.c, +- testsuite/libffi.call/closure_loc_fn0.c, +- testsuite/libffi.call/closure_stdcall.c, +- testsuite/libffi.call/cls_align_pointer.c, +- testsuite/libffi.call/cls_pointer.c, +- testsuite/libffi.call/cls_pointer_stack.c: use portable cast from +- pointer to integer (intptr_t). +- * testsuite/libffi.call/cls_longdouble.c: disable for win64. +- +-2008-07-24 Anthony Green +- +- * testsuite/libffi.call/cls_dbls_struct.c, +- testsuite/libffi.call/cls_double_va.c, +- testsuite/libffi.call/cls_longdouble.c, +- testsuite/libffi.call/cls_longdouble_va.c, +- testsuite/libffi.call/cls_pointer.c, +- testsuite/libffi.call/cls_pointer_stack.c, +- testsuite/libffi.call/err_bad_abi.c: Clean up failures from +- compiler warnings. +- +-2008-03-04 Anthony Green +- Blake Chaffin +- hos@tamanegi.org +- +- * testsuite/libffi.call/cls_align_longdouble_split2.c +- testsuite/libffi.call/cls_align_longdouble_split.c +- testsuite/libffi.call/cls_dbls_struct.c +- testsuite/libffi.call/cls_double_va.c +- testsuite/libffi.call/cls_longdouble.c +- testsuite/libffi.call/cls_longdouble_va.c +- testsuite/libffi.call/cls_pointer.c +- testsuite/libffi.call/cls_pointer_stack.c +- testsuite/libffi.call/err_bad_abi.c +- testsuite/libffi.call/err_bad_typedef.c +- testsuite/libffi.call/stret_large2.c +- testsuite/libffi.call/stret_large.c +- testsuite/libffi.call/stret_medium2.c +- testsuite/libffi.call/stret_medium.c: New tests from Apple. +- +-2009-06-05 Andrew Haley +- +- * src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from +- libffi. +- +-2009-06-04 Andrew Haley +- +- * src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out +- stdcall changes. +- +-2008-02-26 Anthony Green +- Thomas Heller +- +- * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C +- comment. +- +-2008-02-03 Timothy Wall +- +- * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return +- offset based on code pointer, not data pointer. +- +-2008-01-31 Timothy Wall +- +- * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall +- closures. +- * src/x86/ffitarget.h: Increase size of trampoline for stdcall +- closures. +- * src/x86/win32.S: Add assembly for stdcall closure. +- * src/x86/ffi.c: Initialize stdcall closure trampoline. +- +-2009-06-04 Andrew Haley +- +- * include/ffi.h.in: Change void (*)() to void (*)(void). +- * src/x86/ffi.c: Likewise. +- +-2009-06-04 Andrew Haley +- +- * src/powerpc/ppc_closure.S: Insert licence header. +- * src/powerpc/linux64_closure.S: Likewise. +- * src/m68k/sysv.S: Likewise. +- +- * src/sh64/ffi.c: Change void (*)() to void (*)(void). +- * src/powerpc/ffi.c: Likewise. +- * src/powerpc/ffi_darwin.c: Likewise. +- * src/m32r/ffi.c: Likewise. +- * src/sh64/ffi.c: Likewise. +- * src/x86/ffi64.c: Likewise. +- * src/alpha/ffi.c: Likewise. +- * src/alpha/osf.S: Likewise. +- * src/frv/ffi.c: Likewise. +- * src/s390/ffi.c: Likewise. +- * src/pa/ffi.c: Likewise. +- * src/pa/hpux32.S: Likewise. +- * src/ia64/unix.S: Likewise. +- * src/ia64/ffi.c: Likewise. +- * src/sparc/ffi.c: Likewise. +- * src/mips/ffi.c: Likewise. +- * src/sh/ffi.c: Likewise. +- +-2008-02-15 David Daney +- +- * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): +- Define (conditionally), and use it to include cachectl.h. +- (ffi_prep_closure_loc): Fix cache flushing. +- * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. +- +-2009-06-04 Andrew Haley +- +- include/ffi.h.in, +- src/arm/ffitarget.h, +- src/arm/ffi.c, +- src/arm/sysv.S, +- src/powerpc/ffitarget.h, +- src/closures.c, +- src/sh64/ffitarget.h, +- src/sh64/ffi.c, +- src/sh64/sysv.S, +- src/types.c, +- src/x86/ffi64.c, +- src/x86/ffitarget.h, +- src/x86/win32.S, +- src/x86/darwin.S, +- src/x86/ffi.c, +- src/x86/sysv.S, +- src/x86/unix64.S, +- src/alpha/ffitarget.h, +- src/alpha/ffi.c, +- src/alpha/osf.S, +- src/m68k/ffitarget.h, +- src/frv/ffitarget.h, +- src/frv/ffi.c, +- src/s390/ffitarget.h, +- src/s390/sysv.S, +- src/cris/ffitarget.h, +- src/pa/linux.S, +- src/pa/ffitarget.h, +- src/pa/ffi.c, +- src/raw_api.c, +- src/ia64/ffitarget.h, +- src/ia64/unix.S, +- src/ia64/ffi.c, +- src/ia64/ia64_flags.h, +- src/java_raw_api.c, +- src/debug.c, +- src/sparc/v9.S, +- src/sparc/ffitarget.h, +- src/sparc/ffi.c, +- src/sparc/v8.S, +- src/mips/ffitarget.h, +- src/mips/n32.S, +- src/mips/o32.S, +- src/mips/ffi.c, +- src/prep_cif.c, +- src/sh/ffitarget.h, +- src/sh/ffi.c, +- src/sh/sysv.S: Update license text. +- +-2009-05-22 Dave Korn +- +- * src/x86/win32.S (_ffi_closure_STDCALL): New function. +- (.eh_frame): Add FDE for it. +- +-2009-05-22 Dave Korn +- +- * configure.ac: Also check if assembler supports pc-relative +- relocs on X86_WIN32 targets. +- * configure: Regenerate. +- * src/x86/win32.S (ffi_prep_args): Declare extern, not global. +- (_ffi_call_SYSV): Add missing function type symbol .def and +- add EH markup labels. +- (_ffi_call_STDCALL): Likewise. +- (_ffi_closure_SYSV): Likewise. +- (_ffi_closure_raw_SYSV): Likewise. +- (.eh_frame): Add hand-crafted EH data. +- +-2009-04-09 Jakub Jelinek +- +- * testsuite/lib/libffi-dg.exp: Change copyright header to refer to +- version 3 of the GNU General Public License and to point readers +- at the COPYING3 file and the FSF's license web page. +- * testsuite/libffi.call/call.exp: Likewise. +- * testsuite/libffi.special/special.exp: Likewise. +- +-2009-03-01 Ralf Wildenhues +- +- * configure: Regenerate. +- +-2008-12-18 Rainer Orth +- +- PR libffi/26048 +- * configure.ac (HAVE_AS_X86_PCREL): New test. +- * configure: Regenerate. +- * fficonfig.h.in: Regenerate. +- * src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate +- RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET, +- RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler. +- (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. +- * src/x86/unix64.S (.Lstore_table): Move to .text section. +- (.Lload_table): Likewise. +- (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. +- +-2008-12-18 Ralf Wildenhues +- +- * configure: Regenerate. +- +-2008-11-21 Eric Botcazou +- +- * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for +- signed/unsigned int8/16 return values. +- * src/sparc/v8.S (ffi_call_v8): Likewise. +- (ffi_closure_v8): Likewise. +- +-2008-09-26 Peter O'Gorman +- Steve Ellcey +- +- * configure: Regenerate for new libtool. +- * Makefile.in: Ditto. +- * include/Makefile.in: Ditto. +- * aclocal.m4: Ditto. +- +-2008-08-25 Andreas Tobler +- +- * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and +- FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. +- Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. +- Adjust copyright notice. +- * src/powerpc/ffi.c: Add two new flags to indicate if we have one +- register or two register to use for FFI_SYSV structs. +- (ffi_prep_cif_machdep): Pass the right register flag introduced above. +- (ffi_closure_helper_SYSV): Fix the return type for +- FFI_SYSV_TYPE_SMALL_STRUCT. Comment. +- Adjust copyright notice. +- +-2008-07-16 Kaz Kojima +- +- * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned +- int. +- +-2008-06-17 Ralf Wildenhues +- +- * configure: Regenerate. +- * include/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- +-2008-06-07 Joseph Myers +- +- * configure.ac (parisc*-*-linux*, powerpc-*-sysv*, +- powerpc-*-beos*): Remove. +- * configure: Regenerate. +- +-2008-05-09 Julian Brown +- +- * Makefile.am (LTLDFLAGS): New. +- (libffi_la_LDFLAGS): Use above. +- * Makefile.in: Regenerate. +- +-2008-04-18 Paolo Bonzini +- +- PR bootstrap/35457 +- * aclocal.m4: Regenerate. +- * configure: Regenerate. +- +-2008-03-26 Kaz Kojima +- +- * src/sh/sysv.S: Add .note.GNU-stack on Linux. +- * src/sh64/sysv.S: Likewise. +- +-2008-03-26 Daniel Jacobowitz +- +- * src/arm/sysv.S: Fix ARM comment marker. +- +-2008-03-26 Jakub Jelinek +- +- * src/alpha/osf.S: Add .note.GNU-stack on Linux. +- * src/s390/sysv.S: Likewise. +- * src/powerpc/ppc_closure.S: Likewise. +- * src/powerpc/sysv.S: Likewise. +- * src/x86/unix64.S: Likewise. +- * src/x86/sysv.S: Likewise. +- * src/sparc/v8.S: Likewise. +- * src/sparc/v9.S: Likewise. +- * src/m68k/sysv.S: Likewise. +- * src/arm/sysv.S: Likewise. +- +-2008-03-16 Ralf Wildenhues +- +- * aclocal.m4: Regenerate. +- * configure: Likewise. +- * Makefile.in: Likewise. +- * include/Makefile.in: Likewise. +- * testsuite/Makefile.in: Likewise. +- +-2008-02-12 Bjoern Koenig +- Andreas Tobler +- +- * configure.ac: Add amd64-*-freebsd* target. +- * configure: Regenerate. +- +-2008-01-30 H.J. Lu +- +- PR libffi/34612 +- * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when +- returning struct. +- +- * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" +- tests. +- +-2008-01-24 David Edelsohn +- +- * configure: Regenerate. +- +-2008-01-06 Andreas Tobler +- +- * src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko. +- +-2008-01-05 Andreas Tobler +- +- PR testsuite/32843 +- * src/x86/ffi.c (ffi_prep_cif_machdep): Add code for +- signed/unsigned int8/16 for X86_DARWIN. +- Updated copyright info. +- Handle one and two byte structs with special cif->flags. +- * src/x86/ffitarget.h: Add special types for one and two byte structs. +- Updated copyright info. +- * src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like +- sysv.S +- Remove code to pop args from the stack after call. +- Special-case signed/unsigned for int8/16, one and two byte structs. +- (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, +- FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, +- FFI_TYPE_SINT32. +- Updated copyright info. +- +-2007-12-08 David Daney +- +- * src/mips/n32.S (ffi_call_N32): Replace dadd with ADDU, dsub with +- SUBU, add with ADDU and use smaller code sequences. +- +-2007-12-07 David Daney +- +- * src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return +- type. +- +-2007-12-06 David Daney +- +- * include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not already +- defined. +- (ffi_java_raw): New typedef. +- (ffi_java_raw_call, ffi_java_ptrarray_to_raw, +- ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to +- ffi_java_raw. +- (ffi_java_raw_closure) : Same. +- (ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change +- parameter types. +- * src/java_raw_api.c (ffi_java_raw_size): Replace FFI_SIZEOF_ARG with +- FFI_SIZEOF_JAVA_RAW. +- (ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw. +- Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use +- sizeof(ffi_java_raw) for alignment calculations. +- (ffi_java_ptrarray_to_raw): Same. +- (ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER +- if FFI_SIZEOF_JAVA_RAW == 4. +- (ffi_java_raw_to_rvalue): Same. +- (ffi_java_raw_call): Change type of raw to ffi_java_raw. +- (ffi_java_translate_args): Same. +- (ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change +- parameter types. +- * src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI. +- +-2007-12-06 David Daney +- +- * src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on +- pointer values. +- +-2007-12-01 Andreas Tobler +- +- PR libffi/31937 +- * src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT. +- Add local FFI_TYPE_UINT128 to handle soft-float long-double-128. +- * src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and +- set the NUM_FPR_ARG_REGISTERS according to. +- Add support for potential soft-float support under hard-float +- architecture. +- (ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of +- FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according +- to the FFI_LINUX_SOFT_FLOAT ABI. +- (ffi_prep_cif_machdep): Likewise. +- (ffi_closure_helper_SYSV): Likewise. +- * src/powerpc/ppc_closure.S: Make sure not to store float/double +- on archs where __NO_FPRS__ is true. +- Add FFI_TYPE_UINT128 support. +- * src/powerpc/sysv.S: Add support for soft-float long-double-128. +- Adjust copyright notice. +- +-2007-11-25 Andreas Tobler +- +- * src/closures.c: Move defintion of MAYBE_UNUSED from here to ... +- * include/ffi_common.h: ... here. +- Update copyright. +- +-2007-11-17 Andreas Tobler +- +- * src/powerpc/sysv.S: Load correct cr to compare if we have long double. +- * src/powerpc/linux64.S: Likewise. +- * src/powerpc/ffi.c: Add a comment to show which part goes into cr6. +- * testsuite/libffi.call/return_ldl.c: New test. +- +-2007-09-04 +- +- * src/arm/sysv.S (UNWIND): New. +- (Whole file): Conditionally compile unwinder directives. +- * src/arm/sysv.S: Add unwinder directives. +- +- * src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes. +- Only treat r0 as a struct address if we're actually returning a +- struct by address. +- Only copy the bytes that are actually within a struct. +- (ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes +- is returned in r0, not passed by address. +- (ffi_call): Allocate a word-sized temporary for the case where +- a composite is returned in r0. +- (ffi_prep_incoming_args_SYSV): Align as necessary. +- +-2007-08-05 Steven Newbury +- +- * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of +- directly using the sys_cacheflush syscall. +- +-2007-07-27 Andrew Haley +- +- * src/arm/sysv.S (ffi_closure_SYSV): Add soft-float. +- +-2007-09-03 Maciej W. Rozycki +- +- * Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS. +- * configure.ac: Likewise. +- * Makefile.in: Regenerate. +- * include/Makefile.in: Likewise. +- * testsuite/Makefile.in: Likewise. +- * configure: Likewise. +- +-2007-08-24 David Daney +- +- * testsuite/libffi.call/return_sl.c: New test. +- +-2007-08-10 David Daney +- +- * testsuite/libffi.call/cls_multi_ushort.c, +- testsuite/libffi.call/cls_align_uint16.c, +- testsuite/libffi.call/nested_struct1.c, +- testsuite/libffi.call/nested_struct3.c, +- testsuite/libffi.call/cls_7_1_byte.c, +- testsuite/libffi.call/nested_struct5.c, +- testsuite/libffi.call/cls_double.c, +- testsuite/libffi.call/nested_struct7.c, +- testsuite/libffi.call/cls_sint.c, +- testsuite/libffi.call/nested_struct9.c, +- testsuite/libffi.call/cls_20byte1.c, +- testsuite/libffi.call/cls_multi_sshortchar.c, +- testsuite/libffi.call/cls_align_sint64.c, +- testsuite/libffi.call/cls_3byte2.c, +- testsuite/libffi.call/cls_multi_schar.c, +- testsuite/libffi.call/cls_multi_uchar.c, +- testsuite/libffi.call/cls_19byte.c, +- testsuite/libffi.call/cls_9byte1.c, +- testsuite/libffi.call/cls_align_float.c, +- testsuite/libffi.call/closure_fn1.c, +- testsuite/libffi.call/problem1.c, +- testsuite/libffi.call/closure_fn3.c, +- testsuite/libffi.call/cls_sshort.c, +- testsuite/libffi.call/closure_fn5.c, +- testsuite/libffi.call/cls_align_double.c, +- testsuite/libffi.call/nested_struct.c, +- testsuite/libffi.call/cls_2byte.c, +- testsuite/libffi.call/nested_struct10.c, +- testsuite/libffi.call/cls_4byte.c, +- testsuite/libffi.call/cls_6byte.c, +- testsuite/libffi.call/cls_8byte.c, +- testsuite/libffi.call/cls_multi_sshort.c, +- testsuite/libffi.call/cls_align_sint16.c, +- testsuite/libffi.call/cls_align_uint32.c, +- testsuite/libffi.call/cls_20byte.c, +- testsuite/libffi.call/cls_float.c, +- testsuite/libffi.call/nested_struct2.c, +- testsuite/libffi.call/cls_5_1_byte.c, +- testsuite/libffi.call/nested_struct4.c, +- testsuite/libffi.call/cls_24byte.c, +- testsuite/libffi.call/nested_struct6.c, +- testsuite/libffi.call/cls_64byte.c, +- testsuite/libffi.call/nested_struct8.c, +- testsuite/libffi.call/cls_uint.c, +- testsuite/libffi.call/cls_multi_ushortchar.c, +- testsuite/libffi.call/cls_schar.c, +- testsuite/libffi.call/cls_uchar.c, +- testsuite/libffi.call/cls_align_uint64.c, +- testsuite/libffi.call/cls_ulonglong.c, +- testsuite/libffi.call/cls_align_longdouble.c, +- testsuite/libffi.call/cls_1_1byte.c, +- testsuite/libffi.call/cls_12byte.c, +- testsuite/libffi.call/cls_3_1byte.c, +- testsuite/libffi.call/cls_3byte1.c, +- testsuite/libffi.call/cls_4_1byte.c, +- testsuite/libffi.call/cls_6_1_byte.c, +- testsuite/libffi.call/cls_16byte.c, +- testsuite/libffi.call/cls_18byte.c, +- testsuite/libffi.call/closure_fn0.c, +- testsuite/libffi.call/cls_9byte2.c, +- testsuite/libffi.call/closure_fn2.c, +- testsuite/libffi.call/closure_fn4.c, +- testsuite/libffi.call/cls_ushort.c, +- testsuite/libffi.call/closure_fn6.c, +- testsuite/libffi.call/cls_5byte.c, +- testsuite/libffi.call/cls_align_pointer.c, +- testsuite/libffi.call/cls_7byte.c, +- testsuite/libffi.call/cls_align_sint32.c, +- testsuite/libffi.special/unwindtest_ffi_call.cc, +- testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*. +- +-2007-08-10 David Daney +- +- PR libffi/28313 +- * configure.ac: Don't treat mips64 as a special case. +- * Makefile.am (nodist_libffi_la_SOURCES): Add n32.S. +- * configure: Regenerate +- * Makefile.in: Ditto. +- * fficonfig.h.in: Ditto. +- * src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent. +- (LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros. +- (FFI_DEFAULT_ABI): Set for n64 case. +- (FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases. +- * src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE. +- (ffi_closure_N32): New function. +- (.eh_frame): New section +- * src/mips/o32.S: Clean up comments. +- (ffi_closure_O32): Pass ffi_closure parameter in $12. +- * src/mips/ffi.c: Use FFI_MIPS_N32 instead of +- _MIPS_SIM == _ABIN32 throughout. +- (FFI_MIPS_STOP_HERE): New, use in place of +- ffi_stop_here. +- (ffi_prep_args): Use unsigned long to hold pointer values. Rewrite +- to support n32/n64 ABIs. +- (calc_n32_struct_flags): Rewrite. +- (calc_n32_return_struct_flags): Remove unused variable. Reverse +- position of flag bits. +- (ffi_prep_cif_machdep): Rewrite n32 portion. +- (ffi_call): Enable for n64. Add special handling for small structure +- return values. +- (ffi_prep_closure_loc): Add n32 and n64 support. +- (ffi_closure_mips_inner_O32): Add cast to silence warning. +- (copy_struct_N32, ffi_closure_mips_inner_N32): New functions. +- +-2007-08-08 David Daney +- +- * testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition. +- * testsuite/libffi.call/cls_align_uint16.c (main): Use correct type +- specifiers. +- * testsuite/libffi.call/nested_struct1.c (main): Ditto. +- * testsuite/libffi.call/cls_sint.c (main): Ditto. +- * testsuite/libffi.call/nested_struct9.c (main): Ditto. +- * testsuite/libffi.call/cls_20byte1.c (main): Ditto. +- * testsuite/libffi.call/cls_9byte1.c (main): Ditto. +- * testsuite/libffi.call/closure_fn1.c (main): Ditto. +- * testsuite/libffi.call/closure_fn3.c (main): Ditto. +- * testsuite/libffi.call/return_dbl2.c (main): Ditto. +- * testsuite/libffi.call/cls_sshort.c (main): Ditto. +- * testsuite/libffi.call/return_fl3.c (main): Ditto. +- * testsuite/libffi.call/closure_fn5.c (main): Ditto. +- * testsuite/libffi.call/nested_struct.c (main): Ditto. +- * testsuite/libffi.call/nested_struct10.c (main): Ditto. +- * testsuite/libffi.call/return_ll1.c (main): Ditto. +- * testsuite/libffi.call/cls_8byte.c (main): Ditto. +- * testsuite/libffi.call/cls_align_uint32.c (main): Ditto. +- * testsuite/libffi.call/cls_align_sint16.c (main): Ditto. +- * testsuite/libffi.call/cls_20byte.c (main): Ditto. +- * testsuite/libffi.call/nested_struct2.c (main): Ditto. +- * testsuite/libffi.call/cls_24byte.c (main): Ditto. +- * testsuite/libffi.call/nested_struct6.c (main): Ditto. +- * testsuite/libffi.call/cls_uint.c (main): Ditto. +- * testsuite/libffi.call/cls_12byte.c (main): Ditto. +- * testsuite/libffi.call/cls_16byte.c (main): Ditto. +- * testsuite/libffi.call/closure_fn0.c (main): Ditto. +- * testsuite/libffi.call/cls_9byte2.c (main): Ditto. +- * testsuite/libffi.call/closure_fn2.c (main): Ditto. +- * testsuite/libffi.call/return_dbl1.c (main): Ditto. +- * testsuite/libffi.call/closure_fn4.c (main): Ditto. +- * testsuite/libffi.call/closure_fn6.c (main): Ditto. +- * testsuite/libffi.call/cls_align_sint32.c (main): Ditto. +- +-2007-08-07 Andrew Haley +- +- * src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous +- checkin. +- +-2007-08-06 Andrew Haley +- +- PR testsuite/32843 +- * src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, +- FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, +- FFI_TYPE_SINT32. +- +-2007-08-02 David Daney +- +- * testsuite/libffi.call/return_ul.c (main): Define return type as +- ffi_arg. Use proper printf conversion specifier. +- +-2007-07-30 Andrew Haley +- +- PR testsuite/32843 +- * src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for +- signed/unsigned int8/16. +- * src/x86/sysv.S (ffi_call_SYSV): Rewrite to: +- Use a jump table. +- Remove code to pop args from the stack after call. +- Special-case signed/unsigned int8/16. +- * testsuite/libffi.call/return_sc.c (main): Revert. +- +-2007-07-26 Richard Guenther +- +- PR testsuite/32843 +- * testsuite/libffi.call/return_sc.c (main): Verify call +- result as signed char, not ffi_arg. +- +-2007-07-16 Rainer Orth +- +- * configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64. +- * configure: Regenerate. +- +-2007-07-11 David Daney +- +- * src/mips/ffi.c: Don't include sys/cachectl.h. +- (ffi_prep_closure_loc): Use __builtin___clear_cache() instead of +- cacheflush(). +- +-2007-05-18 Aurelien Jarno +- +- * src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted +- from (ffi_prep_closure): ... this. +- (FFI_INIT_TRAMPOLINE): Adjust. +- +-2005-12-31 Phil Blundell +- +- * src/arm/ffi.c (ffi_prep_incoming_args_SYSV, +- ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support. +- * src/arm/sysv.S(ffi_closure_SYSV): Likewise. +- * src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. +- (FFI_CLOSURES): Enable closure support. +- +-2007-07-03 Andrew Haley +- +- * testsuite/libffi.call/cls_multi_ushort.c, +- testsuite/libffi.call/cls_align_uint16.c, +- testsuite/libffi.call/nested_struct1.c, +- testsuite/libffi.call/nested_struct3.c, +- testsuite/libffi.call/cls_7_1_byte.c, +- testsuite/libffi.call/cls_double.c, +- testsuite/libffi.call/nested_struct5.c, +- testsuite/libffi.call/nested_struct7.c, +- testsuite/libffi.call/cls_sint.c, +- testsuite/libffi.call/nested_struct9.c, +- testsuite/libffi.call/cls_20byte1.c, +- testsuite/libffi.call/cls_multi_sshortchar.c, +- testsuite/libffi.call/cls_align_sint64.c, +- testsuite/libffi.call/cls_3byte2.c, +- testsuite/libffi.call/cls_multi_schar.c, +- testsuite/libffi.call/cls_multi_uchar.c, +- testsuite/libffi.call/cls_19byte.c, +- testsuite/libffi.call/cls_9byte1.c, +- testsuite/libffi.call/cls_align_float.c, +- testsuite/libffi.call/closure_fn1.c, +- testsuite/libffi.call/problem1.c, +- testsuite/libffi.call/closure_fn3.c, +- testsuite/libffi.call/cls_sshort.c, +- testsuite/libffi.call/closure_fn5.c, +- testsuite/libffi.call/cls_align_double.c, +- testsuite/libffi.call/cls_2byte.c, +- testsuite/libffi.call/nested_struct.c, +- testsuite/libffi.call/nested_struct10.c, +- testsuite/libffi.call/cls_4byte.c, +- testsuite/libffi.call/cls_6byte.c, +- testsuite/libffi.call/cls_8byte.c, +- testsuite/libffi.call/cls_multi_sshort.c, +- testsuite/libffi.call/cls_align_uint32.c, +- testsuite/libffi.call/cls_align_sint16.c, +- testsuite/libffi.call/cls_float.c, +- testsuite/libffi.call/cls_20byte.c, +- testsuite/libffi.call/cls_5_1_byte.c, +- testsuite/libffi.call/nested_struct2.c, +- testsuite/libffi.call/cls_24byte.c, +- testsuite/libffi.call/nested_struct4.c, +- testsuite/libffi.call/nested_struct6.c, +- testsuite/libffi.call/cls_64byte.c, +- testsuite/libffi.call/nested_struct8.c, +- testsuite/libffi.call/cls_uint.c, +- testsuite/libffi.call/cls_multi_ushortchar.c, +- testsuite/libffi.call/cls_schar.c, +- testsuite/libffi.call/cls_uchar.c, +- testsuite/libffi.call/cls_align_uint64.c, +- testsuite/libffi.call/cls_ulonglong.c, +- testsuite/libffi.call/cls_align_longdouble.c, +- testsuite/libffi.call/cls_1_1byte.c, +- testsuite/libffi.call/cls_12byte.c, +- testsuite/libffi.call/cls_3_1byte.c, +- testsuite/libffi.call/cls_3byte1.c, +- testsuite/libffi.call/cls_4_1byte.c, +- testsuite/libffi.call/cls_6_1_byte.c, +- testsuite/libffi.call/cls_16byte.c, +- testsuite/libffi.call/cls_18byte.c, +- testsuite/libffi.call/closure_fn0.c, +- testsuite/libffi.call/cls_9byte2.c, +- testsuite/libffi.call/closure_fn2.c, +- testsuite/libffi.call/closure_fn4.c, +- testsuite/libffi.call/cls_ushort.c, +- testsuite/libffi.call/closure_fn6.c, +- testsuite/libffi.call/cls_5byte.c, +- testsuite/libffi.call/cls_align_pointer.c, +- testsuite/libffi.call/cls_7byte.c, +- testsuite/libffi.call/cls_align_sint32.c, +- testsuite/libffi.special/unwindtest_ffi_call.cc, +- testsuite/libffi.special/unwindtest.cc: Enable for ARM. +- +-2007-07-05 H.J. Lu +- +- * aclocal.m4: Regenerated. +- +-2007-06-02 Paolo Bonzini +- +- * configure: Regenerate. +- +-2007-05-23 Steve Ellcey +- +- * Makefile.in: Regenerate. +- * configure: Regenerate. +- * aclocal.m4: Regenerate. +- * include/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- +-2007-05-10 Roman Zippel +- +- * src/m68k/ffi.c (ffi_prep_incoming_args_SYSV, +- ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support. +- * src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise. +- * src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. +- (FFI_CLOSURES): Enable closure support. +- +-2007-05-10 Roman Zippel +- +- * configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test. +- * configure: Regenerate. +- * fficonfig.h.in: Regenerate. +- * src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC, +- CFI_OFFSET,CFI_DEF_CFA): New macros. +- (ffi_call_SYSV): Add callframe annotation. +- +-2007-05-10 Roman Zippel +- +- * src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix +- numerous test suite failures. +- * src/m68k/sysv.S (ffi_call_SYSV): Likewise. +- +-2007-04-11 Paolo Bonzini +- +- * Makefile.am (EXTRA_DIST): Bring up to date. +- * Makefile.in: Regenerate. +- * src/frv/eabi.S: Remove RCS keyword. +- +-2007-04-06 Richard Henderson +- +- * configure.ac: Tidy target case. +- (HAVE_LONG_DOUBLE): Allow the target to override. +- * configure: Regenerate. +- * include/ffi.h.in: Don't define ffi_type_foo if +- LIBFFI_HIDE_BASIC_TYPES is defined. +- (ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define +- to ffi_type_double. +- * types.c (LIBFFI_HIDE_BASIC_TYPES): Define. +- (FFI_TYPEDEF, ffi_type_void): Mark the data const. +- (ffi_type_longdouble): Special case for Alpha. Don't define +- if long double == double. +- +- * src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value. +- (ffi_prep_cif_machdep): Handle it as the 128-bit type. +- (ffi_call, ffi_closure_osf_inner): Likewise. +- (ffi_closure_osf_inner): Likewise. Mark hidden. +- (ffi_call_osf, ffi_closure_osf): Mark hidden. +- * src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition. +- * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden. +- (load_table): Handle 128-bit long double. +- +- * testsuite/libffi.call/float4.c: Add -mieee for alpha. +- +-2007-04-06 Tom Tromey +- +- PR libffi/31491: +- * README: Fixed bug in example. +- +-2007-04-03 Jakub Jelinek +- +- * src/closures.c: Include sys/statfs.h. +- (_GNU_SOURCE): Define on Linux. +- (FFI_MMAP_EXEC_SELINUX): Define. +- (selinux_enabled): New variable. +- (selinux_enabled_check): New function. +- (is_selinux_enabled): Define. +- (dlmmap): Use it. +- +-2007-03-24 Uros Bizjak +- +- * testsuite/libffi.call/return_fl2.c (return_fl): Mark as static. +- Use 'volatile float sum' to create sum of floats to avoid false +- negative due to excess precision on ix86 targets. +- (main): Ditto. +- +-2007-03-08 Alexandre Oliva +- +- * src/powerpc/ffi.c (flush_icache): Fix left-over from previous +- patch. +- (ffi_prep_closure_loc): Remove unneeded casts. Add needed ones. +- +-2007-03-07 Alexandre Oliva +- +- * include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New. +- (ffi_prep_closure_loc): New. +- (ffi_prep_raw_closure_loc): New. +- (ffi_prep_java_raw_closure_loc): New. +- * src/closures.c: New file. +- * src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment): +- Replace sflags with exec_offset. +- [FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset, +- sub_segment_exec_offset): New macros. +- (get_segment_flags, set_segment_flags, check_segment_merge): New +- macros. +- (is_mmapped_segment, is_extern_segment): Use get_segment_flags. +- (add_segment, sys_alloc, create_mspace, create_mspace_with_base, +- destroy_mspace): Use new macros. +- (sys_alloc): Silence warning. +- * Makefile.am (libffi_la_SOURCES): Add src/closures.c. +- * Makefile.in: Rebuilt. +- * src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in +- terms of ffi_prep_closure_loc. +- * src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted +- from... +- (ffi_prep_raw_closure): ... this. Re-implement in terms of the +- renamed version. +- * src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and +- adjusted from... +- (ffi_prep_java_raw_closure): ... this. Re-implement in terms of +- the renamed version. +- * src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from +- (ffi_prep_closure): ... this. +- * src/pa/ffi.c: Likewise. +- * src/cris/ffi.c: Likewise. Adjust. +- * src/frv/ffi.c: Likewise. +- * src/ia64/ffi.c: Likewise. +- * src/mips/ffi.c: Likewise. +- * src/powerpc/ffi_darwin.c: Likewise. +- * src/s390/ffi.c: Likewise. +- * src/sh/ffi.c: Likewise. +- * src/sh64/ffi.c: Likewise. +- * src/sparc/ffi.c: Likewise. +- * src/x86/ffi64.c: Likewise. +- * src/x86/ffi.c: Likewise. +- (FFI_INIT_TRAMPOLINE): Adjust. +- (ffi_prep_raw_closure_loc): Renamed and adjusted from... +- (ffi_prep_raw_closure): ... this. +- * src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from +- (ffi_prep_closure): ... this. +- (flush_icache): Adjust. +- +-2007-03-07 Alexandre Oliva +- +- * src/dlmalloc.c: New file, imported version 2.8.3 of Doug +- Lea's malloc. +- +-2007-03-01 Brooks Moses +- +- * Makefile.am: Add dummy install-pdf target. +- * Makefile.in: Regenerate +- +-2007-02-13 Andreas Krebbel +- +- * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, +- ffi_closure_helper_SYSV): Add long double handling. +- +-2007-02-02 Jakub Jelinek +- +- * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 +- immediately after bctrl instruction. +- +-2007-01-18 Alexandre Oliva +- +- * Makefile.am (all-recursive, install-recursive, +- mostlyclean-recursive, clean-recursive, distclean-recursive, +- maintainer-clean-recursive): Add missing targets. +- * Makefile.in: Rebuilt. +- +-2006-12-14 Andreas Tobler +- +- * configure.ac: Add TARGET for x86_64-*-darwin*. +- * Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources +- for X86_DARWIN. +- * src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*. +- * src/x86/darwin64.S: New file for x86_64-*-darwin* support. +- * configure: Regenerate. +- * Makefile.in: Regenerate. +- * include/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- * testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for +- ffi_call only. +- +-2006-12-13 Andreas Tobler +- +- * aclocal.m4: Regenerate with aclocal -I .. as written in the +- Makefile.am. +- +-2006-10-31 Geoffrey Keating +- +- * src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New. +- (ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for +- Darwin. +- * testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL. +- * testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL. +- +-2006-10-10 Paolo Bonzini +- Sandro Tolaini +- +- * configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and +- conditional. +- * configure: Regenerated. +- * Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case. +- (EXTRA_DIST): Add src/x86/darwin.S. +- * Makefile.in: Regenerated. +- * include/Makefile.in: Regenerated. +- * testsuite/Makefile.in: Regenerated. +- +- * src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like +- X86_WIN32, and additionally align stack to 16 bytes. +- * src/x86/darwin.S: New, based on sysv.S. +- * src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs. +- +-2006-09-12 David Daney +- +- PR libffi/23935 +- * include/Makefile.am: Install both ffi.h and ffitarget.h in +- $(libdir)/gcc/$(target_alias)/$(gcc_version)/include. +- * aclocal.m4: Regenerated for automake 1.9.6. +- * Makefile.in: Regenerated. +- * include/Makefile.in: Regenerated. +- * testsuite/Makefile.in: Regenerated. +- +-2006-08-17 Andreas Tobler +- +- * include/ffi_common.h (struct): Revert accidental commit. +- +-2006-08-15 Andreas Tobler +- +- * include/ffi_common.h: Remove lint directives. +- * include/ffi.h.in: Likewise. +- +-2006-07-25 Torsten Schoenfeld +- +- * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly +- for 32-bit architectures. +- * testsuite/libffi.call/return_ul.c: New test case. +- +-2006-07-19 David Daney +- +- * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips, +- xfail remains for mips64. +- +-2006-05-23 Carlos O'Donell +- +- * Makefile.am: Add install-html target. Add install-html to .PHONY +- * Makefile.in: Regenerate. +- * aclocal.m4: Regenerate. +- * include/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- +-2006-05-18 John David Anglin +- +- * pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from +- stack slot. +- +-2006-04-22 Andreas Tobler +- +- * README: Remove notice about 'Crazy Comments'. +- * src/debug.c: Remove lint directives. Cleanup white spaces. +- * src/java_raw_api.c: Likewise. +- * src/prep_cif.c: Likewise. +- * src/raw_api.c: Likewise. +- * src/ffitest.c: Delete. No longer needed, all test cases migrated +- to the testsuite. +- * src/arm/ffi.c: Remove lint directives. +- * src/m32r/ffi.c: Likewise. +- * src/pa/ffi.c: Likewise. +- * src/powerpc/ffi.c: Likewise. +- * src/powerpc/ffi_darwin.c: Likewise. +- * src/sh/ffi.c: Likewise. +- * src/sh64/ffi.c: Likewise. +- * src/x86/ffi.c: Likewise. +- * testsuite/libffi.call/float2.c: Likewise. +- * testsuite/libffi.call/promotion.c: Likewise. +- * testsuite/libffi.call/struct1.c: Likewise. +- +-2006-04-13 Andreas Tobler +- +- * src/pa/hpux32.S: Correct unwind offset calculation for +- ffi_closure_pa32. +- * src/pa/linux.S: Likewise. +- +-2006-04-12 James E Wilson +- +- PR libgcj/26483 +- * src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros. +- (hfa_type_load): Call stf_spill. +- (hfa_type_store): Call ldf_fill. +- (ffi_call): Adjust calls to above routines. Add local temps for +- macro result. +- +-2006-04-10 Matthias Klose +- +- * testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib +- directory names containing underscores. +- +-2006-04-07 James E Wilson +- +- * testsuite/libffi.call/float4.c: New testcase. +- +-2006-04-05 John David Anglin +- Andreas Tobler +- +- * Makefile.am: Add PA_HPUX port. +- * Makefile.in: Regenerate. +- * include/Makefile.in: Likewise. +- * testsuite/Makefile.in: Likewise. +- * configure.ac: Add PA_HPUX rules. +- * configure: Regenerate. +- * src/pa/ffitarget.h: Rename linux target to PA_LINUX. +- Add PA_HPUX and PA64_HPUX. +- Rename FFI_LINUX ABI to FFI_PA32 ABI. +- (FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets. +- (FFI_TYPE_SMALL_STRUCT2): Define. +- (FFI_TYPE_SMALL_STRUCT4): Likewise. +- (FFI_TYPE_SMALL_STRUCT8): Likewise. +- (FFI_TYPE_SMALL_STRUCT3): Redefine. +- (FFI_TYPE_SMALL_STRUCT5): Likewise. +- (FFI_TYPE_SMALL_STRUCT6): Likewise. +- (FFI_TYPE_SMALL_STRUCT7): Likewise. +- * src/pa/ffi.c (ROUND_DOWN): Delete. +- (fldw, fstw, fldd, fstd): Use '__asm__'. +- (ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2, +- FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. +- (ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment. +- Simplify incrementing of stack slot variable. Change type of local +- 'n' to unsigned int. +- (ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long +- double on PA_HPUX. +- (ffi_prep_cif_machdep): Likewise. +- (ffi_call): Likewise. +- (ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change +- return type to ffi_status. Simplify incrementing of stack slot +- variable. Only copy floating point argument registers when PA_LINUX +- is true. Reformat debug statement. +- Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and +- FFI_TYPE_SMALL_STRUCT8. +- (ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to +- declaration. +- (ffi_prep_closure): Make linux trampoline conditional on PA_LINUX. +- Add nops to cache flush. Add trampoline for PA_HPUX. +- * src/pa/hpux32.S: New file. +- * src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename +- ffi_prep_args_LINUX to ffi_prep_args_pa32. +- Localize labels. Add support for 2, 4 and 8-byte small structs. Handle +- unaligned destinations in 3, 5, 6 and 7-byte small structs. Order +- argument type checks so that common argument types appear first. +- (ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename +- ffi_closure_inner_LINUX to ffi_closure_inner_pa32. +- +-2006-03-24 Alan Modra +- +- * src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX. Default +- for 32-bit using IBM extended double format. Fix FFI_LAST_ABI. +- * src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of +- FFI_TYPE_LONGDOUBLE. +- (ffi_prep_args64): Assert using IBM extended double. +- (ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type. +- Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. +- (ffi_call): Handle FFI_LINUX. +- (ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs +- gpr3 return pointer as for struct return. Handle FFI_LINUX +- FFI_TYPE_LONGDOUBLE return and args. Don't increment "nf" +- unnecessarily. +- * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2 +- for FFI_TYPE_LONGDOUBLE. Move epilogue insns into case table. +- Don't use r6 as pointer to results, instead use sp offset. Don't +- make a special call to load lr with case table address, instead +- use offset from previous call. +- * src/powerpc/sysv.S (ffi_call_SYSV): Save long double return. +- * src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double +- return. +- +-2006-03-15 Kaz Kojima +- +- * src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments +- passed with FP registers correctly. +- (ffi_closure_helper_SYSV): Likewise. +- * src/sh64/sysv.S: Likewise. +- +-2006-03-01 Andreas Tobler +- +- * testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif, +- args and userdata unused. +- (closure_test_fn1): Mark cif and userdata unused. +- (main): Remove unused res. +- +-2006-02-28 Andreas Tobler +- +- * testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for +- -O2, -O3, -Os and the warning flags -W -Wall. +- * testsuite/libffi.special/special.exp: Likewise. +- * testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark +- unused parameter unused for gcc or else do nothing. +- * testsuite/libffi.special/ffitestcxx.h: Likewise. +- * testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif +- and userdata unused. +- * testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise. +- * testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise. +- * testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise. +- * testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise. +- * testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise. +- * testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise. +- * testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise. +- * testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise. +- * testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise. +- * testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise. +- * testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise. +- * testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise. +- * testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise. +- * testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise. +- * testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise. +- * testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise. +- * testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise. +- * testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise. +- * testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise. +- * testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise. +- * testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise. +- * testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise. +- * testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise. +- * testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast +- void* to avoid compiler warning. +- (main): Likewise. +- (cls_struct_align_gn): Mark cif and userdata unused. +- * testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn): +- Likewise. +- * testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise. +- * testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise. +- * testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and +- data unused. +- (main): Cast res_call to silence gcc. +- * testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and +- data unused. +- (main): Cast res_call to silence gcc. +- * testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif +- and data unused. +- (main): Cast res_call to silence gcc. +- * testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and +- data unused. +- (main): Cast res_call to silence gcc. +- * testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and +- data unused. +- (main): Cast res_call to silence gcc. +- * testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif +- and data unused. +- (main): Cast res_call to silence gcc. +- * testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and +- userdata unused. +- (cls_ret_schar_fn): Cast printf parameter to silence gcc. +- * testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and +- userdata unused. +- (cls_ret_sint_fn): Cast printf parameter to silence gcc. +- * testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and +- userdata unused. +- (cls_ret_sshort_fn): Cast printf parameter to silence gcc. +- * testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn): Mark cif and +- userdata unused. +- (cls_ret_uchar_fn): Cast printf parameter to silence gcc. +- * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and +- userdata unused. +- (cls_ret_uint_fn): Cast printf parameter to silence gcc. +- * testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif +- and userdata unused. +- * testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and +- userdata unused. +- (cls_ret_ushort_fn): Cast printf parameter to silence gcc. +- * testsuite/libffi.call/float.c (floating): Remove unused parameter e. +- * testsuite/libffi.call/float1.c (main): Remove unused variable i. +- Cleanup white spaces. +- * testsuite/libffi.call/negint.c (checking): Remove unused variable i. +- * testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark +- cif and userdata unused. +- * testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn): +- Likewise. +- * testsuite/libffi.call/nested_struct10.c (B_gn): Likewise. +- * testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf +- formatters to silence gcc. +- (B_gn): Mark cif and userdata unused. +- * testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata +- unused. +- * testsuite/libffi.call/nested_struct4.c: Mention related PR. +- (B_gn): Mark cif and userdata unused. +- * testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata +- unused. +- * testsuite/libffi.call/nested_struct6.c: Mention related PR. +- (B_gn): Mark cif and userdata unused. +- * testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata +- unused. +- * testsuite/libffi.call/nested_struct8.c (B_gn): Likewise. +- * testsuite/libffi.call/nested_struct9.c (B_gn): Likewise. +- * testsuite/libffi.call/problem1.c (stub): Likewise. +- * testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence +- gcc. +- * testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned +- in the last commit for this test case in the test case itself. +- * testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as +- unused. +- * testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise. +- * testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise. +- * testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise. +- * testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise. +- * testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise. +- * testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise. +- +-2006-02-22 Kaz Kojima +- +- * src/sh/sysv.S: Fix register numbers in the FDE for +- ffi_closure_SYSV. +- +-2006-02-20 Andreas Tobler +- +- * testsuite/libffi.call/return_fl2.c (return_fl): Remove static +- declaration to avoid a false negative on ix86. See PR323. +- +-2006-02-18 Kaz Kojima +- +- * src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable +- and cast integer to void * if needed. Update the pointer to +- the FP register saved area correctly. +- +-2006-02-17 Andreas Tobler +- +- * testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630 +- is fixed. +- * testsuite/libffi.call/nested_struct4.c: Likewise. +- +-2006-02-16 Andreas Tobler +- +- * testsuite/libffi.call/return_dbl.c: New test case. +- * testsuite/libffi.call/return_dbl1.c: Likewise. +- * testsuite/libffi.call/return_dbl2.c: Likewise. +- * testsuite/libffi.call/return_fl.c: Likewise. +- * testsuite/libffi.call/return_fl1.c: Likewise. +- * testsuite/libffi.call/return_fl2.c: Likewise. +- * testsuite/libffi.call/return_fl3.c: Likewise. +- * testsuite/libffi.call/closure_fn6.c: Likewise. +- +- * testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong +- definition. +- * testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition +- here to be used by other test cases too. +- +- * testsuite/libffi.call/nested_struct10.c: New test case. +- * testsuite/libffi.call/nested_struct9.c: Likewise. +- * testsuite/libffi.call/nested_struct8.c: Likewise. +- * testsuite/libffi.call/nested_struct7.c: Likewise. +- * testsuite/libffi.call/nested_struct6.c: Likewise. +- * testsuite/libffi.call/nested_struct5.c: Likewise. +- * testsuite/libffi.call/nested_struct4.c: Likewise. +- +-2006-01-21 Andreas Tobler +- +- * configure.ac: Enable libffi for sparc64-*-freebsd*. +- * configure: Rebuilt. +- +-2006-01-18 Jakub Jelinek +- +- * src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3, +- instead do the shifting inline. +- * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5 +- shift count unconditionally. Simplify load sequences for 1, 2, 3, 4 +- and 8 byte structs, for the remaining struct sizes don't call +- __lshrdi3, instead do the shifting inline. +- +-2005-12-07 Thiemo Seufer +- +- * src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add +- missing parentheses. +- * src/mips/o32.S (ffi_call_O32): Code formatting. Define +- and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations. +- (ffi_closure_O32): Likewise, but with newly defined A3_OFF2, +- A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2, +- V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2, +- FA_0_0_OFF2. +- * src/mips/ffi.c (ffi_prep_args): Code formatting. Fix +- endianness bugs. +- (ffi_prep_closure): Improve trampoline instruction scheduling. +- (ffi_closure_mips_inner_O32): Fix endianness bugs. +- +-2005-12-03 Alan Modra +- +- * src/powerpc/ffi.c: Formatting. +- (ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions. +- (ffi_prep_args64): Likewise. +- +-2005-09-30 Geoffrey Keating +- +- * testsuite/lib/libffi-dg.exp (libffi_target_compile): For +- darwin, use -shared-libgcc not -lgcc_s, and explain why. +- +-2005-09-26 Tom Tromey +- +- * testsuite/libffi.call/float1.c (value_type): New typedef. +- (CANARY): New define. +- (main): Check for result buffer overflow. +- * src/powerpc/linux64.S: Handle linux64 long double returns. +- * src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant. +- (ffi_prep_cif_machdep): Handle linux64 long double returns. +- +-2005-08-25 Alan Modra +- +- PR target/23404 +- * src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack +- homed fp args. +- (ffi_status ffi_prep_cif_machdep): Correct stack sizing for same. +- +-2005-08-11 Jakub Jelinek +- +- * configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test. +- (AH_BOTTOM): Add FFI_HIDDEN definition. +- * configure: Rebuilt. +- * fficonfig.h.in: Rebuilt. +- * src/powerpc/ffi.c (hidden): Remove. +- (ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64, +- ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden. +- * src/powerpc/linux64_closure.S (ffi_closure_LINUX64, +- .ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden. +- * src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove, +- add FFI_HIDDEN to its prototype. +- (ffi_closure_SYSV_inner): New. +- * src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. +- * src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. +- +-2005-08-10 Alfred M. Szmidt +- +- PR libffi/21819: +- * configure: Rebuilt. +- * configure.ac: Handle i*86-*-gnu*. +- +-2005-08-09 Jakub Jelinek +- +- * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use +- DW_CFA_offset_extended_sf rather than +- DW_CFA_GNU_negative_offset_extended. +- * src/powerpc/sysv.S (ffi_call_SYSV): Likewise. +- +-2005-07-22 SUGIOKA Toshinobu +- +- * src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly +- on sh3. +- (ffi_closure_SYSV): Change the stack layout for sh3 struct argument. +- * src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is +- partially on register. +- (ffi_closure_helper_SYSV): Likewise. +- (ffi_prep_cif_machdep): Don't set too many cif->flags. +- +-2005-07-20 Kaz Kojima +- +- * src/sh/ffi.c (ffi_call): Handle small structures correctly. +- Remove empty line. +- * src/sh64/ffi.c (simple_type): Remove. +- (return_type): Handle small structures correctly. +- (ffi_prep_args): Likewise. +- (ffi_call): Likewise. +- (ffi_closure_helper_SYSV): Likewise. +- * src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return. +- Emit position independent code if PIC and remove wrong datalabel +- prefixes from EH data. +- +-2005-07-19 Andreas Tobler +- +- * Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD. +- * Makefile.in: Regenerate. +- * include/Makefile.in: Likewise. +- * testsuite/Makefile.in: Likewise. +- * configure.ac: Add POWERPC_FREEBSD rules. +- * configure: Regenerate. +- * src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules. +- (FFI_SYSV_TYPE_SMALL_STRUCT): Define. +- * src/powerpc/ffi.c: Add flags to handle small structure returns +- in ffi_call_SYSV. +- (ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI. +- Aka FFI_SYSV. +- (ffi_closure_helper_SYSV): Likewise. +- * src/powerpc/ppc_closure.S: Add return types for small structures. +- * src/powerpc/sysv.S: Add bits to handle small structures for +- final SYSV 4 ABI. +- +-2005-07-10 Andreas Tobler +- +- * testsuite/libffi.call/cls_5_1_byte.c: New test file. +- * testsuite/libffi.call/cls_6_1_byte.c: Likewise. +- * testsuite/libffi.call/cls_7_1_byte.c: Likewise. +- +-2005-07-05 Randolph Chung +- +- * src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1 +- as FFI_TYPE_SMALL_STRUCT3. Break out handling for 5-7 byte +- structures. Kill compilation warnings. +- (ffi_closure_inner_LINUX): Print return values as hex in debug +- message. Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. +- Properly handle 5-7 byte structure returns. +- * src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1) +- (FFI_TYPE_SMALL_STRUCT2): Remove. +- (FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5) +- (FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define. +- * src/pa/linux.S: Mark source file as using PA1.1 assembly. +- (checksmst1, checksmst2): Remove. +- (checksmst3): Optimize handling of 3-byte struct returns. +- (checksmst567): Properly handle 5-7 byte struct returns. +- +-2005-06-15 Rainer Orth +- +- PR libgcj/21943 +- * src/mips/n32.S: Enforce PIC code. +- * src/mips/o32.S: Likewise. +- +-2005-06-15 Rainer Orth +- +- * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64. +- * configure: Regenerate. +- +-2005-06-01 Alan Modra +- +- * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET +- to call ffi_closure_helper_SYSV. Append @local instead. +- * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV. +- +-2005-05-17 Kelley Cook +- +- * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. +- Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. +- * Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config. +- * aclocal.m4, configure, fficonfig.h.in, Makefile.in, +- include/Makefile.in, testsuite/Makefile.in: Regenerate. +- +-2005-05-09 Mike Stump +- +- * configure: Regenerate. +- +-2005-05-08 Richard Henderson +- +- PR libffi/21285 +- * src/alpha/osf.S: Update unwind into to match code. +- +-2005-05-04 Andreas Degert +- Richard Henderson +- +- * src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in +- bit 11 of flags. +- (ffi_call): Mask return type field. Pass ssecount to ffi_call_unix64. +- (ffi_prep_closure): Set carry bit if sse-used flag set. +- * src/x86/unix64.S (ffi_call_unix64): Add ssecount argument. +- Only load sse registers if ssecount non-zero. +- (ffi_closure_unix64): Only save sse registers if carry set on entry. +- +-2005-04-29 Ralf Corsepius +- +- * configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*, +- powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*. +- * configure: Regenerate. +- +-2005-04-20 Hans-Peter Nilsson +- +- * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use, +- have Tcl8.3-compatible intermediate variable. +- +-2005-04-18 Simon Posnjak +- Hans-Peter Nilsson +- +- * Makefile.am: Add CRIS support. +- * configure.ac: Likewise. +- * Makefile.in, configure, testsuite/Makefile.in, +- include/Makefile.in: Regenerate. +- * src/cris: New directory. +- * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files. +- * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__. +- +- * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with +- \r?\n in output tests. +- +-2005-04-12 Mike Stump +- +- * configure: Regenerate. +- +-2005-03-30 Hans Boehm +- +- * src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI. +- +-2005-03-30 Steve Ellcey +- +- * src/ia64/ffitarget.h (ffi_arg) ADD DI attribute. +- (ffi_sarg) Ditto. +- * src/ia64/unix.S (ffi_closure_unix): Extend gp +- to 64 bits in ILP32 mode. +- Load 64 bits even for short data. +- +-2005-03-23 Mike Stump +- +- * src/powerpc/darwin.S: Update for -m64 multilib. +- * src/powerpc/darwin_closure.S: Likewise. +- +-2005-03-21 Zack Weinberg +- +- * configure.ac: Do not invoke TL_AC_GCC_VERSION. +- Do not set tool_include_dir. +- * aclocal.m4, configure, Makefile.in, testsuite/Makefile.in: +- Regenerate. +- * include/Makefile.am: Set gcc_version and toollibffidir. +- * include/Makefile.in: Regenerate. +- +-2005-02-22 Andrew Haley +- +- * src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to +- odd-numbered register pairs for 64-bit integer types. +- +-2005-02-23 Andreas Tobler +- +- PR libffi/20104 +- * testsuite/libffi.call/return_ll1.c: New test case. +- +-2005-02-11 Janis Johnson +- +- * testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options. +- * testsuite/libffi.call/float.c: Ditto. +- * testsuite/libffi.call/float2.c: Ditto. +- * testsuite/libffi.call/float3.c: Ditto. +- +-2005-02-08 Andreas Tobler +- +- * src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv. +- +-2005-01-12 Eric Botcazou +- +- * testsuite/libffi.special/special.exp (cxx_options): Add +- -shared-libgcc. +- +-2004-12-31 Richard Henderson +- +- * src/types.c (FFI_AGGREGATE_TYPEDEF): Remove. +- (FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF. Replace size and +- offset parameters with a type parameter; deduce size and structure +- alignment. Update all users. +- +-2004-12-31 Richard Henderson +- +- * src/types.c (FFI_TYPE_POINTER): Define with sizeof. +- (FFI_TYPE_LONGDOUBLE): Fix for ia64. +- * src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move +- into ffi_prep_closure. +- * src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite +- from scratch. +- +-2004-12-27 Richard Henderson +- +- * src/x86/unix64.S: Fix typo in unwind info. +- +-2004-12-25 Richard Henderson +- +- * src/x86/ffi64.c (struct register_args): Rename from stackLayout. +- (enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS. +- (merge_classes): Check for it. +- (SSE_CLASS_P): New. +- (classify_argument): Pass byte_offset by value; perform all updates +- inside struct case. +- (examine_argument): Add classes argument; handle +- X86_64_COMPLEX_X87_CLASS. +- (ffi_prep_args): Merge into ... +- (ffi_call): ... here. Share stack frame with ffi_call_unix64. +- (ffi_prep_cif_machdep): Setup cif->flags for proper structure return. +- (ffi_fill_return_value): Remove. +- (ffi_prep_closure): Remove dead assert. +- (ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner. +- Rewrite to use struct register_args instead of va_list. Create +- flags for handling structure returns. +- * src/x86/unix64.S: Remove dead strings. +- (ffi_call_unix64): Rename from ffi_call_UNIX64. Rewrite to share +- stack frame with ffi_call. Handle structure returns properly. +- (float2sse, floatfloat2sse, double2sse): Remove. +- (sse2float, sse2double, sse2floatfloat): Remove. +- (ffi_closure_unix64): Rename from ffi_closure_UNIX64. Rewrite +- to handle structure returns properly. +- +-2004-12-08 David Edelsohn +- +- * Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and +- PICFLAG. +- * Makefile.in: Regenerated. +- +-2004-12-02 Richard Sandiford +- +- * configure.ac: Use TL_AC_GCC_VERSION to set gcc_version. +- * configure, aclocal.m4, Makefile.in: Regenerate. +- * include/Makefile.in, testsuite/Makefile.in: Regenerate. +- +-2004-11-29 Kelley Cook +- +- * configure: Regenerate for libtool change. +- +-2004-11-25 Kelley Cook +- +- * configure: Regenerate for libtool reversion. +- +-2004-11-24 Kelley Cook +- +- * configure: Regenerate for libtool change. +- +-2004-11-23 John David Anglin +- +- * testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp. +- +-2004-11-23 Richard Sandiford +- +- * src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead +- of jal. Use an absolute encoding for the frame information. +- +-2004-11-23 Kelley Cook +- +- * Makefile.am: Remove no-dependencies. Add ACLOCAL_AMFLAGS. +- * acinclude.m4: Delete logic for sincludes. +- * aclocal.m4, Makefile.in, configure: Regenerate. +- * include/Makefile: Likewise. +- * testsuite/Makefile: Likewise. +- +-2004-11-22 Eric Botcazou +- +- * src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers +- on a 8-byte boundary. +- * src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments. +- +-2004-10-27 Richard Earnshaw +- +- * src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return +- long long values. Round stack allocation to a multiple of 8 bytes +- for ATPCS compatibility. +- * src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register +- names. Handle returning long long types. Add Thumb and interworking +- support. Improve soft-float code. +- +-2004-10-27 Richard Earnshaw +- +- * testsuite/lib/libffi-db.exp (load_gcc_lib): New function. +- (libffi_exit): New function. +- (libffi_init): Build the testglue wrapper if needed. +- +-2004-10-25 Eric Botcazou +- +- PR other/18138 +- * testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc. +- +-2004-10-25 Kazuhiro Inaoka +- +- * src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0. +- +-2004-10-20 Kaz Kojima +- +- * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data. +- * testsuite/libffi.call/float3.c: New test case. +- +-2004-10-18 Kaz Kojima +- +- * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for +- the function returning a structure pointed with R2. +- * src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to +- the structure return value if T bit set. Emit position +- independent code and EH data if PIC. +- +-2004-10-13 Kazuhiro Inaoka +- +- * Makefile.am: Add m32r support. +- * configure.ac: Likewise. +- * Makefile.in: Regenerate. +- * confiugre: Regenerate. +- * src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF +- (uint64, sint64, double, longdouble) +- * src/m32r: New directory. +- * src/m32r/ffi.c: New file. +- * src/m32r/sysv.S: Likewise. +- * src/m32r/ffitarget.h: Likewise. +- +-2004-10-02 Kaz Kojima +- +- * testsuite/libffi.call/negint.c: New test case. +- +-2004-09-14 H.J. Lu +- +- PR libgcj/17465 +- * testsuite/lib/libffi-dg.exp: Don't use global ld_library_path. +- Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, +- LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and +- DYLD_LIBRARY_PATH. +- +-2004-09-05 Andreas Tobler +- +- * testsuite/libffi.call/many_win32.c: Remove whitespaces. +- * testsuite/libffi.call/promotion.c: Likewise. +- * testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup +- whitespaces. +- * testsuite/libffi.call/return_sc.c: Likewise. +- * testsuite/libffi.call/return_uc.c: Likewise. +- +-2004-09-05 Andreas Tobler +- +- * src/powerpc/darwin.S: Fix comments and identation. +- * src/powerpc/darwin_closure.S: Likewise. +- +-2004-09-02 Andreas Tobler +- +- * src/powerpc/ffi_darwin.c: Add flag for longdouble return values. +- (ffi_prep_args): Handle longdouble arguments. +- (ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for +- longdouble. +- (ffi_closure_helper_DARWIN): Add closure handling for longdouble. +- * src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble +- values. +- * src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise. +- * src/types.c: Defined longdouble size and alignment for darwin. +- +-2004-09-02 Andreas Tobler +- +- * src/powerpc/aix.S: Remove whitespaces. +- * src/powerpc/aix_closure.S: Likewise. +- * src/powerpc/asm.h: Likewise. +- * src/powerpc/ffi.c: Likewise. +- * src/powerpc/ffitarget.h: Likewise. +- * src/powerpc/linux64.S: Likewise. +- * src/powerpc/linux64_closure.S: Likewise. +- * src/powerpc/ppc_closure.S: Likewise. +- * src/powerpc/sysv.S: Likewise. +- +-2004-08-30 Anthony Green +- +- * Makefile.am: Add frv support. +- * Makefile.in, testsuite/Makefile.in: Rebuilt. +- * configure.ac: Read configure.host. +- * configure.in: Read configure.host. +- * configure.host: New file. frv-elf needs libgloss. +- * include/ffi.h.in: Force ffi_closure to have a nice big (8) +- alignment. This is needed to frv and shouldn't harm the others. +- * include/ffi_common.h (ALIGN_DOWN): New macro. +- * src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files. +- +-2004-08-24 David Daney +- +- * testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*. +- * testsuite/libffi.call/closure_fn1.c: Likewise. +- * testsuite/libffi.call/closure_fn2.c Likewise. +- * testsuite/libffi.call/closure_fn3.c: Likewise. +- * testsuite/libffi.call/closure_fn4.c: Likewise. +- * testsuite/libffi.call/closure_fn5.c: Likewise. +- * testsuite/libffi.call/cls_18byte.c: Likewise. +- * testsuite/libffi.call/cls_19byte.c: Likewise. +- * testsuite/libffi.call/cls_1_1byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte1.c: Likewise. +- * testsuite/libffi.call/cls_24byte.c: Likewise. +- * testsuite/libffi.call/cls_2byte.c: Likewise. +- * testsuite/libffi.call/cls_3_1byte.c: Likewise. +- * testsuite/libffi.call/cls_3byte1.c: Likewise. +- * testsuite/libffi.call/cls_3byte2.c: Likewise. +- * testsuite/libffi.call/cls_4_1byte.c: Likewise. +- * testsuite/libffi.call/cls_4byte.c: Likewise. +- * testsuite/libffi.call/cls_64byte.c: Likewise. +- * testsuite/libffi.call/cls_6byte.c: Likewise. +- * testsuite/libffi.call/cls_7byte.c: Likewise. +- * testsuite/libffi.call/cls_8byte.c: Likewise. +- * testsuite/libffi.call/cls_9byte1.c: Likewise. +- * testsuite/libffi.call/cls_9byte2.c: Likewise. +- * testsuite/libffi.call/cls_align_double.c: Likewise. +- * testsuite/libffi.call/cls_align_float.c: Likewise. +- * testsuite/libffi.call/cls_align_longdouble.c: Likewise. +- * testsuite/libffi.call/cls_align_pointer.c: Likewise. +- * testsuite/libffi.call/cls_align_sint16.c: Likewise. +- * testsuite/libffi.call/cls_align_sint32.c: Likewise. +- * testsuite/libffi.call/cls_align_sint64.c: Likewise. +- * testsuite/libffi.call/cls_align_uint16.c: Likewise. +- * testsuite/libffi.call/cls_align_uint32.c: Likewise. +- * testsuite/libffi.call/cls_align_uint64.c: Likewise. +- * testsuite/libffi.call/cls_double.c: Likewise. +- * testsuite/libffi.call/cls_float.c: Likewise. +- * testsuite/libffi.call/cls_multi_schar.c: Likewise. +- * testsuite/libffi.call/cls_multi_sshort.c: Likewise. +- * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. +- * testsuite/libffi.call/cls_multi_uchar.c: Likewise. +- * testsuite/libffi.call/cls_multi_ushort.c: Likewise. +- * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. +- * testsuite/libffi.call/cls_schar.c: Likewise. +- * testsuite/libffi.call/cls_sint.c: Likewise. +- * testsuite/libffi.call/cls_sshort.c: Likewise. +- * testsuite/libffi.call/cls_uchar.c: Likewise. +- * testsuite/libffi.call/cls_uint.c: Likewise. +- * testsuite/libffi.call/cls_ulonglong.c: Likewise. +- * testsuite/libffi.call/cls_ushort.c: Likewise. +- * testsuite/libffi.call/nested_struct.c: Likewise. +- * testsuite/libffi.call/nested_struct1.c: Likewise. +- * testsuite/libffi.call/nested_struct2.c: Likewise. +- * testsuite/libffi.call/nested_struct3.c: Likewise. +- * testsuite/libffi.call/problem1.c: Likewise. +- * testsuite/libffi.special/unwindtest.cc: Likewise. +- * testsuite/libffi.call/cls_12byte.c: Likewise and set return value +- to zero. +- * testsuite/libffi.call/cls_16byte.c: Likewise. +- * testsuite/libffi.call/cls_5byte.c: Likewise. +- +-2004-08-23 David Daney +- +- PR libgcj/13141 +- * src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI. +- * src/mips/ffi.c (ffi_prep_args): Fix alignment calculation. +- (ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point +- parameters and return types. +- (ffi_call): Handle FFI_O32_SOFT_FLOAT ABI. +- (ffi_prep_closure): Ditto. +- (ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix +- alignment calculations. +- * src/mips/o32.S (ffi_closure_O32): Don't use floating point +- instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant. +- +-2004-08-14 Casey Marshall +- +- * src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to +- contain `FFI_TYPE_UINT64' as return type for any 64-bit +- integer (O32 ABI only). +- (ffi_prep_closure): new function. +- (ffi_closure_mips_inner_O32): new function. +- * src/mips/ffitarget.h: Define `FFI_CLOSURES' and +- `FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32. +- * src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return +- 64 bit integers correctly. +- (ffi_closure_O32): new function. +- Added DWARF-2 unwind info for both functions. +- +-2004-08-10 Andrew Haley +- +- * src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments. +- +-2004-08-01 Robert Millan +- +- * configure.ac: Detect knetbsd-gnu and kfreebsd-gnu. +- * configure: Regenerate. +- +-2004-07-30 Maciej W. Rozycki +- +- * acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for +- and mmap() explicitly instead of relying on preset autoconf cache +- variables. +- * aclocal.m4: Regenerate. +- * configure: Regenerate. +- +-2004-07-11 Ulrich Weigand +- +- * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. +- (ffi_check_float_struct): Remove unused prototype. +- +-2004-06-30 Geoffrey Keating +- +- * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment +- character on Darwin, use '\n\t' instead. +- +-2004-06-26 Matthias Klose +- +- * libtool-version: Fix typo in revision/age. +- +-2004-06-17 Matthias Klose +- +- * libtool-version: New. +- * Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname. +- * Makefile.in: Regenerate. +- +-2004-06-15 Paolo Bonzini +- +- * Makefile.am: Remove useless multilib rules. +- * Makefile.in: Regenerate. +- * aclocal.m4: Regenerate with automake 1.8.5. +- * configure.ac: Remove useless multilib configury. +- * configure: Regenerate. +- +-2004-06-15 Paolo Bonzini +- +- * .cvsignore: New file. +- +-2004-06-10 Jakub Jelinek +- +- * src/ia64/unix.S (ffi_call_unix): Insert group barrier break +- fp_done. +- (ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever +- changed from 8. +- +-2004-06-06 Sean McNeil +- +- * configure.ac: Add x86_64-*-freebsd* support. +- * configure: Regenerate. +- +-2004-04-26 Joe Buck +- +- Bug 15093 +- * configure.ac: Test for existence of mmap and sys/mman.h before +- checking blacklist. Fix suggested by Jim Wilson. +- * configure: Regenerate. +- +-2004-04-26 Matt Austern +- +- * src/powerpc/darwin.S: Go through a non-lazy pointer for initial +- FDE location. +- * src/powerpc/darwin_closure.S: Likewise. +- +-2004-04-24 Andreas Tobler +- +- * testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization +- error. Reported by Thomas Heller . +- * testsuite/libffi.call/cls_multi_sshort.c (main): Likewise. +- * testsuite/libffi.call/cls_multi_ushort.c (main): Likewise. +- +-2004-03-20 Matthias Klose +- +- * src/pa/linux.S: Fix typo. +- +-2004-03-19 Matthias Klose +- +- * Makefile.am: Update. +- * Makefile.in: Regenerate. +- * src/pa/ffi.h.in: Remove. +- * src/pa/ffitarget.h: New file. +- +-2004-02-10 Randolph Chung +- +- * Makefile.am: Add PA support. +- * Makefile.in: Regenerate. +- * include/Makefile.in: Regenerate. +- * configure.ac: Add PA target. +- * configure: Regenerate. +- * src/pa/ffi.c: New file. +- * src/pa/ffi.h.in: Add PA support. +- * src/pa/linux.S: New file. +- * prep_cif.c: Add PA support. +- +-2004-03-16 Hosaka Yuji +- +- * src/types.c: Fix alignment size of X86_WIN32 case int64 and +- double. +- * src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type +- with ecif->cif->flags. +- (ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type +- with cif->flags. +- (ffi_prep_cif_machdep): Add X86_WIN32 struct case. +- (ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32. +- * src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b, +- sc_retstruct2b): Add for 1 or 2-bytes struct case. +- +-2004-03-15 Kelley Cook +- +- * configure.in: Rename file to ... +- * configure.ac: ... this. +- * fficonfig.h.in: Regenerate. +- * Makefile.in: Regenerate. +- * include/Makefile.in: Regenerate. +- * testsuite/Makefile.in: Regenerate. +- +-2004-03-12 Matt Austern +- +- * src/powerpc/darwin.S: Fix EH information so it corresponds to +- changes in EH format resulting from addition of linkonce support. +- * src/powerpc/darwin_closure.S: Likewise. +- +-2004-03-11 Andreas Tobler +- Paolo Bonzini +- +- * Makefile.am (AUTOMAKE_OPTIONS): Set them. +- Remove VPATH. Remove rules for object files. Remove multilib support. +- (AM_CCASFLAGS): Add. +- * configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER. +- (AC_PREREQ): Bump version to 2.59. +- (AC_INIT): Fill with version info and bug address. +- (ORIGINAL_LD_FOR_MULTILIBS): Remove. +- (AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE. +- De-precious CC so that the right flags are passed down to multilibs. +- (AC_MSG_ERROR): Replace obsolete macro AC_ERROR. +- (AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES. +- (AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS. +- * configure: Rebuilt. +- * aclocal.m4: Likewise. +- * Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise. +- * fficonfig.h.in: Likewise. +- +-2004-03-11 Andreas Schwab +- +- * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point +- arguments from fp registers only for the first 8 parameter slots. +- Don't convert a float parameter when passed in memory. +- +-2004-03-09 Hans-Peter Nilsson +- +- * configure: Regenerate for config/accross.m4 correction. +- +-2004-02-25 Matt Kraai +- +- * src/powerpc/ffi.c (ffi_prep_args_SYSV): Change +- ecif->cif->bytes to bytes. +- (ffi_prep_cif_machdep): Add braces around nested if statement. +- +-2004-02-09 Alan Modra +- +- * src/types.c (pointer): POWERPC64 has 8 byte pointers. +- +- * src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling. +- (ffi_closure_helper_LINUX64): Fix typo. +- * testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128 +- for powerpc64-*-*. +- * testsuite/libffi.call/float.c: Likewise. +- * testsuite/libffi.call/float2.c: Likewise. +- +-2004-02-08 Alan Modra +- +- * src/powerpc/ffi.c (ffi_prep_cif_machdep ): Correct +- long double function return and long double arg handling. +- (ffi_closure_helper_LINUX64): Formatting. Delete unused "ng" var. +- Use "end_pfr" instead of "nf". Correct long double handling. +- Localise "temp". +- * src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double +- return value. +- * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate +- space for long double return value. Adjust stack frame and offsets. +- Load f2 long double return. +- +-2004-02-07 Alan Modra +- +- * src/types.c: Use 16 byte long double for POWERPC64. +- +-2004-01-25 Eric Botcazou +- +- * src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array +- when the structure return address is passed in %o0. +- (ffi_V9_return_struct): Rename into ffi_v9_layout_struct. +- (ffi_v9_layout_struct): Align the field following a nested structure +- on a word boundary. Use memmove instead of memcpy. +- (ffi_call): Update call to ffi_V9_return_struct. +- (ffi_prep_closure): Define 'ctx' only for V8. +- (ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8 +- and ffi_closure_sparc_inner_v9. +- (ffi_closure_sparc_inner_v8): Return long doubles by reference. +- Always skip the structure return address. For structures and long +- doubles, copy the argument directly. +- (ffi_closure_sparc_inner_v9): Skip the structure return address only +- if required. Shift the maximum floating-point slot accordingly. For +- big structures, copy the argument directly; otherwise, left-justify the +- argument and call ffi_v9_layout_struct to lay out the structure on +- the stack. +- * src/sparc/v8.S: Undef STACKFRAME before defining it. +- (ffi_closure_v8): Pass the structure return address. Update call to +- ffi_closure_sparc_inner_v8. Short-circuit FFI_TYPE_INT handling. +- Skip the 'unimp' insn when returning long doubles and structures. +- * src/sparc/v9.S: Undef STACKFRAME before defining it. +- (ffi_closure_v9): Increase the frame size by 2 words. Short-circuit +- FFI_TYPE_INT handling. Load structures both in integers and +- floating-point registers on return. +- * README: Update status of the SPARC port. +- +-2004-01-24 Andreas Tobler +- +- * testsuite/libffi.call/pyobjc-tc.c (main): Treat result value +- as of type ffi_arg. +- * testsuite/libffi.call/struct3.c (main): Fix CHECK. +- +-2004-01-22 Ulrich Weigand +- +- * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result +- value as of type ffi_arg, not unsigned int. +- +-2004-01-21 Michael Ritzert +- +- * ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead +- of the LHS. +- +-2004-01-12 Andreas Tobler +- +- * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for +- Solaris. +- +-2004-01-08 Rainer Orth +- +- * testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED +- to void *. +- +-2003-12-10 Richard Henderson +- +- * testsuite/libffi.call/cls_align_pointer.c: Cast pointers to +- size_t instead of int. +- +-2003-12-04 Hosaka Yuji +- +- * testsuite/libffi.call/many_win32.c: Include . +- * testsuite/libffi.call/many_win32.c (main): Replace variable +- int i with unsigned long ul. +- +- * testsuite/libffi.call/cls_align_uint64.c: New test case. +- * testsuite/libffi.call/cls_align_sint64.c: Likewise. +- * testsuite/libffi.call/cls_align_uint32.c: Likewise. +- * testsuite/libffi.call/cls_align_sint32.c: Likewise. +- * testsuite/libffi.call/cls_align_uint16.c: Likewise. +- * testsuite/libffi.call/cls_align_sint16.c: Likewise. +- * testsuite/libffi.call/cls_align_float.c: Likewise. +- * testsuite/libffi.call/cls_align_double.c: Likewise. +- * testsuite/libffi.call/cls_align_longdouble.c: Likewise. +- * testsuite/libffi.call/cls_align_pointer.c: Likewise. +- +-2003-12-02 Hosaka Yuji +- +- PR other/13221 +- * src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): +- Align arguments to 32 bits. +- +-2003-12-01 Andreas Tobler +- +- PR other/13221 +- * testsuite/libffi.call/cls_multi_sshort.c: New test case. +- * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. +- * testsuite/libffi.call/cls_multi_uchar.c: Likewise. +- * testsuite/libffi.call/cls_multi_schar.c: Likewise. +- * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. +- * testsuite/libffi.call/cls_multi_ushort.c: Likewise. +- +- * testsuite/libffi.special/unwindtest.cc: Cosmetics. +- +-2003-11-26 Kaveh R. Ghazi +- +- * testsuite/libffi.call/ffitest.h: Include . +- * testsuite/libffi.special/ffitestcxx.h: Likewise. +- +-2003-11-22 Andreas Tobler +- +- * Makefile.in: Rebuilt. +- * configure: Likewise. +- * testsuite/libffi.special/unwindtest.cc: Convert the mmap to +- the right type. +- +-2003-11-21 Andreas Jaeger +- Andreas Tobler +- +- * acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST. +- * configure.in: Call AC_FUNC_MMAP_BLACKLIST. +- * Makefile.in: Rebuilt. +- * aclocal.m4: Likewise. +- * configure: Likewise. +- * fficonfig.h.in: Likewise. +- * testsuite/lib/libffi-dg.exp: Add include dir. +- * testsuite/libffi.call/ffitest.h: Add MMAP definitions. +- * testsuite/libffi.special/ffitestcxx.h: Likewise. +- * testsuite/libffi.call/closure_fn0.c: Use MMAP functionality +- for ffi_closure if available. +- * testsuite/libffi.call/closure_fn1.c: Likewise. +- * testsuite/libffi.call/closure_fn2.c: Likewise. +- * testsuite/libffi.call/closure_fn3.c: Likewise. +- * testsuite/libffi.call/closure_fn4.c: Likewise. +- * testsuite/libffi.call/closure_fn5.c: Likewise. +- * testsuite/libffi.call/cls_12byte.c: Likewise. +- * testsuite/libffi.call/cls_16byte.c: Likewise. +- * testsuite/libffi.call/cls_18byte.c: Likewise. +- * testsuite/libffi.call/cls_19byte.c: Likewise. +- * testsuite/libffi.call/cls_1_1byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte1.c: Likewise. +- * testsuite/libffi.call/cls_24byte.c: Likewise. +- * testsuite/libffi.call/cls_2byte.c: Likewise. +- * testsuite/libffi.call/cls_3_1byte.c: Likewise. +- * testsuite/libffi.call/cls_3byte1.c: Likewise. +- * testsuite/libffi.call/cls_3byte2.c: Likewise. +- * testsuite/libffi.call/cls_4_1byte.c: Likewise. +- * testsuite/libffi.call/cls_4byte.c: Likewise. +- * testsuite/libffi.call/cls_5byte.c: Likewise. +- * testsuite/libffi.call/cls_64byte.c: Likewise. +- * testsuite/libffi.call/cls_6byte.c: Likewise. +- * testsuite/libffi.call/cls_7byte.c: Likewise. +- * testsuite/libffi.call/cls_8byte.c: Likewise. +- * testsuite/libffi.call/cls_9byte1.c: Likewise. +- * testsuite/libffi.call/cls_9byte2.c: Likewise. +- * testsuite/libffi.call/cls_double.c: Likewise. +- * testsuite/libffi.call/cls_float.c: Likewise. +- * testsuite/libffi.call/cls_schar.c: Likewise. +- * testsuite/libffi.call/cls_sint.c: Likewise. +- * testsuite/libffi.call/cls_sshort.c: Likewise. +- * testsuite/libffi.call/cls_uchar.c: Likewise. +- * testsuite/libffi.call/cls_uint.c: Likewise. +- * testsuite/libffi.call/cls_ulonglong.c: Likewise. +- * testsuite/libffi.call/cls_ushort.c: Likewise. +- * testsuite/libffi.call/nested_struct.c: Likewise. +- * testsuite/libffi.call/nested_struct1.c: Likewise. +- * testsuite/libffi.call/nested_struct2.c: Likewise. +- * testsuite/libffi.call/nested_struct3.c: Likewise. +- * testsuite/libffi.call/problem1.c: Likewise. +- * testsuite/libffi.special/unwindtest.cc: Likewise. +- +-2003-11-20 Andreas Tobler +- +- * testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional. +- +-2003-11-19 Andreas Tobler +- +- * testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin. +- Add -lgcc_s to additional flags. +- +-2003-11-12 Andreas Tobler +- +- * configure.in, include/Makefile.am: PR libgcj/11147, install +- the ffitarget.h header file in a gcc versioned and target +- dependent place. +- * configure: Regenerated. +- * Makefile.in, include/Makefile.in: Likewise. +- * testsuite/Makefile.in: Likewise. +- +-2003-11-09 Andreas Tobler +- +- * testsuite/libffi.call/closure_fn0.c: Print result and check +- with dg-output to make debugging easier. +- * testsuite/libffi.call/closure_fn1.c: Likewise. +- * testsuite/libffi.call/closure_fn2.c: Likewise. +- * testsuite/libffi.call/closure_fn3.c: Likewise. +- * testsuite/libffi.call/closure_fn4.c: Likewise. +- * testsuite/libffi.call/closure_fn5.c: Likewise. +- * testsuite/libffi.call/cls_12byte.c: Likewise. +- * testsuite/libffi.call/cls_16byte.c: Likewise. +- * testsuite/libffi.call/cls_18byte.c: Likewise. +- * testsuite/libffi.call/cls_19byte.c: Likewise. +- * testsuite/libffi.call/cls_1_1byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte1.c: Likewise. +- * testsuite/libffi.call/cls_24byte.c: Likewise. +- * testsuite/libffi.call/cls_2byte.c: Likewise. +- * testsuite/libffi.call/cls_3_1byte.c: Likewise. +- * testsuite/libffi.call/cls_3byte1.c: Likewise. +- * testsuite/libffi.call/cls_3byte2.c: Likewise. +- * testsuite/libffi.call/cls_4_1byte.c: Likewise. +- * testsuite/libffi.call/cls_4byte.c: Likewise. +- * testsuite/libffi.call/cls_5byte.c: Likewise. +- * testsuite/libffi.call/cls_64byte.c: Likewise. +- * testsuite/libffi.call/cls_6byte.c: Likewise. +- * testsuite/libffi.call/cls_7byte.c: Likewise. +- * testsuite/libffi.call/cls_8byte.c: Likewise. +- * testsuite/libffi.call/cls_9byte1.c: Likewise. +- * testsuite/libffi.call/cls_9byte2.c: Likewise. +- * testsuite/libffi.call/cls_double.c: Likewise. +- * testsuite/libffi.call/cls_float.c: Likewise. +- * testsuite/libffi.call/cls_schar.c: Likewise. +- * testsuite/libffi.call/cls_sint.c: Likewise. +- * testsuite/libffi.call/cls_sshort.c: Likewise. +- * testsuite/libffi.call/cls_uchar.c: Likewise. +- * testsuite/libffi.call/cls_uint.c: Likewise. +- * testsuite/libffi.call/cls_ulonglong.c: Likewise. +- * testsuite/libffi.call/cls_ushort.c: Likewise. +- * testsuite/libffi.call/problem1.c: Likewise. +- +- * testsuite/libffi.special/unwindtest.cc: Make ffi_closure +- static. +- +-2003-11-08 Andreas Tobler +- +- * testsuite/libffi.call/cls_9byte2.c: New test case. +- * testsuite/libffi.call/cls_9byte1.c: Likewise. +- * testsuite/libffi.call/cls_64byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte1.c: Likewise. +- * testsuite/libffi.call/cls_19byte.c: Likewise. +- * testsuite/libffi.call/cls_18byte.c: Likewise. +- * testsuite/libffi.call/closure_fn4.c: Likewise. +- * testsuite/libffi.call/closure_fn5.c: Likewise. +- * testsuite/libffi.call/cls_schar.c: Likewise. +- * testsuite/libffi.call/cls_sint.c: Likewise. +- * testsuite/libffi.call/cls_sshort.c: Likewise. +- * testsuite/libffi.call/nested_struct2.c: Likewise. +- * testsuite/libffi.call/nested_struct3.c: Likewise. +- +-2003-11-08 Andreas Tobler +- +- * testsuite/libffi.call/cls_double.c: Do a check on the result. +- * testsuite/libffi.call/cls_uchar.c: Likewise. +- * testsuite/libffi.call/cls_uint.c: Likewise. +- * testsuite/libffi.call/cls_ulonglong.c: Likewise. +- * testsuite/libffi.call/cls_ushort.c: Likewise. +- * testsuite/libffi.call/return_sc.c: Cleanup whitespaces. +- +-2003-11-06 Andreas Tobler +- +- * src/prep_cif.c (ffi_prep_cif): Move the validity check after +- the initialization. +- +-2003-10-23 Andreas Tobler +- +- * src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace +- FFI_ASSERT(FALSE) with FFI_ASSERT(0). +- +-2003-10-22 David Daney +- +- * src/mips/ffitarget.h: Replace undefined UINT32 and friends with +- __attribute__((__mode__(__SI__))) and friends. +- +-2003-10-22 Andreas Schwab +- +- * src/ia64/ffi.c: Replace FALSE/TRUE with false/true. +- +-2003-10-21 Andreas Tobler +- +- * configure.in: AC_LINK_FILES(ffitarget.h). +- * configure: Regenerate. +- * Makefile.in: Likewise. +- * include/Makefile.in: Likewise. +- * testsuite/Makefile.in: Likewise. +- * fficonfig.h.in: Likewise. +- +-2003-10-21 Paolo Bonzini +- Richard Henderson +- +- Avoid that ffi.h includes fficonfig.h. +- +- * Makefile.am (EXTRA_DIST): Include ffitarget.h files +- (TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. +- (TARGET_SRC_MIPS_SGI): Removed. +- (MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. +- (MIPS_SGI): Removed. +- (CLEANFILES): Removed. +- (mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New +- targets. +- * acconfig.h: Removed. +- * configure.in: Compute sizeofs only for double and long double. +- Use them to define and subst HAVE_LONG_DOUBLE. Include comments +- into AC_DEFINE instead of using acconfig.h. Create +- include/ffitarget.h instead of include/fficonfig.h. Rename +- MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree. +- AC_DEFINE EH_FRAME_FLAGS. +- * include/Makefile.am (DISTCLEANFILES): New automake macro. +- (hack_DATA): Add ffitarget.h. +- * include/ffi.h.in: Remove all system specific definitions. +- Declare raw API even if it is not installed, why bother? +- Use limits.h instead of SIZEOF_* to define ffi_type_*. Do +- not define EH_FRAME_FLAGS, it is in fficonfig.h now. Include +- ffitarget.h instead of fficonfig.h. Remove ALIGN macro. +- (UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead. +- * include/ffi_common.h (bool): Do not define. +- (ffi_assert): Accept failed assertion. +- (ffi_type_test): Return void and accept file/line. +- (FFI_ASSERT): Pass stringized failed assertion. +- (FFI_ASSERT_AT): New macro. +- (FFI_ASSERT_VALID_TYPE): New macro. +- (UINT8, SINT8, UINT16, SINT16, UINT32, SINT32, +- UINT64, SINT64): Define here with gcc's __attribute__ macro +- instead of in ffi.h +- (FLOAT32, ALIGN): Define here instead of in ffi.h +- * include/ffi-mips.h: Removed. Its content moved to +- src/mips/ffitarget.h after separating assembly and C sections. +- * src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c +- src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c, +- src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S, +- src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c: +- SIZEOF_ARG -> FFI_SIZEOF_ARG. +- * src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+). +- * src/debug.c (ffi_assert): Accept stringized failed assertion. +- (ffi_type_test): Rewritten. +- * src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call +- FFI_ASSERT_VALID_TYPE. +- * src/alpha/ffitarget.h, src/arm/ffitarget.h, +- src/ia64/ffitarget.h, src/m68k/ffitarget.h, +- src/mips/ffitarget.h, src/powerpc/ffitarget.h, +- src/s390/ffitarget.h, src/sh/ffitarget.h, +- src/sh64/ffitarget.h, src/sparc/ffitarget.h, +- src/x86/ffitarget.h: New files. +- * src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S, +- src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S, +- src/powerpc/aix.S, src/powerpc/darwin.S, +- src/powerpc/ffi_darwin.c, src/powerpc/linux64.S, +- src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S, +- src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S, +- src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S, +- src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S: +- include fficonfig.h +- +-2003-10-20 Rainer Orth +- +- * src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external +- _MIPS_SIM_NABI32, _MIPS_SIM_ABI32. +- +-2003-10-19 Andreas Tobler +- +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again. +- Used when FFI_DEBUG = 1. +- +-2003-10-14 Alan Modra +- +- * src/types.c (double, longdouble): Default POWERPC64 to 8 byte size +- and align. +- +-2003-10-06 Rainer Orth +- +- * include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs, +- FFI_MIPS_O32 for O32 ABI. +- +-2003-10-01 Andreas Tobler +- +- * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for +- SPARC64. Cleanup whitespaces. +- +-2003-09-19 Andreas Tobler +- +- * testsuite/libffi.call/closure_fn0.c: Xfail mips, arm, +- strongarm, xscale. Cleanup whitespaces. +- * testsuite/libffi.call/closure_fn1.c: Likewise. +- * testsuite/libffi.call/closure_fn2.c: Likewise. +- * testsuite/libffi.call/closure_fn3.c: Likewise. +- * testsuite/libffi.call/cls_12byte.c: Likewise. +- * testsuite/libffi.call/cls_16byte.c: Likewise. +- * testsuite/libffi.call/cls_1_1byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte.c: Likewise. +- * testsuite/libffi.call/cls_24byte.c: Likewise. +- * testsuite/libffi.call/cls_2byte.c: Likewise. +- * testsuite/libffi.call/cls_3_1byte.c: Likewise. +- * testsuite/libffi.call/cls_3byte1.c: Likewise. +- * testsuite/libffi.call/cls_3byte2.c: Likewise. +- * testsuite/libffi.call/cls_4_1byte.c: Likewise. +- * testsuite/libffi.call/cls_4byte.c: Likewise. +- * testsuite/libffi.call/cls_5byte.c: Likewise. +- * testsuite/libffi.call/cls_6byte.c: Likewise. +- * testsuite/libffi.call/cls_7byte.c: Likewise. +- * testsuite/libffi.call/cls_8byte.c: Likewise. +- * testsuite/libffi.call/cls_double.c: Likewise. +- * testsuite/libffi.call/cls_float.c: Likewise. +- * testsuite/libffi.call/cls_uchar.c: Likewise. +- * testsuite/libffi.call/cls_uint.c: Likewise. +- * testsuite/libffi.call/cls_ulonglong.c: Likewise. +- * testsuite/libffi.call/cls_ushort.c: Likewise. +- * testsuite/libffi.call/nested_struct.c: Likewise. +- * testsuite/libffi.call/nested_struct1.c: Likewise. +- * testsuite/libffi.call/problem1.c: Likewise. +- * testsuite/libffi.special/unwindtest.cc: Likewise. +- * testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces. +- +-2003-09-18 David Edelsohn +- +- * src/powerpc/aix.S: Cleanup whitespaces. +- * src/powerpc/aix_closure.S: Likewise. +- +-2003-09-18 Andreas Tobler +- +- * src/powerpc/darwin.S: Cleanup whitespaces, comment formatting. +- * src/powerpc/darwin_closure.S: Likewise. +- * src/powerpc/ffi_darwin.c: Likewise. +- +-2003-09-18 Andreas Tobler +- David Edelsohn +- +- * src/types.c (double): Add AIX and Darwin to the right TYPEDEF. +- * src/powerpc/aix_closure.S: Remove the pointer to the outgoing +- parameter stack. +- * src/powerpc/darwin_closure.S: Likewise. +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures +- according to the Darwin/AIX ABI. +- (ffi_prep_cif_machdep): Likewise. +- (ffi_closure_helper_DARWIN): Likewise. +- Remove the outgoing parameter stack logic. Simplify the evaluation +- of the different CASE types. +- (ffi_prep_clousure): Avoid the casts on lvalues. Change the branch +- statement in the trampoline code. +- +-2003-09-18 Kaz Kojima +- +- * src/sh/ffi.c (ffi_prep_args): Take account into the alignement +- for the register size. +- (ffi_closure_helper_SYSV): Handle the structure return value +- address correctly. +- (ffi_closure_helper_SYSV): Return the appropriate type when +- the registers are used for the structure return value. +- * src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for +- the 64-bit return value. Update copyright years. +- +-2003-09-17 Rainer Orth +- +- * testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in +- srcdir for ffi_mips.h. +- +-2003-09-12 Alan Modra +- +- * src/prep_cif.c (initialize_aggregate): Include tail padding in +- structure size. +- * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct +- placement of float result. +- * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct +- cast of "resp" for big-endian 64 bit machines. +- +-2003-09-11 Alan Modra +- +- * src/types.c (double, longdouble): Merge identical SH and ARM +- typedefs, and add POWERPC64. +- * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for +- struct split over gpr and rest. +- (ffi_prep_cif_machdep): Correct intarg_count for structures. +- * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets. +- +-2003-09-09 Andreas Tobler +- +- * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct +- passing correctly. +- +-2003-09-09 Alan Modra +- +- * configure: Regenerate. +- +-2003-09-04 Andreas Tobler +- +- * Makefile.am: Remove build rules for ffitest. +- * Makefile.in: Rebuilt. +- +-2003-09-04 Andreas Tobler +- +- * src/java_raw_api.c: Include to fix compiler warning +- about implicit declaration of abort(). +- +-2003-09-04 Andreas Tobler +- +- * Makefile.am: Add dejagnu test framework. Fixes PR other/11411. +- * Makefile.in: Rebuilt. +- * configure.in: Add dejagnu test framework. +- * configure: Rebuilt. +- +- * testsuite/Makefile.am: New file. +- * testsuite/Makefile.in: Built +- * testsuite/lib/libffi-dg.exp: New file. +- * testsuite/config/default.exp: Likewise. +- * testsuite/libffi.call/call.exp: Likewise. +- * testsuite/libffi.call/ffitest.h: Likewise. +- * testsuite/libffi.call/closure_fn0.c: Likewise. +- * testsuite/libffi.call/closure_fn1.c: Likewise. +- * testsuite/libffi.call/closure_fn2.c: Likewise. +- * testsuite/libffi.call/closure_fn3.c: Likewise. +- * testsuite/libffi.call/cls_1_1byte.c: Likewise. +- * testsuite/libffi.call/cls_3_1byte.c: Likewise. +- * testsuite/libffi.call/cls_4_1byte.c: Likewise. +- * testsuite/libffi.call/cls_2byte.c: Likewise. +- * testsuite/libffi.call/cls_3byte1.c: Likewise. +- * testsuite/libffi.call/cls_3byte2.c: Likewise. +- * testsuite/libffi.call/cls_4byte.c: Likewise. +- * testsuite/libffi.call/cls_5byte.c: Likewise. +- * testsuite/libffi.call/cls_6byte.c: Likewise. +- * testsuite/libffi.call/cls_7byte.c: Likewise. +- * testsuite/libffi.call/cls_8byte.c: Likewise. +- * testsuite/libffi.call/cls_12byte.c: Likewise. +- * testsuite/libffi.call/cls_16byte.c: Likewise. +- * testsuite/libffi.call/cls_20byte.c: Likewise. +- * testsuite/libffi.call/cls_24byte.c: Likewise. +- * testsuite/libffi.call/cls_double.c: Likewise. +- * testsuite/libffi.call/cls_float.c: Likewise. +- * testsuite/libffi.call/cls_uchar.c: Likewise. +- * testsuite/libffi.call/cls_uint.c: Likewise. +- * testsuite/libffi.call/cls_ulonglong.c: Likewise. +- * testsuite/libffi.call/cls_ushort.c: Likewise. +- * testsuite/libffi.call/float.c: Likewise. +- * testsuite/libffi.call/float1.c: Likewise. +- * testsuite/libffi.call/float2.c: Likewise. +- * testsuite/libffi.call/many.c: Likewise. +- * testsuite/libffi.call/many_win32.c: Likewise. +- * testsuite/libffi.call/nested_struct.c: Likewise. +- * testsuite/libffi.call/nested_struct1.c: Likewise. +- * testsuite/libffi.call/pyobjc-tc.c: Likewise. +- * testsuite/libffi.call/problem1.c: Likewise. +- * testsuite/libffi.call/promotion.c: Likewise. +- * testsuite/libffi.call/return_ll.c: Likewise. +- * testsuite/libffi.call/return_sc.c: Likewise. +- * testsuite/libffi.call/return_uc.c: Likewise. +- * testsuite/libffi.call/strlen.c: Likewise. +- * testsuite/libffi.call/strlen_win32.c: Likewise. +- * testsuite/libffi.call/struct1.c: Likewise. +- * testsuite/libffi.call/struct2.c: Likewise. +- * testsuite/libffi.call/struct3.c: Likewise. +- * testsuite/libffi.call/struct4.c: Likewise. +- * testsuite/libffi.call/struct5.c: Likewise. +- * testsuite/libffi.call/struct6.c: Likewise. +- * testsuite/libffi.call/struct7.c: Likewise. +- * testsuite/libffi.call/struct8.c: Likewise. +- * testsuite/libffi.call/struct9.c: Likewise. +- * testsuite/libffi.special/special.exp: New file. +- * testsuite/libffi.special/ffitestcxx.h: Likewise. +- * testsuite/libffi.special/unwindtest.cc: Likewise. +- +- +-2003-08-13 Kaz Kojima +- +- * src/sh/ffi.c (OFS_INT16): Set 0 for little endian case. Update +- copyright years. +- +-2003-08-02 Alan Modra +- +- * src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc +- structure passing. +- (ffi_closure_helper_LINUX64): Likewise. +- * src/powerpc/linux64.S: Remove code writing to parm save area. +- * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return +- address in lr from ffi_closure_helper_LINUX64 call to calculate +- table address. Optimize function tail. +- +-2003-07-28 Andreas Tobler +- +- * src/sparc/ffi.c: Handle all floating point registers. +- * src/sparc/v9.S: Likewise. Fixes second part of PR target/11410. +- +-2003-07-11 Gerald Pfeifer +- +- * README: Note that libffi is not part of GCC. Update the project +- URL and status. +- +-2003-06-19 Franz Sirl +- +- * src/powerpc/ppc_closure.S: Include ffi.h. +- +-2003-06-13 Rainer Orth +- +- * src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives. +- Use C style comments. +- +-2003-06-13 Kaz Kojima +- +- * Makefile.am: Add SHmedia support. Fix a typo of SH support. +- * Makefile.in: Regenerate. +- * configure.in (sh64-*-linux*, sh5*-*-linux*): Add target. +- * configure: Regenerate. +- * include/ffi.h.in: Add SHmedia support. +- * src/sh64/ffi.c: New file. +- * src/sh64/sysv.S: New file. +- +-2003-05-16 Jakub Jelinek +- +- * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section +- should be read-only. +- * configure: Rebuilt. +- * fficonfig.h.in: Rebuilt. +- * include/ffi.h.in (EH_FRAME_FLAGS): Define. +- * src/alpha/osf.S: Use EH_FRAME_FLAGS. +- * src/powerpc/linux64.S: Likewise. +- * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. +- * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding +- if -fpic/-fPIC/-mrelocatable. +- * src/powerpc/powerpc_closure.S: Likewise. +- * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include +- #write in .eh_frame flags. +- * src/sparc/v9.S: Likewise. +- * src/x86/unix64.S: Use EH_FRAME_FLAGS. +- * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. +- * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. +- +-2003-05-07 Jeff Sturm +- +- Fixes PR bootstrap/10656 +- * configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler +- support for .register pseudo-op. +- * src/sparc/v8.S: Use it. +- * fficonfig.h.in: Rebuilt. +- * configure: Rebuilt. +- +-2003-04-18 Jakub Jelinek +- +- * include/ffi.h.in (POWERPC64): Define if 64-bit. +- (enum ffi_abi): Add FFI_LINUX64 on POWERPC. +- Make it the default on POWERPC64. +- (FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64. +- * configure.in: Change powerpc-*-linux* into powerpc*-*-linux*. +- * configure: Rebuilt. +- * src/powerpc/ffi.c (hidden): Define. +- (ffi_prep_args_SYSV): Renamed from +- ffi_prep_args. Cast pointers to unsigned long to shut up warnings. +- (NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64, +- ASM_NEEDS_REGISTERS64): New. +- (ffi_prep_args64): New function. +- (ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI. +- (ffi_call): Likewise. +- (ffi_prep_closure): Likewise. +- (flush_icache): Surround by #ifndef POWERPC64. +- (ffi_dblfl): New union type. +- (ffi_closure_helper_SYSV): Use it to avoid aliasing problems. +- (ffi_closure_helper_LINUX64): New function. +- * src/powerpc/ppc_closure.S: Surround whole file by #ifndef +- __powerpc64__. +- * src/powerpc/sysv.S: Likewise. +- (ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV. +- * src/powerpc/linux64.S: New file. +- * src/powerpc/linux64_closure.S: New file. +- * Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and +- src/powerpc/linux64_closure.S. +- (TARGET_SRC_POWERPC): Likewise. +- +- * src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2, +- closure_test_fn3): Fix result printing on big-endian 64-bit +- machines. +- (main): Print tst2_arg instead of uninitialized tst2_result. +- +- * src/ffitest.c (main): Hide what closure pointer really points to +- from the compiler. +- +-2003-04-16 Richard Earnshaw +- +- * configure.in (arm-*-netbsdelf*): Add configuration. +- (configure): Regenerated. +- +-2003-04-04 Loren J. Rittle +- +- * include/Makefile.in: Regenerate. +- +-2003-03-21 Zdenek Dvorak +- +- * libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32 +- bit mode. +- * libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): +- Receive closure pointer through parameter, read args using +- __builtin_dwarf_cfa. +- (FFI_INIT_TRAMPOLINE): Send closure reference through eax. +- +-2003-03-12 Andreas Schwab +- +- * configure.in: Avoid trailing /. in toolexeclibdir. +- * configure: Rebuilt. +- +-2003-03-03 Andreas Tobler +- +- * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. +- +-2003-02-06 Andreas Tobler +- +- * libffi/src/powerpc/darwin_closure.S: +- Fix alignement bug, allocate 8 bytes for the result. +- * libffi/src/powerpc/aix_closure.S: +- Likewise. +- * libffi/src/powerpc/ffi_darwin.c: +- Update stackframe description for aix/darwin_closure.S. +- +-2003-02-06 Jakub Jelinek +- +- * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility +- attribute. +- +-2003-01-31 Christian Cornelssen , +- Andreas Schwab +- +- * configure.in: Adjust command to source config-ml.in to account +- for changes to the libffi_basedir definition. +- (libffi_basedir): Remove ${srcdir} from value and include trailing +- slash if nonempty. +- +- * configure: Regenerate. +- +-2003-01-29 Franz Sirl +- +- * src/powerpc/ppc_closure.S: Recode to fit shared libs. +- +-2003-01-28 Andrew Haley +- +- * include/ffi.h.in: Enable FFI_CLOSURES for x86_64. +- * src/x86/ffi64.c (ffi_prep_closure): New. +- (ffi_closure_UNIX64_inner): New. +- * src/x86/unix64.S (ffi_closure_UNIX64): New. +- +-2003-01-27 Alexandre Oliva +- +- * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. +- Remove USE_LIBDIR conditional. +- * Makefile.am (toolexecdir, toolexeclibdir): Don't override. +- * Makefile.in, configure: Rebuilt. +- +-2003-01027 David Edelsohn +- +- * Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo. +- * Makefile.in: Regenerate. +- +-2003-01-22 Andrew Haley +- +- * src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to +- unwind info. +- +-2003-01-21 Andreas Tobler +- +- * src/powerpc/darwin.S: Add unwind info. +- * src/powerpc/darwin_closure.S: Likewise. +- +-2003-01-14 Andrew Haley +- +- * src/x86/ffi64.c (ffi_prep_args): Check for void retval. +- (ffi_prep_cif_machdep): Likewise. +- * src/x86/unix64.S: Add unwind info. +- +-2003-01-14 Andreas Jaeger +- +- * src/ffitest.c (main): Only use ffi_closures if those are +- supported. +- +-2003-01-13 Andreas Tobler +- +- * libffi/src/ffitest.c +- add closure testcases +- +-2003-01-13 Kevin B. Hendricks +- +- * libffi/src/powerpc/ffi.c +- fix alignment bug for float (4 byte aligned iso 8 byte) +- +-2003-01-09 Geoffrey Keating +- +- * src/powerpc/ffi_darwin.c: Remove RCS version string. +- * src/powerpc/darwin.S: Remove RCS version string. +- +-2003-01-03 Jeff Sturm +- +- * include/ffi.h.in: Add closure defines for SPARC, SPARC64. +- * src/ffitest.c (main): Use static storage for closure. +- * src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New. +- * src/sparc/v8.S (ffi_closure_v8): New. +- * src/sparc/v9.S (ffi_closure_v9): New. +- +-2002-11-10 Ranjit Mathew +- +- * include/ffi.h.in: Added FFI_STDCALL ffi_type +- enumeration for X86_WIN32. +- * src/x86/win32.S: Added ffi_call_STDCALL function +- definition. +- * src/x86/ffi.c (ffi_call/ffi_raw_call): Added +- switch cases for recognising FFI_STDCALL and +- calling ffi_call_STDCALL if target is X86_WIN32. +- * src/ffitest.c (my_stdcall_strlen/stdcall_many): +- stdcall versions of the "my_strlen" and "many" +- test functions (for X86_WIN32). +- Added test cases to test stdcall invocation using +- these functions. +- +-2002-12-02 Kaz Kojima +- +- * src/sh/sysv.S: Add DWARF2 unwind info. +- +-2002-11-27 Ulrich Weigand +- +- * src/s390/sysv.S (.eh_frame section): Make section read-only. +- +-2002-11-26 Jim Wilson +- +- * src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64. +- +-2002-11-23 H.J. Lu +- +- * acinclude.m4: Add dummy AM_PROG_LIBTOOL. +- Include ../config/accross.m4. +- * aclocal.m4; Rebuild. +- * configure: Likewise. +- +-2002-11-15 Ulrich Weigand +- +- * src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding. +- +-2002-11-11 DJ Delorie +- +- * configure.in: Look for common files in the right place. +- +-2002-10-08 Ulrich Weigand +- +- * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret +- raw data as _Jv_word values, not ffi_raw. +- (ffi_java_ptrarray_to_raw): Likewise. +- (ffi_java_rvalue_to_raw): New function. +- (ffi_java_raw_call): Call it. +- (ffi_java_raw_to_rvalue): New function. +- (ffi_java_translate_args): Call it. +- * src/ffitest.c (closure_test_fn): Interpret return value +- as ffi_arg, not int. +- * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing +- FFI_TYPE_POINTER case. +- (ffi_closure_helper_SYSV): Likewise. Also, assume return +- values extended to word size. +- +-2002-10-02 Andreas Jaeger +- +- * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output. +- +-2002-10-01 Bo Thorsen +- +- * include/ffi.h.in: Fix i386 win32 compilation. +- +-2002-09-30 Ulrich Weigand +- +- * configure.in: Add s390x-*-linux-* target. +- * configure: Regenerate. +- * include/ffi.h.in: Define S390X for s390x targets. +- (FFI_CLOSURES): Define for s390/s390x. +- (FFI_TRAMPOLINE_SIZE): Likewise. +- (FFI_NATIVE_RAW_API): Likewise. +- * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390. +- * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x. +- * src/s390/ffi.c: Major rework of existing code. Add support for +- s390x targets. Add closure support. +- * src/s390/sysv.S: Likewise. +- +-2002-09-29 Richard Earnshaw +- +- * src/arm/sysv.S: Fix typo. +- +-2002-09-28 Richard Earnshaw +- +- * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor +- has defined __USER_LABEL_PREFIX__, then use it in CNAME. +- (ffi_call_SYSV): Handle soft-float. +- +-2002-09-27 Bo Thorsen +- +- * include/ffi.h.in: Fix multilib x86-64 support. +- +-2002-09-22 Kaveh R. Ghazi +- +- * Makefile.am (all-multi): Fix multilib parallel build. +- +-2002-07-19 Kaz Kojima +- +- * configure.in (sh[34]*-*-linux*): Add brackets. +- * configure: Regenerate. +- +-2002-07-18 Kaz Kojima +- +- * Makefile.am: Add SH support. +- * Makefile.in: Regenerate. +- * configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target. +- * configure: Regenerate. +- * include/ffi.h.in: Add SH support. +- * src/sh/ffi.c: New file. +- * src/sh/sysv.S: New file. +- * src/types.c: Add SH support. +- +-2002-07-16 Bo Thorsen +- +- * src/x86/ffi64.c: New file that adds x86-64 support. +- * src/x86/unix64.S: New file that handles argument setup for +- x86-64. +- * src/x86/sysv.S: Don't use this on x86-64. +- * src/x86/ffi.c: Don't use this on x86-64. +- Remove unused vars. +- * src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation +- for x86-64. +- * src/ffitest.c (struct6): New test that tests a special case in +- the x86-64 ABI. +- (struct7): Likewise. +- (struct8): Likewise. +- (struct9): Likewise. +- (closure_test_fn): Silence warning about this when it's not used. +- (main): Add the new tests. +- (main): Fix a couple of wrong casts and silence some compiler warnings. +- * include/ffi.h.in: Add x86-64 ABI definition. +- * fficonfig.h.in: Regenerate. +- * Makefile.am: Add x86-64 support. +- * configure.in: Likewise. +- * Makefile.in: Regenerate. +- * configure: Likewise. +- +-2002-06-24 Bo Thorsen +- +- * src/types.c: Merge settings for similar architectures. +- Add x86-64 sizes and alignments. +- +-2002-06-23 Bo Thorsen +- +- * src/arm/ffi.c (ffi_prep_args): Remove unused vars. +- * src/sparc/ffi.c (ffi_prep_args_v8): Likewise. +- * src/mips/ffi.c (ffi_prep_args): Likewise. +- * src/m68k/ffi.c (ffi_prep_args): Likewise. +- +-2002-07-18 H.J. Lu (hjl@gnu.org) +- +- * Makefile.am (TARGET_SRC_MIPS_LINUX): New. +- (libffi_la_SOURCES): Support MIPS_LINUX. +- (libffi_convenience_la_SOURCES): Likewise. +- * Makefile.in: Regenerated. +- +- * configure.in (mips64*-*): Skip. +- (mips*-*-linux*): New. +- * configure: Regenerated. +- +- * src/mips/ffi.c: Include . +- +-2002-06-06 Ulrich Weigand +- +- * src/s390/sysv.S: Save/restore %r6. Add DWARF-2 unwind info. +- +-2002-05-27 Roger Sayle +- +- * src/x86/ffi.c (ffi_prep_args): Remove reference to avn. +- +-2002-05-27 Bo Thorsen +- +- * src/x86/ffi.c (ffi_prep_args): Remove unused variable and +- fix formatting. +- +-2002-05-13 Andreas Tobler +- +- * src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at +- beginning of function (for older apple cc). +- +-2002-05-08 Alexandre Oliva +- +- * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at +- script entry, and set LD to it when configuring multilibs. +- * configure: Rebuilt. +- +-2002-05-05 Jason Thorpe +- +- * configure.in (sparc64-*-netbsd*): Add target. +- (sparc-*-netbsdelf*): Likewise. +- * configure: Regenerate. +- +-2002-04-28 David S. Miller +- +- * configure.in, configure: Fix SPARC test in previous change. +- +-2002-04-29 Gerhard Tonn +- +- * Makefile.am: Add Linux for S/390 support. +- * Makefile.in: Regenerate. +- * configure.in: Add Linux for S/390 support. +- * configure: Regenerate. +- * include/ffi.h.in: Add Linux for S/390 support. +- * src/s390/ffi.c: New file from libffi CVS tree. +- * src/s390/sysv.S: New file from libffi CVS tree. +- +-2002-04-28 Jakub Jelinek +- +- * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working +- %r_disp32(). +- * src/sparc/v8.S: Use it. +- * src/sparc/v9.S: Likewise. +- * fficonfig.h.in: Rebuilt. +- * configure: Rebuilt. +- +-2002-04-08 Hans Boehm +- +- * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE +- correctly. +- * src/ia64/unix.S: Add unwind information. Fix comments. +- Save sp in a way that's compatible with unwind info. +- (ffi_call_unix): Correctly restore sp in all cases. +- * src/ia64/ffi.c: Add, fix comments. +- +-2002-04-08 Jakub Jelinek +- +- * src/sparc/v8.S: Make .eh_frame dependent on target word size. +- +-2002-04-06 Jason Thorpe +- +- * configure.in (alpha*-*-netbsd*): Add target. +- * configure: Regenerate. +- +-2002-04-04 Jeff Sturm +- +- * src/sparc/v8.S: Add unwind info. +- * src/sparc/v9.S: Likewise. +- +-2002-03-30 Krister Walfridsson +- +- * configure.in: Enable i*86-*-netbsdelf*. +- * configure: Rebuilt. +- +-2002-03-29 David Billinghurst +- +- PR other/2620 +- * src/mips/n32.s: Delete +- * src/mips/o32.s: Delete +- +-2002-03-21 Loren J. Rittle +- +- * configure.in: Enable alpha*-*-freebsd*. +- * configure: Rebuilt. +- +-2002-03-17 Bryce McKinlay +- +- * Makefile.am: libfficonvenience -> libffi_convenience. +- * Makefile.in: Rebuilt. +- +- * Makefile.am: Define ffitest_OBJECTS. +- * Makefile.in: Rebuilt. +- +-2002-03-07 Andreas Tobler +- David Edelsohn +- +- * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. +- (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. +- (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. +- * Makefile.in: Regenerate. +- * include/ffi.h.in: Add AIX and Darwin closure definitions. +- * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. +- (flush_icache, flush_range): New functions. +- (ffi_closure_helper_DARWIN): New function. +- * src/powerpc/aix_closure.S: New file. +- * src/powerpc/darwin_closure.S: New file. +- +-2002-02-24 Jeff Sturm +- +- * include/ffi.h.in: Add typedef for ffi_arg. +- * src/ffitest.c (main): Declare rint with ffi_arg. +- +-2002-02-21 Andreas Tobler +- +- * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate +- number of GPRs for floating-point arguments. +- +-2002-01-31 Anthony Green +- +- * configure: Rebuilt. +- * configure.in: Replace CHECK_SIZEOF and endian tests with +- cross-compiler friendly macros. +- * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New +- macros. +- +-2002-01-18 David Edelsohn +- +- * src/powerpc/darwin.S (_ffi_call_AIX): New. +- * src/powerpc/aix.S (ffi_call_DARWIN): New. +- +-2002-01-17 David Edelsohn +- +- * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. +- (TARGET_SRC_POWERPC_AIX): New. +- (POWERPC_AIX): New stanza. +- * Makefile.in: Regenerate. +- * configure.in: Add AIX case. +- * configure: Regenerate. +- * include/ffi.h.in (ffi_abi): Add FFI_AIX. +- * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame +- size. Fix "long double" support. +- (ffi_call): Add FFI_AIX case. +- * src/powerpc/aix.S: New. +- +-2001-10-09 John Hornkvist +- +- Implement Darwin PowerPC ABI. +- * configure.in: Handle powerpc-*-darwin*. +- * Makefile.am: Set source files for POWERPC_DARWIN. +- * configure: Rebuilt. +- * Makefile.in: Rebuilt. +- * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for +- POWERPC_DARWIN. +- * src/powerpc/darwin.S: New file. +- * src/powerpc/ffi_darwin.c: New file. +- +-2001-10-07 Joseph S. Myers +- +- * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". +- +-2001-07-16 Rainer Orth +- +- * src/x86/sysv.S: Avoid gas-only .balign directive. +- Use C style comments. +- +-2001-07-16 Rainer Orth +- +- * src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic. +- Fixes PR bootstrap/3563. +- +-2001-06-26 Rainer Orth +- +- * src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF. +- +-2001-06-25 Rainer Orth +- +- * configure.in: Recognize sparc*-sun-* host. +- * configure: Regenerate. +- +-2001-06-06 Andrew Haley +- +- * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. +- +-2001-06-03 Andrew Haley +- +- * src/alpha/osf.S: Add unwind info. +- * src/powerpc/sysv.S: Add unwind info. +- * src/powerpc/ppc_closure.S: Likewise. +- +-2000-05-31 Jeff Sturm +- +- * configure.in: Fix AC_ARG_ENABLE usage. +- * configure: Rebuilt. +- +-2001-05-06 Bryce McKinlay +- +- * configure.in: Remove warning about beta code. +- * configure: Rebuilt. +- +-2001-04-25 Hans Boehm +- +- * src/ia64/unix.S: Restore stack pointer when returning from +- ffi_closure_UNIX. +- * src/ia64/ffi.c: Fix typo in comment. +- +-2001-04-18 Jim Wilson +- +- * src/ia64/unix.S: Delete unnecessary increment and decrement of loc2 +- to eliminate RAW DV. +- +-2001-04-12 Bryce McKinlay +- +- * Makefile.am: Make a libtool convenience library. +- * Makefile.in: Rebuilt. +- +-2001-03-29 Bryce McKinlay +- +- * configure.in: Use different syntax for subdirectory creation. +- * configure: Rebuilt. +- +-2001-03-27 Jon Beniston +- +- * configure.in: Added X86_WIN32 target (Win32, CygWin, MingW). +- * configure: Rebuilt. +- * Makefile.am: Added X86_WIN32 target support. +- * Makefile.in: Rebuilt. +- +- * include/ffi.h.in: Added X86_WIN32 target support. +- +- * src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets. +- * src/types.c: Added X86_WIN32 target support. +- +- * src/x86/win32.S: New file. Based on sysv.S, but with EH +- stuff removed and made to work with CygWin's gas. +- +-2001-03-26 Bryce McKinlay +- +- * configure.in: Make target subdirectory in build dir. +- * Makefile.am: Override suffix based rules to specify correct output +- subdirectory. +- * Makefile.in: Rebuilt. +- * configure: Rebuilt. +- +-2001-03-23 Kevin B Hendricks +- +- * src/powerpc/ppc_closure.S: New file. +- * src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug +- involving long long and register pairs. +- (ffi_prep_closure): New function. +- (flush_icache): Likewise. +- (ffi_closure_helper_SYSV): Likewise. +- * include/ffi.h.in (FFI_CLOSURES): Define on PPC. +- (FFI_TRAMPOLINE_SIZE): Likewise. +- (FFI_NATIVE_RAW_API): Likewise. +- * Makefile.in: Rebuilt. +- * Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S. +- (TARGET_SRC_POWERPC): Likewise. +- +-2001-03-19 Tom Tromey +- +- * Makefile.in: Rebuilt. +- * Makefile.am (ffitest_LDFLAGS): New macro. +- +-2001-03-02 Nick Clifton +- +- * include/ffi.h.in: Remove RCS ident string. +- * include/ffi_mips.h: Remove RCS ident string. +- * src/debug.c: Remove RCS ident string. +- * src/ffitest.c: Remove RCS ident string. +- * src/prep_cif.c: Remove RCS ident string. +- * src/types.c: Remove RCS ident string. +- * src/alpha/ffi.c: Remove RCS ident string. +- * src/alpha/osf.S: Remove RCS ident string. +- * src/arm/ffi.c: Remove RCS ident string. +- * src/arm/sysv.S: Remove RCS ident string. +- * src/mips/ffi.c: Remove RCS ident string. +- * src/mips/n32.S: Remove RCS ident string. +- * src/mips/o32.S: Remove RCS ident string. +- * src/sparc/ffi.c: Remove RCS ident string. +- * src/sparc/v8.S: Remove RCS ident string. +- * src/sparc/v9.S: Remove RCS ident string. +- * src/x86/ffi.c: Remove RCS ident string. +- * src/x86/sysv.S: Remove RCS ident string. +- +-2001-02-08 Joseph S. Myers +- +- * include/ffi.h.in: Change sourceware.cygnus.com references to +- gcc.gnu.org. +- +-2000-12-09 Richard Henderson +- +- * src/alpha/ffi.c (ffi_call): Simplify struct return test. +- (ffi_closure_osf_inner): Index rather than increment avalue +- and arg_types. Give ffi_closure_osf the raw return value type. +- * src/alpha/osf.S (ffi_closure_osf): Handle return value type +- promotion. +- +-2000-12-07 Richard Henderson +- +- * src/raw_api.c (ffi_translate_args): Fix typo. +- (ffi_prep_closure): Likewise. +- +- * include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and +- FFI_TRAMPOLINE_SIZE. +- * src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal +- cif->bytes for new ffi_call_osf implementation. +- (ffi_prep_args): Absorb into ... +- (ffi_call): ... here. Do all stack allocation here and +- avoid a callback function. +- (ffi_prep_closure, ffi_closure_osf_inner): New. +- * src/alpha/osf.S (ffi_call_osf): Reimplement with no callback. +- (ffi_closure_osf): New. +- +-2000-09-10 Alexandre Oliva +- +- * config.guess, config.sub, install-sh: Removed. +- * ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise. +- * Makefile.in: Rebuilt. +- +- * acinclude.m4: Include libtool macros from the top level. +- * aclocal.m4, configure: Rebuilt. +- +-2000-08-22 Alexandre Oliva +- +- * configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set. +- * configure: Rebuilt. +- +-2000-05-11 Scott Bambrough +- +- * libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to +- memory correctly. Use conditional instructions, not branches where +- possible. +- +-2000-05-04 Tom Tromey +- +- * configure: Rebuilt. +- * configure.in: Match `arm*-*-linux-*'. +- From Chris Dornan . +- +-2000-04-28 Jakub Jelinek +- +- * Makefile.am (SUBDIRS): Define. +- (AM_MAKEFLAGS): Likewise. +- (Multilib support.): Add section. +- * Makefile.in: Rebuilt. +- * ltconfig (extra_compiler_flags, extra_compiler_flags_value): +- New variables. Set for gcc using -print-multi-lib. Export them +- to libtool. +- (sparc64-*-linux-gnu*): Use libsuff 64 for search paths. +- * ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options +- for -shared links. +- (extra_compiler_flags_value, extra_compiler_flags): Check these +- for extra compiler options which need to be passed down in +- compiler_flags. +- +-2000-04-16 Anthony Green +- +- * configure: Rebuilt. +- * configure.in: Change i*86-pc-linux* to i*86-*-linux*. +- +-2000-04-14 Jakub Jelinek +- +- * include/ffi.h.in (SPARC64): Define for 64bit SPARC builds. +- Set SPARC FFI_DEFAULT_ABI based on SPARC64 define. +- * src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args. +- Replace all void * sizeofs with sizeof(int). +- Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is +- different than DOUBLE. +- Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere). +- (ffi_prep_args_v9): New function. +- (ffi_prep_cif_machdep): Handle V9 ABI and long long on V8. +- (ffi_V9_return_struct): New function. +- (ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from +- 32bit code (not yet cross-arch calls). +- * src/sparc/v8.S: Add struct return delay nop. +- Handle long long. +- * src/sparc/v9.S: New file. +- * src/prep_cif.c (ffi_prep_cif): Return structure pointer +- is used on sparc64 only for structures larger than 32 bytes. +- Pass by reference for structures is done for structure arguments +- larger than 16 bytes. +- * src/ffitest.c (main): Use 64bit rint on sparc64. +- Run long long tests on sparc. +- * src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and +- sparc64. +- (FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits +- on sparc64. +- * configure.in (sparc-*-linux*): New supported target. +- (sparc64-*-linux*): Likewise. +- * configure: Rebuilt. +- * Makefile.am: Add v9.S to SPARC files. +- * Makefile.in: Likewise. +- (LINK): Surround $(CCLD) into double quotes, so that multilib +- compiles work correctly. +- +-2000-04-04 Alexandre Petit-Bianco +- +- * configure: Rebuilt. +- * configure.in: (i*86-*-solaris*): New libffi target. Patch +- proposed by Bryce McKinlay. +- +-2000-03-20 Tom Tromey +- +- * Makefile.in: Hand edit for java_raw_api.lo. +- +-2000-03-08 Bryce McKinlay +- +- * config.guess, config.sub: Update from the gcc tree. +- Fix for PR libgcj/168. +- +-2000-03-03 Tom Tromey +- +- * Makefile.in: Fixed ia64 by hand. +- +- * configure: Rebuilt. +- * configure.in (--enable-multilib): New option. +- (libffi_basedir): New subst. +- (AC_OUTPUT): Added multilib code. +- +-2000-03-02 Tom Tromey +- +- * Makefile.in: Rebuilt. +- * Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as +- directory name. +- +-2000-02-25 Hans Boehm +- +- * src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New +- files. +- * src/raw_api.c (ffi_translate_args): Fixed typo in argument +- list. +- (ffi_prep_raw_closure): Use ffi_translate_args, not +- ffi_closure_translate. +- * src/java_raw_api.c: New file. +- * src/ffitest.c (closure_test_fn): New function. +- (main): Define `rint' as long long on IA64. Added new test when +- FFI_CLOSURES is defined. +- * include/ffi.h.in (ALIGN): Use size_t, not unsigned. +- (ffi_abi): Recognize IA64. +- (ffi_raw): Added `flt' field. +- Added "Java raw API" code. +- * configure.in: Recognize ia64. +- * Makefile.am (TARGET_SRC_IA64): New macro. +- (libffi_la_common_SOURCES): Added java_raw_api.c. +- (libffi_la_SOURCES): Define in IA64 case. +- +-2000-01-04 Tom Tromey +- +- * Makefile.in: Rebuilt with newer automake. +- +-1999-12-31 Tom Tromey +- +- * Makefile.am (INCLUDES): Added -I$(top_srcdir)/src. +- +-1999-09-01 Tom Tromey +- +- * include/ffi.h.in: Removed PACKAGE and VERSION defines and +- undefs. +- * fficonfig.h.in: Rebuilt. +- * configure: Rebuilt. +- * configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE. +- Use AM_PROG_LIBTOOL (automake 1.4 compatibility). +- * acconfig.h: Don't #undef PACKAGE or VERSION. +- +-1999-08-09 Anthony Green +- +- * include/ffi.h.in: Try to work around messy header problem +- with PACKAGE and VERSION. +- +- * configure: Rebuilt. +- * configure.in: Change version to 2.00-beta. +- +- * fficonfig.h.in: Rebuilt. +- * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. +- +- * src/x86/ffi.c (ffi_raw_call): Rename. +- +-1999-08-02 Kresten Krab Thorup +- +- * src/x86/ffi.c (ffi_closure_SYSV): New function. +- (ffi_prep_incoming_args_SYSV): Ditto. +- (ffi_prep_closure): Ditto. +- (ffi_closure_raw_SYSV): Ditto. +- (ffi_prep_raw_closure): More ditto. +- (ffi_call_raw): Final ditto. +- +- * include/ffi.h.in: Add definitions for closure and raw API. +- +- * src/x86/ffi.c (ffi_prep_cif_machdep): Added case for +- FFI_TYPE_UINT64. +- +- * Makefile.am (libffi_la_common_SOURCES): Added raw_api.c +- +- * src/raw_api.c: New file. +- +- * include/ffi.h.in (ffi_raw): New type. +- (UINT_ARG, SINT_ARG): New defines. +- (ffi_closure, ffi_raw_closure): New types. +- (ffi_prep_closure, ffi_prep_raw_closure): New declarations. +- +- * configure.in: Add check for endianness and sizeof void*. +- +- * src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument, +- instead of directly. +- +- * configure: Rebuilt. +- +-Thu Jul 8 14:28:42 1999 Anthony Green +- +- * configure.in: Add x86 and powerpc BeOS configurations. +- From Makoto Kato . +- +-1999-05-09 Anthony Green +- +- * configure.in: Add warning about this being beta code. +- Remove src/Makefile.am from the picture. +- * configure: Rebuilt. +- +- * Makefile.am: Move logic from src/Makefile.am. Add changes +- to support libffi as a target library. +- * Makefile.in: Rebuilt. +- +- * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: +- Upgraded to new autoconf, automake, libtool. +- +- * README: Tweaks. +- +- * LICENSE: Update copyright date. +- +- * src/Makefile.am, src/Makefile.in: Removed. +- +-1998-11-29 Anthony Green +- +- * include/ChangeLog: Removed. +- * src/ChangeLog: Removed. +- * src/mips/ChangeLog: Removed. +- * src/sparc/ChangeLog: Remboved. +- * src/x86/ChangeLog: Removed. +- +- * ChangeLog.v1: Created. ++commit c860a992fef5d7cd7bb0975b1632d17a9fafe007 ++Author: Anthony Green ++Date: Tue Mar 25 17:02:51 2014 -0400 ++ ++ Upgrade version to 3.1-rc1 ++ ++commit 9837073e6203048a162a226798c5d252600219ed ++Author: Anthony Green ++Date: Tue Mar 25 16:24:14 2014 -0400 ++ ++ Update copyright date and clean up README notes. ++ ++commit 18d3baa9f597b026675baa1b4e5a5eeef7577a08 ++Merge: afee537 f0c8a31 ++Author: Anthony Green ++Date: Tue Mar 25 16:12:53 2014 -0400 ++ ++ Merge pull request #108 from joshtriplett/freebsd ++ ++ [3.1 blocker] Fix FreeBSD support ++ ++commit afee53738a995e23bd2f89fd0f7b30b380566106 ++Merge: 7d24785 b2d610e ++Author: Anthony Green ++Date: Tue Mar 25 16:12:35 2014 -0400 ++ ++ Merge pull request #106 from joshtriplett/darwin-award ++ ++ [3.1 blocker] Update OS X build system to include win32.S on 32-bit ++ ++commit 7d2478568ed9f03cbf57627f449a2d2cf4d1571c ++Merge: beab5f3 56be47f ++Author: Anthony Green ++Date: Tue Mar 25 16:12:17 2014 -0400 ++ ++ Merge pull request #110 from joshtriplett/w64 ++ ++ Fix 64-bit Windows support ++ ++commit beab5f334d9ec5b8b91d1cc727d1029b40358e7e ++Merge: 28fb197 ef5890e ++Author: Anthony Green ++Date: Tue Mar 25 16:07:47 2014 -0400 ++ ++ Merge pull request #105 from joshtriplett/win32-relocations ++ ++ [3.1 blocker] win32.S needs to handle relocations/GOT ++ ++commit f0c8a31577172104049283f0a80c723084a5bd77 ++Author: Josh Triplett ++Date: Mon Mar 24 22:14:26 2014 -0700 ++ ++ Compile win32.S on FreeBSD ++ ++commit b2d610e028b5ce48d1ad7e5d0debc9c321d891b2 ++Author: Josh Triplett ++Date: Fri Mar 21 11:10:13 2014 -0700 ++ ++ Compile win32.S on 32-bit Darwin as well ++ ++commit be50b87a490e794362cb4a27ada2fbaab202adb8 ++Author: Josh Triplett ++Date: Mon Mar 24 21:44:13 2014 -0700 ++ ++ Always use configure to detect whether global symbols need underscores ++ ++ 64-bit Windows already used this check; make it universal, and use it in ++ place of an ifdef on X86_WIN32, to handle non-Windows platforms that use ++ the underscore, such as Darwin. ++ ++commit 56be47f87629e31afbcb0774aa65735f539ee972 ++Author: Josh Triplett ++Date: Mon Mar 24 21:24:53 2014 -0700 ++ ++ Fix a warning on 64-bit Windows ++ ++ When sizeof(size_t) != sizeof(unsigned), adding a size_t to cif->bytes ++ produces a "possible loss of data" warning. However, the size_t in ++ question refers to the size of a single parameter. Use a cast to avoid ++ the warning. ++ ++commit 48a8eda74aad8a21b6f26df5df08fe64c043d208 ++Author: Josh Triplett ++Date: Mon Mar 24 21:21:12 2014 -0700 ++ ++ Avoid referencing undefined ABIs on 64-bit Windows builds ++ ++ 64-bit Windows does not have FFI_STDCALL, FFI_THISCALL, or FFI_FASTCALL. ++ ++commit f0f4138f90345d7d67dfa6783a7e1c7cc30d3c6f ++Author: Josh Triplett ++Date: Sat Mar 22 10:00:53 2014 -0700 ++ ++ win32.S: Add handling for position-independent code on Darwin ++ ++ Newer versions of Darwin generate the necessary stub functions ++ automatically and just need a call instruction, but accomodating older ++ versions as well requires adding the stub. ++ ++commit ef5890ebafb7cd2fbf9acf161edb55fe1382871c ++Author: Josh Triplett ++Date: Fri Mar 21 11:01:39 2014 -0700 ++ ++ win32.S: Use shifting for multiplication rather than repeated addition ++ ++ The jump table code added a register to itself twice to multiply by 4; ++ shift the register left by 2 instead. ++ ++commit 4fca48901e7e4f53bf490ed22607b2d2d8f4bfcc ++Author: Josh Triplett ++Date: Fri Mar 21 11:00:41 2014 -0700 ++ ++ win32.S: Make the jump tables position-independent ++ ++ Now that non-Windows platforms include win32.S, it needs to support ++ building as position-independent code. This fixes build failures on ++ target platforms that do not allow text relocations. ++ ++commit 2087dcf736274286f76c69d3988fb6d7cc4fd0f5 ++Author: Josh Triplett ++Date: Fri Mar 21 10:57:06 2014 -0700 ++ ++ win32.S: Make calls to ffi_closure_SYSV_inner position-independent ++ ++ Now that non-Windows platforms include win32.S, it needs to support ++ building as position-independent code. This fixes one source of build ++ failures on target platforms that do not allow text relocations. ++ ++commit 28fb197079cf1d11da4eef7c8c243ab05590c528 ++Merge: c697472 c3dd0a1 ++Author: Anthony Green ++Date: Tue Mar 18 12:19:36 2014 -0400 ++ ++ Merge pull request #107 from rvandermeulen/msvcc ++ ++ Various compatibility fixes and improvements to msvcc.sh. ++ ++commit c3dd0a1a0245fc174361a70876e88ae24285f861 ++Author: Ryan VanderMeulen ++Date: Tue Mar 18 12:09:45 2014 -0400 ++ ++ Various compatibility fixes and improvements to msvcc.sh. ++ ++ * Don't try to mix incompatible optimization flags in debug builds. ++ * Workaround ax_cc_maxopt.m4 not supporting MSVC and change -O3 to -O2. ++ * Fix MSVC warning by properly passing linker flags to compiler. ++ * Make msvcc.sh return 1 if invalid command line options are used rather than silently eating them. ++ * Add more comments. ++ ++commit c697472fccfbb5b87b007c053cda9ef014b346b9 ++Merge: 83fd2bc e48918e ++Author: Anthony Green ++Date: Mon Mar 17 00:32:42 2014 -0400 ++ ++ Merge pull request #102 from joshtriplett/test-generic ++ ++ Add ABIs to the test matrix; unify many bits of the testsuite ++ ++commit e48918ecf876bc85d040fc50a232059c566553a8 ++Author: Josh Triplett ++Date: Sun Mar 16 20:29:27 2014 -0700 ++ ++ testsuite: Add ABIs to the test matrix; unify tests across ABIs ++ ++ This eliminates all the *_win32.c tests in favor of the tests they were ++ branched from, and expands test coverage to run many more tests on ++ stdcall, thiscall, and fastcall. ++ ++ This same mechanism also supports testing any other target that has ++ multiple ABIs. ++ ++commit 4d4d368e5a55d9443c4c53b1b70d58ab6d8c941c ++Author: Josh Triplett ++Date: Sun Mar 16 17:02:05 2014 -0700 ++ ++ testsuite: Replace ffitestcxx.h with ffitest.h ++ ++ ffitest.h contains a superset of the functionality of ffitestcxx.h; ++ make the C++ tests include ffitest.h instead, and remove ffitestcxx.h. ++ ++commit 3f97cf3413c46caf2a79f32ac9cda4620972c2d7 ++Author: Josh Triplett ++Date: Sun Mar 16 16:53:42 2014 -0700 ++ ++ testsuite: Unify the C and C++ testsuites ++ ++ These two testsuites differ only in the source file glob and a couple of ++ additional compiler options; unify the remaining bits. ++ ++commit 0d9cce8edb937bbe771a6cdd25f671edf06d2128 ++Author: Josh Triplett ++Date: Sun Mar 16 16:22:58 2014 -0700 ++ ++ testsuite: ffitest.h: Parenthesize the CHECK macro ++ ++commit 5695ec1444c5323e48fe4314f8c8f027625e67df ++Author: Josh Triplett ++Date: Sun Mar 16 16:04:58 2014 -0700 ++ ++ testsuite: Factor out a function to run a matrix of tests ++ ++ This commons up code from libffi.call/call.exp and ++ libffi.special/special.exp, unifies the optimization option matrix ++ between the two, and makes it easier to add more axes to the matrix ++ in the future. ++ ++commit dfdb02cc869855d3b68571e5f7aa77ae8c9d254a ++Author: Josh Triplett ++Date: Sun Mar 16 15:26:26 2014 -0700 ++ ++ testsuite: Introduce a __THISCALL__ compiler-specific macro ++ ++commit 83fd2bce0456224483435d4b764063f4513fd464 ++Merge: 3658a07 06ff924 ++Author: Anthony Green ++Date: Sun Mar 16 22:03:29 2014 -0400 ++ ++ Merge pull request #99 from joshtriplett/gitignore ++ ++ .gitignore: Ignore more generated files ++ ++commit 3658a0700a50d37a2fdba04fd9d79ad2f706d9f5 ++Merge: d948d0a 46c5d3c ++Author: Anthony Green ++Date: Sun Mar 16 21:37:42 2014 -0400 ++ ++ Merge pull request #100 from rvandermeulen/bug-756740 ++ ++ Change double quotes in Makefile.am to single quotes. ++ ++commit 46c5d3c30fdc2b43c076ad955078d7c5f1e75b37 ++Author: Ryan VanderMeulen ++Date: Sun Mar 16 21:16:08 2014 -0400 ++ ++ Change double quotes in Makefile.am to single quotes. ++ ++ This was originally done in PR #84, except the change was made to Makefile.in instead of Makefile.am and was therefore reverted the next time the files were regenerated. ++ ++commit 06ff924215a2f9739efa2c059dc595bc4ec1c851 ++Author: Josh Triplett ++Date: Sun Mar 16 16:19:46 2014 -0700 ++ ++ .gitignore: Ignore more generated files ++ ++ The build process generates doc/libffi.info and fficonfig.h.in, so add ++ them to .gitignore. ++ ++commit bad8948346e9b8813023a0cc78a3b6eb8d9c14c6 ++Author: Josh Triplett ++Date: Sun Mar 16 15:16:18 2014 -0700 ++ ++ testsuite: Introduce a __STDCALL__ compiler-specific macro ++ ++ Several tests want to use stdcall, which differs in syntax by compiler, ++ so introduce a macro for it in ffitest.h. ++ ++commit 98a793fa36a4ab3ba24d059cb80a2891cdb940e1 ++Author: Josh Triplett ++Date: Sun Mar 16 15:20:36 2014 -0700 ++ ++ testsuite: Common up the ifdef blocks for compiler-specific macros ++ ++commit d948d0a729c934b0224749338a3ba0a2c8f51c45 ++Merge: b61b472 a86bd31 ++Author: Anthony Green ++Date: Sun Mar 16 10:53:48 2014 -0400 ++ ++ Merge pull request #98 from joshtriplett/unconfigure.host ++ ++ Merge configure.host into configure.ac ++ ++commit a86bd318e2424d879d784ee7b29d6536d7a17c18 ++Author: Josh Triplett ++Date: Sun Mar 16 06:58:59 2014 -0700 ++ ++ Merge configure.host into configure.ac ++ ++ configure.host only has a single entry, and shows no signs of needing ++ more added. ++ ++commit b61b472bd0647006d6685238721002017f1d119c ++Author: Anthony Green ++Date: Sun Mar 16 09:45:55 2014 -0400 ++ ++ Update version to 3.1-rc0. Clean up README. ++ ++commit 7a64e7dbba54e6e9f69954adfb943be1856ff928 ++Merge: 11a5c5c eef2e02 ++Author: Anthony Green ++Date: Sun Mar 16 09:39:08 2014 -0400 ++ ++ Merge pull request #97 from joshtriplett/remove-more-generated-files ++ ++ Remove more generated files ++ ++commit 11a5c5c39f5861011f6c5ddf795da3a32b5f0082 ++Merge: 9a62a21 1c68c07 ++Author: Anthony Green ++Date: Sun Mar 16 09:38:47 2014 -0400 ++ ++ Merge pull request #96 from joshtriplett/sawing-changelogs ++ ++ Generate ChangeLog from git in make dist; remove it from version control ++ ++commit eef2e02a13d7d1c8145d47a64467f654406a3548 ++Author: Josh Triplett ++Date: Sun Mar 16 06:26:03 2014 -0700 ++ ++ doc: Remove autogenerated info file and stamp ++ ++commit 9fb403d3c5d9643e0f561cab6d4a07b1e54907ff ++Author: Josh Triplett ++Date: Sun Mar 16 06:25:52 2014 -0700 ++ ++ fficonfig.h.in: Remove, configure generates it ++ ++commit 1c68c07217fda78a779778c1480fedef7a58d5b4 ++Author: Josh Triplett ++Date: Sun Mar 16 06:11:58 2014 -0700 ++ ++ Generate ChangeLog from git in make dist ++ ++ Archive the existing ChangeLog to ChangeLog.libffi-3.1 ++ ++commit c65ed55e655711e008282edbdd82ce95d008b4f6 ++Author: Josh Triplett ++Date: Sun Mar 16 05:52:00 2014 -0700 ++ ++ ChangeLog.v1: Fix typo in explanatory header. ++ ++commit 9a62a21f5c3a8e1da463229f3170c8ab3031d920 ++Author: Anthony Green ++Date: Sun Mar 16 09:03:57 2014 -0400 ++ ++ Add missing ChangeLog entry. Clean up some entries. ++ ++commit 9bc704c58cb7a049d867837e3a11e2e31886ec66 ++Merge: 694447a e892e58 ++Author: Anthony Green ++Date: Sun Mar 16 08:41:00 2014 -0400 ++ ++ Merge pull request #95 from joshtriplett/news ++ ++ README: Update news for 3.0.14 ++ ++commit e892e581d1838a06c18c7ecd50ebd79915cff92b ++Author: Josh Triplett ++Date: Sun Mar 16 05:38:24 2014 -0700 ++ ++ README: Update news for 3.0.14 ++ ++commit 694447aa29deadd571efb4e9a26ee3f68ede1493 ++Merge: fdc87f3 45a6c21 ++Author: Anthony Green ++Date: Sun Mar 16 08:32:05 2014 -0400 ++ ++ Merge pull request #93 from joshtriplett/travis-dist ++ ++ Make Travis check "make dist" ++ ++commit 45a6c21efa944b520842e631dc54919b04884744 ++Author: Josh Triplett ++Date: Sun Mar 16 05:29:08 2014 -0700 ++ ++ .travis.yml: Test "make dist" too. ++ ++commit fdc87f3b2ea37b58a4a9ae6c35083f544909fe3c ++Merge: 7412b83 e1911f7 ++Author: Anthony Green ++Date: Sun Mar 16 08:05:51 2014 -0400 ++ ++ Merge pull request #85 from joshtriplett/stdcall ++ ++ stdcall support on Linux ++ ++commit e1911f78df113ca58738b66089a070d4cf747de7 ++Author: Josh Triplett ++Date: Sun Mar 16 03:25:53 2014 -0700 ++ ++ Add support for stdcall, thiscall, and fastcall on non-Windows x86-32 ++ ++ Linux supports the stdcall calling convention, either via functions ++ explicitly declared with the stdcall attribute, or via code compiled ++ with -mrtd which effectively makes stdcall the default. ++ ++ This introduces FFI_STDCALL, FFI_THISCALL, and FFI_FASTCALL on ++ non-Windows x86-32 platforms, as non-default calling conventions. ++ ++commit 7412b838d543aae4fa925862bd5702d3dacbc29a ++Merge: c0cc5fd 9531d05 ++Author: Anthony Green ++Date: Sun Mar 16 07:58:16 2014 -0400 ++ ++ Merge pull request #90 from joshtriplett/win32-unifdef ++ ++ prep_cif.c: Remove unnecessary ifdef for X86_WIN32 ++ ++commit c0cc5fdaa237b67e86f22d2f6e13f3b42d9aae33 ++Merge: 98b5296 b3a5da0 ++Author: Anthony Green ++Date: Sun Mar 16 07:57:59 2014 -0400 ++ ++ Merge pull request #89 from joshtriplett/travis32 ++ ++ .travis.yml: Test on both 32-bit and 64-bit ++ ++commit 9531d05f64c2a674e0197158ffad68d69f177bd0 ++Author: Josh Triplett ++Date: Sun Mar 16 01:50:02 2014 -0700 ++ ++ prep_cif.c: Remove unnecessary ifdef for X86_WIN32 ++ ++ ffi_prep_cif_core had a special case for X86_WIN32, checking for ++ FFI_THISCALL in addition to the FFI_FIRST_ABI-to-FFI_LAST_ABI range ++ before returning FFI_BAD_ABI. However, on X86_WIN32, FFI_THISCALL ++ already falls in that range, making the special case unnecessary. ++ Remove it. ++ ++commit b3a5da068abd2f2983d9e67adbf41b0e0f34e37f ++Author: Josh Triplett ++Date: Sat Mar 15 23:27:56 2014 -0700 ++ ++ .travis.yml: Test on both 32-bit and 64-bit ++ ++commit 98b52960485a261399f081915f36063de3854a5f ++Merge: 134ce4c f6dd184 ++Author: Anthony Green ++Date: Sun Mar 16 07:51:33 2014 -0400 ++ ++ Merge pull request #94 from joshtriplett/esp-extra-stackery-perception ++ ++ ChangeLog: Document testsuite changes to remove fragile stack pointer checks ++ ++commit f6dd1845434dd53e22129becdfa092c082df307c ++Author: Josh Triplett ++Date: Sun Mar 16 04:49:36 2014 -0700 ++ ++ ChangeLog: Document testsuite changes to remove fragile stack pointer checks ++ ++commit 134ce4c0266bf994f07518fc534de53f1d3c8de8 ++Merge: 2680e9e 9c27932 ++Author: Anthony Green ++Date: Sun Mar 16 07:47:17 2014 -0400 ++ ++ Merge pull request #91 from joshtriplett/esp-extra-stackery-perception ++ ++ testsuite: Remove fragile stack pointer checks ++ ++commit 9c279328ee12fc869adff63ca81f1230977bd42b ++Author: Josh Triplett ++Date: Sun Mar 16 02:31:19 2014 -0700 ++ ++ testsuite: Remove fragile stack pointer checks ++ ++ testsuite/libffi.call/closure_stdcall.c and ++ testsuite/libffi.call/closure_thiscall.c include inline assembly to save ++ the stack pointer before and after the call, and compare the values. ++ However, compilers can and do leave the stack in different states for ++ these two pieces of inline assembly, such as by saving a temporary value ++ on the stack across the call; observed with gcc -Os, and verified as ++ spurious through careful inspection of disassembly. ++ ++commit 2680e9ea9b4c87ea8042a61e551bd667493d4bd3 ++Merge: 071eab3 82f8cb2 ++Author: Anthony Green ++Date: Sun Mar 16 07:44:08 2014 -0400 ++ ++ Merge pull request #88 from joshtriplett/such-precision-many-fail-wow ++ ++ testsuite/libffi.call/many.c: Avoid spurious failure due to excess precision ++ ++commit 82f8cb24a1d976db35ae31a4b86cec8926da327d ++Author: Josh Triplett ++Date: Sun Mar 16 04:27:32 2014 -0700 ++ ++ ChangeLog: Document many.c and many_win32.c changes to avoid spurious failures ++ ++commit 88d562a8b5912e99306063fe3bc289bab6ca6ebe ++Author: Josh Triplett ++Date: Sat Mar 15 22:08:19 2014 -0700 ++ ++ testsuite/libffi.call/many_win32.c: Avoid spurious failure due to excess precision ++ ++ The test case testsuite/libffi.call/many_win32.c can spuriously fail due ++ to excess floating-point precision. Instrumenting it with some printf ++ calls shows differences well above FLT_EPSILON. (Note when ++ instrumenting it that multiple computations of the difference, such as ++ one in a print and another in the conditional, may produce different ++ results.) ++ ++ Rather than complicating the test suite with architecture-specific flags ++ to avoid excess precision, just simplify the floating-point computation ++ to avoid a dependency on potential excess precision. ++ ++commit c00a49ecd165b2d06c1c9b249d212dc843fa116f ++Author: Josh Triplett ++Date: Sat Mar 15 22:08:19 2014 -0700 ++ ++ testsuite/libffi.call/many.c: Avoid spurious failure due to excess precision ++ ++ The test case testsuite/libffi.call/many.c can spuriously fail due to ++ excess floating-point precision. Instrumenting it with some printf ++ calls shows differences well above FLT_EPSILON. (Note when ++ instrumenting it that multiple computations of the difference, such as ++ one in a print and another in the conditional, may produce different ++ results.) ++ ++ Rather than complicating the test suite with architecture-specific flags ++ to avoid excess precision, just simplify the floating-point computation ++ to avoid a dependency on potential excess precision. ++ ++commit 071eab32a7f9fbbef46c0d8f37d9985bc9cceb37 ++Merge: 2228c7a 2f44952 ++Author: Anthony Green ++Date: Sun Mar 16 07:36:52 2014 -0400 ++ ++ Merge pull request #92 from joshtriplett/autogen ++ ++ Re-add libtool-ldflags ++ ++commit 2f44952c95765c1486fad66f57235f8d459a9748 ++Author: Josh Triplett ++Date: Sun Mar 16 04:35:12 2014 -0700 ++ ++ Re-add libtool-ldflags ++ ++commit 2228c7ab190f3c529b9018495467b841fa21cba2 ++Merge: 76d19d0 35634db ++Author: Anthony Green ++Date: Sun Mar 16 07:25:18 2014 -0400 ++ ++ Merge pull request #87 from joshtriplett/autogen ++ ++ Remove autogenerated files from the repository ++ ++commit 35634dbceaac0a1544f7385addc01d21ef1ef6a8 ++Author: Josh Triplett ++Date: Sat Mar 15 18:11:16 2014 -0700 ++ ++ Remove autogenerated files from the repository ++ ++ Add an autogen.sh to regenerate them. ++ ++commit 76d19d004e36e99d261ee78261e2f52cea5e4ab1 ++Merge: c86d9b6 a1a6f71 ++Author: Anthony Green ++Date: Fri Mar 14 16:54:31 2014 -0400 ++ ++ Ensure the linker supports @unwind sections in libffi. ++ ++commit c86d9b6cc6e16ee262844a33b40441374400758c ++Merge: 4efb7db f8cdf11 ++Author: Anthony Green ++Date: Fri Mar 14 16:51:20 2014 -0400 ++ ++ Fix merge ++ ++commit 4efb7dbfd9427c478a948cd0d464210123db8de8 ++Merge: 634a475 18eb81d ++Author: Anthony Green ++Date: Fri Mar 14 16:47:57 2014 -0400 ++ ++ Merge pull request #81 from rvandermeulen/bug-756740 ++ ++ Allow building for mipsel with Android NDK r8. ++ ++commit a1a6f71bfe4199293043b2e4cfb4c8d3cb1112f9 ++Author: Ryan VanderMeulen ++Date: Mon Mar 10 15:12:47 2014 -0400 ++ ++ Remove stray hunk that shouldn't have been included in this patch. ++ ++commit f8cdf11467181f2a9a6b7e748167569aa58e3a81 ++Author: Ryan VanderMeulen ++Date: Mon Mar 10 15:04:58 2014 -0400 ++ ++ Replace double quotes with single quotes in Makefile.in to improve compatibility between some versions of MSYS and gmake. From Mozilla bug 943728. ++ https://bugzilla.mozilla.org/show_bug.cgi?id=943728 ++ ++commit dfa3738732e1bc3a7f4130395ae4bab55fcebb99 ++Author: Ryan VanderMeulen ++Date: Mon Mar 10 14:53:48 2014 -0400 ++ ++ Ensure the linker supports @unwind sections in libffi. From Mozilla bug 756740. ++ https://bugzilla.mozilla.org/show_bug.cgi?id=778414 ++ ++ Also tracked as issue #42. ++ https://github.com/atgreen/libffi/issues/42 ++ ++commit 18eb81d032f29d645d0498ba92bddfd651f009ae ++Author: Ryan VanderMeulen ++Date: Mon Mar 10 14:43:37 2014 -0400 ++ ++ Allow building for mipsel with Android NDK r8. From Mozilla bug 756740. ++ https://bugzilla.mozilla.org/show_bug.cgi?id=756740 ++ ++commit 634a475eaf1bee31c09f7d519e31c13b64cd24df ++Author: Anthony Green ++Date: Sat Mar 1 18:37:29 2014 -0500 ++ ++ Update Makefile for new darwin scripts ++ ++commit c7b67e874bb89859f9a07d1cf9606052b6c0dcc1 ++Author: Anthony Green ++Date: Sat Mar 1 18:34:18 2014 -0500 ++ ++ Add README note ++ ++commit a04e30ba3dc303133d459c1ac273ceefe4d49b32 ++Author: Anthony Green ++Date: Fri Feb 28 17:20:59 2014 -0500 ++ ++ Add missing -DFFI_DEBUG flag ++ ++commit 934dc1b5c8d6a9e727bedc72342831eb7d62c35f ++Merge: 11d7aa9 67fbef3 ++Author: Anthony Green ++Date: Fri Feb 28 01:10:17 2014 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit 11d7aa9d7a4bbe642944edc0f07cf96db9b270b6 ++Merge: b40aeda 3b44d41 ++Author: Anthony Green ++Date: Fri Feb 28 01:06:48 2014 -0500 ++ ++ Merge pull request #46 from makotokato/android-clang ++ ++ Fix build failure when using clang for Android ++ ++commit 67fbef3b56ff0ef88f9b1a7fe48cb77222fa6cec ++Merge: b40aeda 3b44d41 ++Author: Anthony Green ++Date: Fri Feb 28 01:06:48 2014 -0500 ++ ++ Merge pull request #46 from makotokato/android-clang ++ ++ Fix build failure when using clang for Android ++ ++commit b40aeda31a74d95a37c723b6243aabac466e67c4 ++Merge: 20698ab 53ceaf1 ++Author: Anthony Green ++Date: Fri Feb 28 01:01:29 2014 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit 53ceaf14c5eeb16ba09745f0ca87cca367d41a90 ++Merge: 860fe66 cc9b518 ++Author: Anthony Green ++Date: Fri Feb 28 01:01:02 2014 -0500 ++ ++ Merge pull request #40 from wojdyr/master ++ ++ Correct the -L flag in libffi.pc.in ++ ++commit 20698abc6a00092fd7fd3e434a3a29dc0f048f1e ++Merge: 64bd069 1a0b01e ++Author: Anthony Green ++Date: Fri Feb 28 00:56:27 2014 -0500 ++ ++ Merge pull request #66 from ppizarro/master ++ ++ BlackFin fixes - Fatal error when calling a function defined in a shared library from within the function called by FFI ++ ++commit 860fe6646f5ae603e99a8d1d722ddddba8b75769 ++Merge: 64bd069 1a0b01e ++Author: Anthony Green ++Date: Fri Feb 28 00:56:27 2014 -0500 ++ ++ Merge pull request #66 from ppizarro/master ++ ++ BlackFin fixes - Fatal error when calling a function defined in a shared library from within the function called by FFI ++ ++commit 64bd06990a7accf72271516a2110b86cdccd8df4 ++Author: Anthony Green ++Date: Fri Feb 28 00:52:56 2014 -0500 ++ ++ Add ChangeLog entry for Josh's change ++ ++commit edf29c5169b06fcfc241445e152e325bc3c50e0e ++Merge: 33c9954 3998d26 ++Author: Anthony Green ++Date: Fri Feb 28 00:50:25 2014 -0500 ++ ++ Merge pull request #75 from joshtriplett/longdouble ++ ++ Fix build error on x86 without distinct long double ++ ++commit 33c9954f2eec539011a0f93270aaf013318837ae ++Author: Anthony Green ++Date: Fri Feb 28 00:38:41 2014 -0500 ++ ++ Rebuilt with new libtool ++ ++commit 926b6989fbd08488b9105943293353d45ac527e0 ++Merge: 5a88c85 cc82051 ++Author: Anthony Green ++Date: Fri Feb 28 00:26:57 2014 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++ Conflicts: ++ ChangeLog ++ ++commit 5a88c85fde304052bed1581ed0b6452ac2c68838 ++Author: Anthony Green ++Date: Fri Feb 28 00:23:04 2014 -0500 ++ ++ Fix spelling errors ++ ++commit cc82051c7e80cea772c4b72da026eb7e68d598fc ++Author: Anthony Green ++Date: Fri Feb 28 00:23:04 2014 -0500 ++ ++ Fix spelling errors ++ ++commit 001aaf4b1b56349596bb6f6b5c1613dcbbd84ea8 ++Author: Anthony Green ++Date: Fri Feb 28 00:20:17 2014 -0500 ++ ++ When no VFP arguments are present the IP register is used ++ uninitialized. Initialize it to the value of FP. ++ ++ This fixes a number of testsuite failures when configured for ++ armv7l-unknown-linux-gnueabihf ++ ++commit 49f7729c3ce697c12408c42ccb29cdf4eb66bb85 ++Author: Anthony Green ++Date: Fri Feb 28 00:17:16 2014 -0500 ++ ++ aarch64 fix ++ ++commit 447483d51c6aa9df7116f346a73fc1cf795f4c2b ++Merge: 51377bd b4df9cf ++Author: Anthony Green ++Date: Thu Feb 27 15:42:41 2014 -0500 ++ ++ Fix ChangeLog merge ++ ++commit 3998d2604b5c0d45a098ff3119a9fd9710ef429d ++Author: Josh Triplett ++Date: Mon Feb 17 11:20:33 2014 -0800 ++ ++ Fix build error on x86 without distinct long double ++ ++ src/x86/ffi64.c: In function 'classify_argument': ++ src/x86/ffi64.c:205:5: error: duplicate case value ++ case FFI_TYPE_LONGDOUBLE: ++ ^ ++ src/x86/ffi64.c:202:5: error: previously used here ++ case FFI_TYPE_DOUBLE: ++ ^ ++ ++commit 51377bda9aed0b2c1309c818460cab9d9ab3d46e ++Merge: f08da54 40927bd ++Author: Anthony Green ++Date: Sat Feb 15 08:06:29 2014 -0500 ++ ++ Merge pull request #72 from heiher/devel ++ ++ MIPS N32: Fix call floating point va function ++ ++commit f08da5465463e60a28f5e921f23ebf2ba984c148 ++Merge: 3dc3f32 fa5f25c ++Author: Anthony Green ++Date: Sat Feb 15 08:06:11 2014 -0500 ++ ++ Merge pull request #68 from zeldin/master ++ ++ Linux/ppc64: Remove assumption on contents of r11 in closure ++ ++commit 40927bd3e1e7c6007025ba10854fd8a0664e47df ++Author: Heiher ++Date: Tue Jan 21 23:18:27 2014 +0800 ++ ++ Fix call floating point va function ++ ++ I'm not sure floating-point arguments in GPR or FPR before calling ++ variable number arguments function. so, load all arguments to GPR and ++ FPR. ++ ++commit b4df9cf9cc4a9a9401a53fd6bea1f3c2c283b97b ++Author: Zachary Waldowski ++Date: Wed Feb 5 14:22:52 2014 -0500 ++ ++ AArch64: Fix void fall-through case when assertions are enabled ++ ++commit f466aad0d91a117e42571d1d6fb434fa0433c930 ++Author: Zachary Waldowski ++Date: Tue Jan 21 16:38:31 2014 -0500 ++ ++ AArch64: Fix missing semicolons when assertions are enabled ++ ++commit 7ea677733bd98917241852b8901a6b7580728895 ++Author: Anthony Green ++Date: Sat Nov 30 20:58:31 2013 -0500 ++ ++ Remove build-ios from Makefile ++ ++ Conflicts: ++ ChangeLog ++ ++commit 6ae046cc59c12b2cd40158d6bcb96f4a59886159 ++Author: Anthony Green ++Date: Sat Nov 30 21:06:51 2013 -0500 ++ ++ Mention Aarch64 on iOS ++ ++commit bfc06b3fdb32abe90ce0749aedfec649df85a7ef ++Author: Zachary Waldowski ++Date: Mon Dec 30 17:36:39 2013 -0500 ++ ++ Update ChangeLog ++ ++commit 0a0f12ce1f7be81006b08a3c81a636926d283a9b ++Author: Zachary Waldowski ++Date: Thu Jan 9 13:50:17 2014 -0500 ++ ++ AArch64: Remove duplicitous element_count call. ++ ++ This inhibits an analyzer warning by Clang. ++ ++commit 4330fdcd92e67c816288d64ab230237065768206 ++Author: Zachary Waldowski ++Date: Thu Jan 9 13:53:30 2014 -0500 ++ ++ Darwin/aarch64: Respect iOS ABI re: stack argument alignment ++ ++commit 0a333d6c3973935d4fe02aae76b10e39d3c88e07 ++Author: Zachary Waldowski ++Date: Thu Jan 9 14:03:29 2014 -0500 ++ ++ Darwin/aarch64: Fix size_t assumptions ++ ++commit 2c18e3c76aad1b426617db05a4384e7c3a920176 ++Author: Zachary Waldowski ++Date: Mon Dec 30 16:14:02 2013 -0500 ++ ++ Darwin/aarch64: Fix "shadows declaration" warnings ++ ++commit 1b8a8e20e344f3c55495ab6eb46bd14e843d4b3e ++Author: Zachary Waldowski ++Date: Thu Jan 9 13:55:21 2014 -0500 ++ ++ Darwin/aarch64: Use Clang cache invalidation builtin ++ ++commit 6030cdcae776f8fb5876a53168f7d1e75d28a242 ++Author: Zachary Waldowski ++Date: Mon Dec 30 15:45:51 2013 -0500 ++ ++ Darwin/aarch64: Account for long double being equal to double ++ ++commit 5658b0892683d2e24e4d5842978c184a7ad33858 ++Author: Zachary Waldowski ++Date: Mon Dec 30 16:33:47 2013 -0500 ++ ++ Darwin/aarch64: Use CNAME, restrict .size like ARM ++ ++commit 07175780802acec5dc49fdedd6d20a62409a6707 ++Author: Zachary Waldowski ++Date: Mon Dec 30 17:48:22 2013 -0500 ++ ++ Darwin/aarch64: Fix invalid reference in assembly ++ ++commit 9da28b44277fea3aeb827c35dd63d609d2524a8b ++Author: Zachary Waldowski ++Date: Mon Dec 30 16:23:21 2013 -0500 ++ ++ Darwin/x86_64: Fix 64-bit type shortening warnings ++ ++commit 821d398f08bd1d540a5b235507812ffeee49b580 ++Author: Zachary Waldowski ++Date: Thu Jan 9 13:15:06 2014 -0500 ++ ++ Darwin: Merge build scripts, redo project, incl. arm64 ++ ++commit 6eff9ff9e72463b9783be2514f944b6f05692054 ++Author: Zachary Waldowski ++Date: Mon Dec 30 17:48:10 2013 -0500 ++ ++ Darwin/iOS: Improve unified syntax use for LLVM ++ ++commit ba0ea99c82aadd5957386a031e3122011bd36d52 ++Author: Zachary Waldowski ++Date: Mon Dec 30 15:27:44 2013 -0500 ++ ++ Fix dlmalloc warnings due to set_segment_flags, sizeof(size_t) ++ ++commit 994be3a5c1d0d17b19103396103e128517fd62f9 ++Author: Zachary Waldowski ++Date: Mon Dec 30 15:27:14 2013 -0500 ++ ++ Darwin/iOS: Fix mis-typing of vfp_reg_free ++ ++commit a8e0a835ab1f62d03ad6391760e3e8b7732d24f8 ++Author: Zachary Waldowski ++Date: Mon Dec 30 15:26:20 2013 -0500 ++ ++ Darwin/ARM: Assert on NULL dereference ++ ++ This inhibits an analyzer warning by Clang on all platforms. ++ ++commit 13675341581c489ed9df8ba390c8e08a732decb2 ++Author: Zachary Waldowski ++Date: Thu Jan 9 13:42:08 2014 -0500 ++ ++ Darwin/i386: Inhibit Clang previous prototype warnings ++ ++commit 66469c381e2e2cc96e7d409266dea0ffe177eeca ++Author: Zachary Waldowski ++Date: Thu Jan 9 13:41:45 2014 -0500 ++ ++ Darwin/ARM: Inhibit Clang previous prototype warnings ++ ++commit 5bfe62a00d2d659eec9f19b39802b6e69844fc27 ++Author: Zachary Waldowski ++Date: Thu Jan 9 13:41:27 2014 -0500 ++ ++ Darwin/AArch64: Inhibit Clang previous prototype warnings ++ ++commit fa5f25c20f76a6ef5e950a7ccbce826672c8a620 ++Author: Marcus Comstedt ++Date: Sat Jan 4 19:00:08 2014 +0100 ++ ++ Linux/ppc64: Remove assumption on contents of r11 in closure ++ ++commit 1a0b01e171e9c750437cef2f18917f5a6e32c498 ++Author: Paulo Pizarro ++Date: Thu Jan 2 16:17:59 2014 -0200 ++ ++ When the function called by the ffi called a function defined in a shared library generate a fatal error ++ The correction was to take into consideration the GOT. ++ ++commit 3dc3f32c35db5ab995a835225f6815369735ceb7 ++Author: Anthony Green ++Date: Thu Dec 5 16:23:25 2013 -0500 ++ ++ Undo iOS ARM64 changes. ++ ++commit 356b2cbc304bfe5bdc28b8d1c68d1ff084e9ec37 ++Merge: 484a758 07345a3 ++Author: Anthony Green ++Date: Sat Nov 30 22:38:13 2013 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit 484a7584260e2fbb399ce90083046834271bf9ff ++Author: Anthony Green ++Date: Sat Nov 30 21:06:51 2013 -0500 ++ ++ Mention Aarch64 on iOS ++ ++commit 07345a30ec0a2fa45a7c363d301f57723690cfa0 ++Author: Anthony Green ++Date: Sat Nov 30 21:06:51 2013 -0500 ++ ++ Mention Aarch64 on iOS ++ ++commit d4b931c1b872378c35f12ddbb9a6d55e7f17c65e ++Author: Anthony Green ++Date: Sat Nov 30 20:58:31 2013 -0500 ++ ++ Remove build-ios from Makefile ++ ++commit dfbf236d70fc1ec68e6ff193584a154353508e2f ++Merge: 852ac3b bb9740e ++Author: Anthony Green ++Date: Sat Nov 30 20:54:54 2013 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ Add ChangeLog entry. ++ ++commit bb9740e545205f93a525c77aa6d1cbf4ca9371f3 ++Merge: ac75368 4d701e0 ++Author: Anthony Green ++Date: Sat Nov 30 17:54:39 2013 -0800 ++ ++ Merge pull request #60 from zwaldowski/ios-redo ++ ++ Mac/iOS support, including aarch64 port ++ ++commit 4d701e03faa475a5eb3b54b90046114a1e27b813 ++Author: Zachary Waldowski ++Date: Sat Nov 30 13:25:27 2013 -0500 ++ ++ Darwin: Properly export headers from Xcode project ++ ++commit 022f12eb9ad2264e838fa5fb453733f5177888f4 ++Author: Zachary Waldowski ++Date: Sat Nov 30 12:21:38 2013 -0500 ++ ++ Darwin: Freshen gen scripts, remove old build-ios.sh ++ ++commit e820fe2025d7ad3df7584407946dfaad2af69599 ++Author: Zachary Waldowski ++Date: Sat Nov 30 12:03:51 2013 -0500 ++ ++ Darwin/iOS: Include x86_64+aarch64 pieces in library ++ ++commit 0278284e470ec91db7cdc15ac3dcd64683305848 ++Author: Zachary Waldowski ++Date: Sat Nov 30 03:03:37 2013 -0500 ++ ++ Darwin/aarch64: size_t assumptions ++ ++commit 9775446b6441c91cd9059215c106aa3bcf949767 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:39:34 2013 -0500 ++ ++ Darwin/aarch64: Fix “shadows declaration” warnings ++ ++commit 4260badc37705d3618e774dfe61184ac709881c1 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:08:14 2013 -0500 ++ ++ Darwin/aarch64: Use Clang cache invalidation builtin ++ ++commit 9fa7998d5f9250908cbf12a671479852ebadf9d1 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:07:48 2013 -0500 ++ ++ Darwin/aarch64: Inhibit Xcode warning ++ ++commit 0e832048a93830575b0976406444e134e649a4f7 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:07:34 2013 -0500 ++ ++ Darwin/aarch64: double == long double ++ ++commit 602dc22d76931092610234cf063f9f1b8dbc1a51 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:06:00 2013 -0500 ++ ++ Darwin/iOS prep script: try and compile for arm64 ++ ++commit b513dfe79de4725e8a717325a9e3b5b9f69f63dc ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:05:22 2013 -0500 ++ ++ Darwin/aarch64: Restrict .size to ELF like arm32. ++ ++commit bc978099bf2812de755c076b67ef9c2547607572 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:04:57 2013 -0500 ++ ++ Darwin/aarch64: Potentially(?) fix compile error ++ ++commit d6bb9314467c6e0683156559d23ca341c43fa3c8 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:04:22 2013 -0500 ++ ++ Darwin/aarch64: Use CNAME refs ++ ++commit 33c46ce5680eea28d3437c8771ec1d137e226b45 ++Author: Zachary Waldowski ++Date: Sat Nov 30 04:13:42 2013 -0500 ++ ++ Darwin/Mac: Fix 64/32 shortening warnings ++ ++commit 0612081e6c161d9d820742f995975d35da2adbc2 ++Author: Zachary Waldowski ++Date: Sat Nov 30 03:03:00 2013 -0500 ++ ++ Darwin: Misc size_t warnings ++ ++commit 6a6247d179ec3859311c2d8775841b884f309f66 ++Author: Zachary Waldowski ++Date: Sat Nov 30 02:55:48 2013 -0500 ++ ++ Darwin: Fix dlmalloc warnings due to sizeof(size_t) ++ ++commit 4d60d9e1e32de6166ffd63bbe9ce54cf961c78fc ++Author: Zachary Waldowski ++Date: Sat Nov 30 04:09:30 2013 -0500 ++ ++ Darwin: Rebuild Xcode project ++ ++commit cb719a5c1c2eb391d6a5f5e02484ba4aa990a51b ++Author: Zachary Waldowski ++Date: Sat Nov 30 04:09:18 2013 -0500 ++ ++ Darwin/iOS: Fix LLVM 3.3 warning re: memcpy. ++ ++commit 21bde92c9abb378f9c456a9d95e6f9b99ef8c920 ++Author: Zachary Waldowski ++Date: Sat Nov 30 03:43:42 2013 -0500 ++ ++ Darwin: Clean up, modernize generator scripts ++ ++commit fd54eab74cef7891e4acaaafb71e783142ecb69e ++Author: Zachary Waldowski ++Date: Sat Nov 30 03:38:02 2013 -0500 ++ ++ Darwin/Mac: Also exclude OS X generated source ++ ++commit 953b6f14c655141f9e7d82550a312c3eeb961091 ++Author: Zachary Waldowski ++Date: Tue Apr 24 11:16:20 2012 -0400 ++ ++ Darwin/iOS: More unified syntax support w/ Clang. ++ ++ Signed-off-by: Zachary Waldowski ++ ++commit c713a55379481c339877f2e0003d97cb8d9ed80e ++Author: Zachary Waldowski ++Date: Tue Apr 24 10:25:29 2012 -0400 ++ ++ Darwin/iOS: Simplify RETLDM arguments for LLVM 3.1 ++ ++ Signed-off-by: Zachary Waldowski ++ ++commit 16ba1b80028db5cb71cf86e5f79f5e48317f83c8 ++Author: Zachary Waldowski ++Date: Wed Apr 11 23:26:04 2012 -0400 ++ ++ Darwin: Silence Clang warnings. ++ ++commit 852ac3bd302d6ed97b1ef65f4cbed69c258a48df ++Merge: ab79d6e ac75368 ++Author: Anthony Green ++Date: Thu Nov 21 21:25:44 2013 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++ Conflicts: ++ ChangeLog ++ ++commit ab79d6e21992dd86139ba07530ff888833b78a04 ++Author: Alan Modra ++Date: Thu Nov 21 06:12:35 2013 -0500 ++ ++ This separates the 32-bit sysv/linux/bsd code from the 64-bit linux ++ code, and makes it possible to link code compiled with different ++ options to those used to compile libffi. For example, a ++ -mlong-double-128 libffi can be used with -mlong-double-64 code. ++ ++ Using the return value area as a place to pass parameters wasn't such ++ a good idea, causing a failure of cls_ulonglong.c. I didn't see this ++ when running the mainline gcc libffi testsuite because that version of ++ the test is inferior to the upstreamm libffi test. ++ ++ Using NUM_FPR_ARG_REGISTERS rather than NUM_FPR_ARG_REGISTERS64 meant ++ that a parameter save area could be allocated before it was strictly ++ necessary. Wrong but harmless. Found when splitting apart ffi.c ++ into 32-bit and 64-bit support. ++ ++commit ac7536889334d4be50709006d7e23536364d7891 ++Author: Alan Modra ++Date: Thu Nov 21 06:12:35 2013 -0500 ++ ++ This separates the 32-bit sysv/linux/bsd code from the 64-bit linux ++ code, and makes it possible to link code compiled with different ++ options to those used to compile libffi. For example, a ++ -mlong-double-128 libffi can be used with -mlong-double-64 code. ++ ++ Using the return value area as a place to pass parameters wasn't such ++ a good idea, causing a failure of cls_ulonglong.c. I didn't see this ++ when running the mainline gcc libffi testsuite because that version of ++ the test is inferior to the upstreamm libffi test. ++ ++ Using NUM_FPR_ARG_REGISTERS rather than NUM_FPR_ARG_REGISTERS64 meant ++ that a parameter save area could be allocated before it was strictly ++ necessary. Wrong but harmless. Found when splitting apart ffi.c ++ into 32-bit and 64-bit support. ++ ++commit 69df91cfb4fa6bcb644350a80bff970f27478a6a ++Merge: 2f45082 aa1f62c ++Author: Anthony Green ++Date: Mon Nov 18 06:34:04 2013 -0800 ++ ++ Merge pull request #59 from iains/powerpc-darwin-unwind-fix ++ ++ Fix PowerPC Darwin FDE encodings to use pcrel correctly. Modernise the picbase labels. ++ ++commit aa1f62c0a093c30325dff1d4d2b6b4b22eb96929 ++Author: Iain Sandoe ++Date: Mon Nov 18 13:11:56 2013 +0000 ++ ++ Fix PowerPC Darwin FDE encodings to use pcrel correctly. Modernise the picbase labels. ++ ++commit 2f450822a8698ba88441c56d152c7dc8924b127f ++Author: Anthony Green ++Date: Mon Nov 18 06:52:29 2013 -0500 ++ ++ Clean up code to appease modern GCC compiler. ++ ++commit 16d56c51aded374730920a4acde76ff3d2860ae1 ++Author: Alan Modra ++Date: Mon Nov 18 06:36:03 2013 -0500 ++ ++ An #endif in the wrong place would cause compile failure on powerpcle. ++ Using bl instead of b doesn't cause runtime failures as you might think, ++ but does mess the processor branch prediction. ++ ++commit 34f878a5ef28663f6b1d7fd26fb099429ea1579e ++Merge: 83f65b6 1fd0457 ++Author: Anthony Green ++Date: Sat Nov 16 06:57:54 2013 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++ Conflicts: ++ ChangeLog ++ src/powerpc/ffi.c ++ ++commit 83f65b63d9764a9cc7688fc5cda5ee2bd23faf54 ++Author: Alan Modra ++Date: Sat Nov 16 06:53:50 2013 -0500 ++ ++ Finally, this adds _CALL_ELF == 2 support. ELFv1 objects can't be ++ linked with ELFv2 objects, so this is one case where preprocessor ++ tests in ffi.c are fine. Also, there is no need to define a new ++ FFI_ELFv2 or somesuch value in enum ffi_abi. FFI_LINUX64 will happily ++ serve both ABIs. ++ ++commit 1fd045784cac874b5d76b7fa931f67209a8280d3 ++Author: Alan Modra ++Date: Sat Nov 16 06:53:50 2013 -0500 ++ ++ Finally, this adds _CALL_ELF == 2 support. ELFv1 objects can't be ++ linked with ELFv2 objects, so this is one case where preprocessor ++ tests in ffi.c are fine. Also, there is no need to define a new ++ FFI_ELFv2 or somesuch value in enum ffi_abi. FFI_LINUX64 will happily ++ serve both ABIs. ++ ++commit 362851379a49ce07d3e36e82c4e5c7b6cc16a352 ++Author: Alan Modra ++Date: Sat Nov 16 06:52:43 2013 -0500 ++ ++ Andreas' 2013-02-08 change reverted some breakage for struct return ++ values from 2011-11-12, but in so doing reintroduced string ++ instructions to sysv.S that are not supported on all powerpc variants. ++ This patch properly copies the bounce buffer to destination in C code ++ rather than in asm. ++ ++ I have tested this on powerpc64-linux, powerpc-linux and ++ powerpc-freebsd. Well, the last on powerpc-linux by lying to ++ configure with ++ ++ CC="gcc -m32 -msvr4-struct-return -mlong-double-64" \ ++ CXX="g++ -m32 -msvr4-struct-return -mlong-double-64" \ ++ /src/libffi-current/configure --build=powerpc-freebsd ++ ++ and then ++ ++ make && make CC="gcc -m32" CXX="g++ -m32" \ ++ RUNTESTFLAGS=--target_board=unix/-m32/-msvr4-struct-return/-mlong-double-64\ ++ check ++ ++commit 1c06515d927d9de1582438d4eb5953890e79c5c7 ++Author: Alan Modra ++Date: Sat Nov 16 06:41:36 2013 -0500 ++ ++ The powerpc64 ABIs align structs passed by value, a fact ignored by ++ gcc for quite some time. Since gcc now does the correct alignment, ++ libffi needs to follow suit. This ought to be made selectable via ++ a new abi value, and the #ifdefs removed from ffi.c along with many ++ other #ifdefs present there and in assembly. I'll do that with a ++ followup patch sometime. ++ ++ This is a revised version of ++ https://sourceware.org/ml/libffi-discuss/2013/msg00162.html ++ ++commit a97cf1fae575d8bfd5259c5c422025ad43911326 ++Author: Alan Modra ++Date: Sat Nov 16 06:40:13 2013 -0500 ++ ++ This patch prepares for ELFv2, where sizes of these areas change. It ++ also makes some minor changes to improve code efficiency. ++ ++commit 164283f4ac5972ce2ab5e015cc2ab1014c23276c ++Author: Alan Modra ++Date: Sat Nov 16 06:38:55 2013 -0500 ++ ++ The powerpc64 support opted to pass floating point values both in the ++ fpr area and the parameter save area, necessary when the backend ++ doesn't know if a function argument corresponds to the ellipsis ++ arguments of a variadic function. This patch adds powerpc support for ++ variadic functions, and changes the code to only pass fp in the ABI ++ mandated area. ELFv2 needs this change since the parameter save area ++ may not exist there. ++ ++ This also fixes two faulty tests that used a non-variadic function ++ cast to call a variadic function, and spuriously reasoned that this is ++ somehow necessary for static functions.. ++ ++commit 31257b3189f81a199bc2902c22bc5f2d7c54ccde ++Author: Andrew Haley ++Date: Sat Nov 16 06:35:51 2013 -0500 ++ ++ Fix sample closure code ++ ++commit db0ace3a38496af73eae3df02ef353736d16909f ++Author: Andrew Haley ++Date: Sat Nov 16 06:29:25 2013 -0500 ++ ++ Fix broken test cases ++ ++commit de10f5039ed7a53382ddcc95c368d03e535edb98 ++Merge: 58c2577 f3657da ++Author: Anthony Green ++Date: Thu Nov 14 10:56:29 2013 -0500 ++ ++ Merge branch 'master' of https://github.com/bivab/libffi ++ ++ Conflicts: ++ ChangeLog ++ ++commit f3657da278dd63afcdd8762894a9bdaea8ef028a ++Author: David Schneider ++Date: Thu Nov 14 13:02:16 2013 +0100 ++ ++ update Changelog ++ ++commit 58c2577a3ff80e7416ef0434769e2af23365719c ++Author: Alan Modra ++Date: Wed Nov 13 16:55:36 2013 -0500 ++ ++ This enshrines the current testsuite practice of using ffi_arg for ++ returned values. It would be reasonable and logical to use the actual ++ return argument type as passed to ffi_prep_cif, but this would mean ++ changing a large number of tests that use ffi_arg and all backends ++ that write results to an ffi_arg. ++ ++commit 8af42f9944f7ed72c81ae360aac6a84dc11f89dc ++Author: Anthony Green ++Date: Wed Nov 13 16:40:28 2013 -0500 ++ ++ Respect HAVE_ALLOCA_H ++ ++commit cdf405d574f479b782454516366bd4f4b9b3415e ++Author: David Schneider ++Date: Wed Nov 13 15:50:21 2013 +0100 ++ ++ add a testcase for the double/float issue on ARMHF ++ ++commit 77f823e31ffb557a466b24f7fba845fbf7831798 ++Author: David Schneider ++Date: Wed Nov 13 14:26:57 2013 +0100 ++ ++ stop trying to assing vfp regs once we are done with the registers ++ ++commit 37067ec5036f2a6ed7a4799f83f8f53160460344 ++Author: David Schneider ++Date: Tue Nov 12 19:49:01 2013 +0100 ++ ++ mark all vfp registers as used when done. ++ ++ To avoid assigning registers the would fit, once arguments have been on ++ the stack, we mark all registers as used once we do not find a free ++ register for the first time. ++ ++commit 2f5b7ce545473a7f6e41193edc29407cbebe82d5 ++Author: Anthony Green ++Date: Sat Nov 9 06:16:32 2013 -0500 ++ ++ UltraSPARC IIi fix. Update README and build configury. ++ ++commit becd754434173032f426d22ffcbfe24f55b3c137 ++Author: Mark Kettenis ++Date: Wed Nov 6 06:43:49 2013 -0500 ++ ++ Align the stack pointer to 16-bytes. ++ ++commit 05c31093409f7b3e6d795fac21d2c954313d8162 ++Author: Konstantin Belousov ++Date: Wed Nov 6 06:40:58 2013 -0500 ++ ++ Mark executable as not requiring executable stack. ++ ++commit cf6bf9818e8394cfcdb07a40c6a5e2ee6b01d333 ++Author: Anthony Green ++Date: Sat Nov 2 17:23:59 2013 -0400 ++ ++ Fix up docs ++ ++commit 02177176854d16fc0f1a5958aa34da2f306630ee ++Merge: c242217 c265b4c ++Author: Anthony Green ++Date: Sat Nov 2 17:11:22 2013 -0400 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit c2422174b3edc0de0b148dfd6b67087bb881c4a6 ++Merge: f4b843f d918d47 ++Author: Anthony Green ++Date: Sat Nov 2 14:08:23 2013 -0700 ++ ++ Merge pull request #45 from foss-for-synopsys-dwc-arc-processors/arc_support ++ ++ arc: Fix build error ++ ++commit c265b4cacb9130f042699a85de9c7242b3f49cc3 ++Merge: f4b843f d918d47 ++Author: Anthony Green ++Date: Sat Nov 2 14:08:23 2013 -0700 ++ ++ Merge pull request #45 from foss-for-synopsys-dwc-arc-processors/arc_support ++ ++ arc: Fix build error ++ ++commit f4b843f83710ac378c48abd87fe66bb519d30d2e ++Author: Anthony Green ++Date: Sat Nov 2 17:01:15 2013 -0400 ++ ++ Don't align stack for win32 ++ ++commit f3cd39345713db8e414cf642b6cb65a4cfe6018c ++Merge: 666f3e7 6aa1590 ++Author: Anthony Green ++Date: Sat Nov 2 13:17:57 2013 -0700 ++ ++ Merge pull request #51 from vbudovski/for_upstream ++ ++ Don't use 16 byte aligned stack for WIN32 ++ ++commit 666f3e71b56d92c49fcd2d7f349b8f8ebca0f8a3 ++Author: Anthony Green ++Date: Sat Oct 26 09:12:42 2013 -0400 ++ ++ Add more credits to README. Tidy up. ++ ++commit 73ada14e756bad97fad0e6915a821a3c7e079f81 ++Author: Anthony Green ++Date: Sat Oct 26 09:09:45 2013 -0400 ++ ++ Update README ++ ++commit d3372c54ce7117e80d389ba875dc5b6b2213c71e ++Author: Mark H Weaver ++Date: Sat Oct 26 08:30:06 2013 -0400 ++ ++ Fix N32 ABI issue for MIPS. ++ ++commit d6716aba8118eb0513885cfe557bedebb7016e8b ++Author: Anthony Green ++Date: Tue Oct 15 15:42:49 2013 -0400 ++ ++ Update travis-ci build dependencies to include texinfo ++ ++commit 16b93a211bcfbe4bd0efdcf94de225a71aa0ee02 ++Author: Sandra Loosemore ++Date: Tue Oct 15 15:33:59 2013 -0400 ++ ++ Add nios2 port. ++ ++commit 2f5626ce02fce8267ab48ceb6d7d0ed7d672a75e ++Author: Sandra Loosemore ++Date: Tue Oct 15 15:32:16 2013 -0400 ++ ++ Fix testsuite bug ++ ++commit f64e4a865557e440774436b4c2b2fd7374290e97 ++Author: Marcus Shawcroft ++Date: Tue Oct 15 15:20:14 2013 -0400 ++ ++ Fix many.c testcase for Aarch64 ++ ++commit 128cd1d2f358f26d9fa75a27cf2b30356f5dd903 ++Author: Anthony Green ++Date: Tue Oct 8 06:45:51 2013 -0400 ++ ++ Fix spelling errors ++ ++commit ff06269d707cafbfef2a88afb07a79c9d1480c5f ++Author: Anthony Green ++Date: Tue Oct 8 06:32:18 2013 -0400 ++ ++ Update README for M88K and VAX ++ ++commit d2fcbcdfbea750d1f6a9f493e2e6c4d5ffa71b34 ++Author: Anthony Green ++Date: Tue Oct 8 06:27:46 2013 -0400 ++ ++ Add m88k and VAX support. Update some configury bits. ++ ++commit 6aa15900accc0a648cdebf11ec11d11697ebfffd ++Author: Vitaly Budovski ++Date: Thu Sep 5 12:05:06 2013 +1000 ++ ++ Don't use 16 byte aligned stack for WIN32 ++ ++ This fixes a crash when accessing __stdcall functions in Python ctypes. ++ ++commit 3b44d41156149af8da2a58825fefdfa23274ae7a ++Author: Makoto Kato ++Date: Wed Jul 10 15:34:53 2013 +0900 ++ ++ Fix build failure when using clang for Android ++ ++ clang for Android generates __gnu_linux__ define, but gcc for Android doesn't. So we should add check it for Android ++ ++commit d918d47809c174d62283306b282749f8db93661f ++Author: Mischa Jonker ++Date: Mon Jul 8 15:51:36 2013 +0200 ++ ++ arc: Fix build error ++ ++ One part of the patch for ARC support was missing in the upstreamed ++ version. ++ ++ Signed-off-by: Mischa Jonker ++ ++commit d3d099b40c122550279789200263346f120f6909 ++Author: Anthony Green ++Date: Tue Jul 2 16:11:38 2013 -0400 ++ ++ little-endian ppc64 support ++ ++commit 0f8690a84c874ec09a090c8c6adfb93c594acac6 ++Author: Anthony Green ++Date: Tue Jul 2 15:54:40 2013 -0400 ++ ++ Rebuild for ARC additions ++ ++commit f88118b345f27c46f5445d6e4832c498ff9a6d85 ++Author: Anthony Green ++Date: Tue Jul 2 15:51:27 2013 -0400 ++ ++ Revert "Merge pull request #36 from abergmeier/emscripten_fix" ++ ++ This reverts commit 6a4d901dde7b3f87984c563505717cde3113d16e, reversing ++ changes made to b50a13b9c07ec09af4b9697e482acdad571e6961. ++ ++commit 6a4d901dde7b3f87984c563505717cde3113d16e ++Merge: b50a13b 587002c ++Author: Anthony Green ++Date: Tue Jul 2 12:12:34 2013 -0700 ++ ++ Merge pull request #36 from abergmeier/emscripten_fix ++ ++ Fixes for building with Emscripten ++ ++commit b50a13b9c07ec09af4b9697e482acdad571e6961 ++Merge: 767f1f9 b082e15 ++Author: Anthony Green ++Date: Tue Jul 2 12:10:26 2013 -0700 ++ ++ Merge pull request #44 from foss-for-synopsys-dwc-arc-processors/arc_support ++ ++ Add ARC support ++ ++commit 767f1f96e5282da44d7340e6815e9820a3f78e39 ++Merge: c3c40e0 b8a91d8 ++Author: Anthony Green ++Date: Tue Jul 2 12:08:04 2013 -0700 ++ ++ Merge pull request #43 from JensTimmerman/__m128 ++ ++ added include for xmmintrin.h ++ ++commit b8a91d81be77d479327fdb6bdd9fdae6d18e6e63 ++Author: Jens Timmerman ++Date: Tue Jul 2 10:57:37 2013 +0200 ++ ++ added include for xmmintrin.h ++ ++commit b082e15091961373c03d10ed0251f619ebb6ed76 ++Author: Mischa Jonker ++Date: Mon Jun 10 16:19:33 2013 +0200 ++ ++ Add ARC support ++ ++ This adds support for the ARC architecture to libffi. DesignWare ARC ++ is a family of processors from Synopsys, Inc. ++ ++ This patch has been tested on a little-endian system and passes ++ the testsuite. ++ ++ Signed-off-by: Mischa Jonker ++ ++commit cc9b518687e46b0d1acafdd4bc3f3b281c25a3d9 ++Author: Marcin Wojdyr ++Date: Tue May 14 15:01:23 2013 +0200 ++ ++ Update libffi.pc.in ++ ++ use -L${toolexeclibdir} instead of -L${libdir} ++ to be consistent with Makefile.am ++ ++commit 587002c092cffe6e7a8d7028f246c241d03b738c ++Author: Andreas Bergmeier ++Date: Fri Apr 19 17:12:24 2013 +0200 ++ ++ Enable disabling of libtool on platforms where it does not work (e.g. LLVM). ++ Build libraries normally then. ++ ++commit c3c40e0290377d7cf948b072eedd8317c4bf215e ++Merge: ede96e4 4750e3c ++Author: Anthony Green ++Date: Sat Mar 30 05:24:14 2013 -0700 ++ ++ Merge pull request #34 from davidsch/armhf ++ ++ Fix ARM hard-float support for large numbers of VFP arguments ++ ++commit 4750e3c662fd9569cb3e2d28f539685fd1ca8caf ++Author: David Schneider ++Date: Thu Mar 28 16:56:36 2013 +0100 ++ ++ update changelog ++ ++commit 9708e7cf09f1bf815f4d6485eb1f180fabb35804 ++Author: David Schneider ++Date: Wed Mar 27 19:31:04 2013 +0100 ++ ++ folow the ARM hard-float ABI in ffi_prep_incoming_args_VFP ++ ++commit b41120981e5e49ca2da10b94b154775f50da5f36 ++Author: David Schneider ++Date: Wed Mar 27 16:38:35 2013 +0100 ++ ++ create separated versions of ffi_prep_incoming_args_* for SYSV and VFP ABIs. ++ ++ The different versions will be called depending on the value of cif->abi ++ ++commit dd26f1f39c54861c5b91931f0f37a72942c2a072 ++Author: David Schneider ++Date: Thu Mar 28 15:39:01 2013 +0100 ++ ++ add a failing test for closures on ARM hardfloat ++ ++commit 3c1608613ab3c2184222b98c5482cddedd6b559b ++Author: David Schneider ++Date: Tue Mar 26 19:24:47 2013 +0100 ++ ++ extend ffi_prepare_args for FFI_VFP (hard-float ABI), fixing an issue with passing VFP arguments in VFP registers and the stack, while at the same time not using all core registers. ++ ++commit 0f2ff2d4c92719be8936179f9ab674f4d1a3fd14 ++Author: David Schneider ++Date: Tue Mar 26 19:22:02 2013 +0100 ++ ++ separate ARM ffi_prepare_args in a version implementing the simple SYSV calling convention and one for the hard-float calling convention ++ ++commit 3a352b8a8252400a83de22c7c424bf1887b4a2ef ++Author: David Schneider ++Date: Tue Mar 26 14:24:04 2013 +0100 ++ ++ move the hardfloat specific argument copying code to the helper function ++ ++commit 5df6b7944a4225b6eb329f3886be64e04e966f29 ++Author: David Schneider ++Date: Tue Mar 26 14:02:21 2013 +0100 ++ ++ extract setting of arguments to be passed to a helper function ++ ++commit 7d1048c471bb4b1f9d67a9e9f8e95f9a1d2e6d45 ++Author: David Schneider ++Date: Tue Mar 26 11:33:33 2013 +0100 ++ ++ extract code to align the argument storage pointer to a helper function ++ ++commit b9f013788f0f384c423ad963475aaacb55598135 ++Author: David Schneider ++Date: Mon Mar 25 13:27:36 2013 +0100 ++ ++ add a testcase, that on ARM hardfloat needs more than the 8 VFP argument registers to pass arguments to a call ++ ++commit 2fbdb0f231cafdb77b025d3cd8afe90cda99b3ba ++Author: David Schneider ++Date: Mon Mar 25 13:26:02 2013 +0100 ++ ++ use the absolute value to check the test result against an epsilon ++ ++commit ede96e4eb660bbf3e0fe048135efa8106f48af5d ++Merge: f22ab3c 9e34992 ++Author: Anthony Green ++Date: Sun Mar 17 18:38:21 2013 -0400 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit f22ab3c6877cbdd07f058b68816b0086b1cb0e1e ++Merge: 12b1886 d08124b ++Author: Anthony Green ++Date: Sun Mar 17 18:34:54 2013 -0400 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit 9e34992a5ea2fda1dba5875bf96dc91a7230f51f ++Merge: 12b1886 d08124b ++Author: Anthony Green ++Date: Sun Mar 17 18:34:54 2013 -0400 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit 12b1886d7b1f8aa264b1d348bfa47a0e14712df4 ++Author: Anthony Green ++Date: Sun Mar 17 18:32:12 2013 -0400 ++ ++ cygwin fix & updates for 3.0.13 ++ ++commit d08124bedf2c6d61874fe215404783aeb9f6f1ac ++Author: Anthony Green ++Date: Sun Mar 17 18:32:12 2013 -0400 ++ ++ cygwin fix & updates for 3.0.13 ++ ++commit cb32c812d04d1dfa72002cc04924e7e4fef89e02 ++Author: Anthony Green ++Date: Sun Mar 17 09:27:55 2013 -0400 ++ ++ Fix lib install dir ++ ++commit efd7866a361a6f636bae8400d26c6811e56ca207 ++Author: Anthony Green ++Date: Sat Mar 16 08:35:57 2013 -0400 ++ ++ 2.0.13rc1 ++ ++commit ff647ad4dff2f07dd153f295a1f70b1d906cd6ca ++Merge: 4acf005 d9dd417 ++Author: Anthony Green ++Date: Sat Mar 16 08:20:40 2013 -0400 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++ Conflicts: ++ ChangeLog ++ ++commit 4acf0056f55c757490dae6c29a65b0321327ea8a ++Author: Anthony Green ++Date: Sat Mar 16 08:18:45 2013 -0400 ++ ++ Build fix for soft-float power targets ++ ++commit 675c9839224e4268187f1ec6f512127f9db555d0 ++Author: Anthony Green ++Date: Sat Mar 16 08:12:38 2013 -0400 ++ ++ Documentation fix ++ ++commit 8a286f570ccd41db81f74ea7f248da62241d898a ++Author: Anthony Green ++Date: Sat Mar 16 08:01:19 2013 -0400 ++ ++ Fix for m68000 systems ++ ++commit d9dd417b09566af55b7b3000bb53ccaf2e1d6c92 ++Author: Anthony Green ++Date: Sat Mar 16 08:01:19 2013 -0400 ++ ++ Fix for m68000 systems ++ ++commit 215763d012a944d95406b394d6013b80d220e870 ++Author: Anthony Green ++Date: Sat Mar 16 07:57:35 2013 -0400 ++ ++ Update configury. ++ ++commit 9180d8f39c9b6afe17b78277c2711a5d9948e824 ++Merge: 2fb527a 7e1b326 ++Author: Anthony Green ++Date: Sat Mar 16 07:46:55 2013 -0400 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit 2fb527a017a4943e176a489ff103231b86464b59 ++Author: Anthony Green ++Date: Sat Mar 16 07:46:38 2013 -0400 ++ ++ Add Meta processor support ++ ++commit 211a9ebf4d1a9801e15e103566aed2b8c42790be ++Merge: f308faf ee18766 ++Author: Anthony Green ++Date: Sat Mar 16 04:24:40 2013 -0700 ++ ++ Merge pull request #32 from alex/patch-1 ++ ++ Fix for a crasher due to misaligned stack on x86-32. ++ ++commit 7e1b32649efd24814e86172e196f390566f9e970 ++Merge: f308faf ee18766 ++Author: Anthony Green ++Date: Sat Mar 16 04:24:40 2013 -0700 ++ ++ Merge pull request #32 from alex/patch-1 ++ ++ Fix for a crasher due to misaligned stack on x86-32. ++ ++commit ee18766b169811426c14b011fbb46d81e344f926 ++Author: Alex Gaynor ++Date: Thu Mar 14 15:00:33 2013 -0700 ++ ++ Fix for a crasher due to misaligned stack on x86-32. ++ ++ Full information on reproduction (using Python's ctypes available here: http://bugs.python.org/issue17423) ++ ++commit f308faf1eabaf8dc24966ab17fbf94368f46b9c7 ++Author: Anthony Green ++Date: Mon Feb 11 14:25:13 2013 -0500 ++ ++ Add moxie support. Release 3.0.12. ++ ++commit 4ea22e54e3b143fe05c413f6dddd236af6bcbfb2 ++Author: Anthony Green ++Date: Sun Feb 10 08:48:38 2013 -0500 ++ ++ Update README ++ ++commit 10e77227b6ae85f46f28590bfb09ca3608554358 ++Author: Anthony Green ++Date: Sun Feb 10 08:47:26 2013 -0500 ++ ++ mend ++ ++commit a9521411a53d58f2bf88199242200ceb0d4dae3a ++Author: Anthony Green ++Date: Sat Feb 9 06:54:40 2013 -0500 ++ ++ sparc v8 and testsuite fixes ++ ++commit 70b11b47eea93bf43627588d494d0b3b0d062481 ++Author: Anthony Green ++Date: Fri Feb 8 16:12:19 2013 -0500 ++ ++ Fix small struct passing on ppc ++ ++commit 63ba1fa79f7c4ce42de848debe233aab31aecb51 ++Author: Anthony Green ++Date: Fri Feb 8 15:18:19 2013 -0500 ++ ++ Remove xfail for arm*-*-*. ++ ++commit 24fbca4c1d57d4ea628c0a8ba643684daf54a37e ++Author: Anthony Green ++Date: Fri Feb 8 14:19:56 2013 -0500 ++ ++ Fix typo ++ ++commit b0fa11cb0a94ce6baca058eab9b10e40475e71d6 ++Author: Anthony Green ++Date: Fri Feb 8 14:17:13 2013 -0500 ++ ++ More man page cleanup ++ ++commit 8bd15d139a58a6e46dc90a1cb2d89f59f32f06c7 ++Author: Anthony Green ++Date: Fri Feb 8 13:56:37 2013 -0500 ++ ++ Fix many.c testcase for ppc ++ ++commit 7aab825cf198be85490d3cd80e778d415d85ad9b ++Author: Anthony Green ++Date: Fri Feb 8 13:26:21 2013 -0500 ++ ++ Add missing files to dist ++ ++commit cb03ea8f4eb08024e44abe4392edc77b89fbfbad ++Author: Anthony Green ++Date: Fri Feb 8 12:25:18 2013 -0500 ++ ++ sparc v9 fixes for sun tools ++ ++commit 35ee8d44f31dd3d3b88083c837dc351593e13cc2 ++Author: Anthony Green ++Date: Fri Feb 8 07:12:41 2013 -0500 ++ ++ Fix microblaze big-endian struct issue ++ ++commit 9db7e1a958fc484ba149efe027008b9a170395fb ++Author: Anthony Green ++Date: Thu Feb 7 21:06:08 2013 -0500 ++ ++ Fix botched sparc patch. Update version. ++ ++commit ce0138e61455f268af326e26908b9680ec2c4bea ++Author: Anthony Green ++Date: Thu Feb 7 18:04:01 2013 -0500 ++ ++ Update bug report address. rc2. ++ ++commit fd07c9e40451e0ec1d0475cd54a83d45ccaea2c0 ++Author: Anthony Green ++Date: Thu Feb 7 18:00:36 2013 -0500 ++ ++ Add cache flushing routine for sun compiler on sparc solaris 2.8 ++ ++commit ed6ae9501b2bab45daf93b4935eb0c977635b763 ++Author: Anthony Green ++Date: Thu Feb 7 16:43:36 2013 -0500 ++ ++ Add libtool-ldflags. Define toolexeclibdir for non-GCC builds. ++ ++commit ffef2e046aaec853be356f0b8770a335185ea9cf ++Author: Anthony Green ++Date: Thu Feb 7 15:47:01 2013 -0500 ++ ++ x32 and libtool fixes ++ ++commit 95eecebb2858dc6f1495a61072ff36d0a8127144 ++Author: Anthony Green ++Date: Thu Feb 7 15:32:46 2013 -0500 ++ ++ Remove a.out cruft from dist ++ ++commit 176aa9d2e23d9cd57d6f250692d910b408f9a651 ++Author: Anthony Green ++Date: Thu Feb 7 15:29:22 2013 -0500 ++ ++ Fix GCC usage test and update README ++ ++commit f3a4f3fdde89b04d66983a42a25d09161c5d4d54 ++Author: Anthony Green ++Date: Thu Feb 7 09:57:20 2013 -0500 ++ ++ Fixes for AIX xlc compiler. ++ ++commit 522f8fef49848927482bc63c94afaea5b84e5ec1 ++Author: Anthony Green ++Date: Wed Feb 6 20:31:31 2013 -0500 ++ ++ Fix man page. Clean out junk. ++ ++commit c4dfa259eb4e8e6f4c397868d7fee80aa0bb6a12 ++Author: Anthony Green ++Date: Wed Feb 6 17:43:24 2013 -0500 ++ ++ Bump soversion ++ ++commit f62bd63fe6123cadedb8b2b2c72eb549c40fbce9 ++Author: Anthony Green ++Date: Wed Feb 6 17:38:32 2013 -0500 ++ ++ Release candidate 1 ++ ++commit f7cd61e9e68a4a51147df04d75bfe5b91b9d9286 ++Author: Anthony Green ++Date: Wed Feb 6 17:38:04 2013 -0500 ++ ++ Fix pkgconfig install bits ++ ++commit 6a790129427121f7db2d876e7218a3104e6d2741 ++Author: Anthony Green ++Date: Wed Feb 6 17:37:15 2013 -0500 ++ ++ Work around LLVM ABI problem on x86-64 ++ ++commit 370112938e705128fd5dd4017fc1a1210bd0271a ++Merge: bada2e3 bcc0c28 ++Author: Anthony Green ++Date: Sun Jan 27 05:09:04 2013 -0800 ++ ++ Merge pull request #28 from jralls/master ++ ++ Reorder x86_64 checks ++ ++commit bcc0c28001b6d427d5cd8037d2e3c892babc6b4c ++Author: John Ralls ++Date: Sat Jan 26 15:21:14 2013 -0800 ++ ++ Reorder x86_64 tests ++ ++ So that darwin and cygwin/mingw are tested before the generic check -- ++ which allows them to actually be set. ++ ++commit bada2e326d9a9acf3ae40cfa4f5d7a9ba97b2ea8 ++Author: Anthony Green ++Date: Mon Jan 21 08:02:07 2013 -0500 ++ ++ Update README ++ ++commit 655bb8f3690feba8e840a5f1854b1d78ed08f692 ++Merge: 1035ffb 840f975 ++Author: Anthony Green ++Date: Mon Jan 21 08:01:24 2013 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit 1035ffb2f468e1a1c401d58cff7e7abb69838e68 ++Merge: aeb8719 4086024 ++Author: Anthony Green ++Date: Mon Jan 21 07:55:53 2013 -0500 ++ ++ Update README ++ ++commit 840f975866052fdd91b2c224d56e01ae5900b60d ++Merge: aeb8719 4086024 ++Author: Anthony Green ++Date: Mon Jan 21 07:55:53 2013 -0500 ++ ++ Merge branch 'master' of github.com:/atgreen/libffi ++ ++commit aeb8719a34756969970603fca4568530d56708af ++Author: Anthony Green ++Date: Mon Jan 21 07:37:30 2013 -0500 ++ ++ New microblaze support ++ ++commit 40860245a4fd91a1b88adc9171ec993c549e45d5 ++Author: Anthony Green ++Date: Mon Jan 21 07:37:30 2013 -0500 ++ ++ New microblaze support ++ ++commit 20cae32b152b43679ae65a85db9a1c6bb8a143dd ++Author: Anthony Green ++Date: Mon Jan 21 07:07:38 2013 -0500 ++ ++ Xtensa support ++ ++commit 9742f91782faef4a15941508a22c408fb7d1d227 ++Author: Anthony Green ++Date: Mon Jan 21 07:03:41 2013 -0500 ++ ++ Mention IBM XL compiler support on AIX. ++ ++commit f03eab08248f122ce3b623a18df9e19fae1b6e98 ++Author: Anthony Green ++Date: Fri Jan 11 17:14:11 2013 -0500 ++ ++ Remove obsolete inline test functions ++ ++commit 05fbe1faedc7b2580d5f14010d00e9e3cee73951 ++Author: Anthony Green ++Date: Fri Jan 11 16:54:40 2013 -0500 ++ ++ xlc compiler support ++ ++commit 0b4986a7889ed1864674192228f1162c1b5770a8 ++Author: Anthony Green ++Date: Fri Jan 11 11:19:52 2013 -0500 ++ ++ [travis] install dejagnu with sudo ++ ++commit 3c337eef51ab9a4993fc875bfa26289dd6a08881 ++Author: Anthony Green ++Date: Fri Jan 11 11:18:14 2013 -0500 ++ ++ [travis] install dejagnu ++ ++commit 90720962ce1baf9fc35d1bde1738102bcd5bd5ed ++Author: Anthony Green ++Date: Fri Jan 11 10:57:30 2013 -0500 ++ ++ Add first travis config file ++ ++commit bff052d9cd5be41ba9e47c76114054af487d3c30 ++Author: Anthony Green ++Date: Fri Jan 11 10:24:32 2013 -0500 ++ ++ 32-bit x86 fix and more ++ ++commit cd41aeab6176f839167955c016ecc19f65f75df3 ++Author: Anthony Green ++Date: Thu Jan 10 17:25:45 2013 -0500 ++ ++ Add compiler column to table ++ ++commit 8bf987d4df7c4d21435b9211f6cc86abf5904b42 ++Author: Anthony Green ++Date: Thu Jan 10 17:24:51 2013 -0500 ++ ++ Fix for sunpro compiler on Solaris ++ ++commit 3ee74fd6dc8ccd32b608bbff73526838fc34f70b ++Author: Anthony Green ++Date: Thu Jan 10 17:15:03 2013 -0500 ++ ++ Update documentation version. ++ ++commit 13e2d7b92557a9511a0414df82bf2df3edc55cba ++Author: Anthony Green ++Date: Thu Jan 10 10:52:02 2013 -0500 ++ ++ Handle both 32 and 64-bit x86 builds regardless of target triple ++ ++commit 5141543000fc86a3d49a907a2313713ee79e504d ++Author: Anthony Green ++Date: Thu Jan 10 07:35:53 2013 -0500 ++ ++ Don't run EH tests with non-GNU compiler ++ ++commit 56ba8d86f47937a0afb81a2b9e77c9d235d9db45 ++Author: Anthony Green ++Date: Thu Jan 10 07:25:10 2013 -0500 ++ ++ Don't use warning checking macro with sun compiler ++ ++commit 6a028caec1b2c7904feb4c4f9cb7e1125e1d1b60 ++Author: Anthony Green ++Date: Thu Jan 10 01:19:43 2013 -0500 ++ ++ Don't use GCCisms to define types when ++ + building with the SUNPRO compiler. ++ ++commit 2d9b3939751b3ef9739049509d353ade10b32a8f ++Author: Anthony Green ++Date: Wed Jan 9 21:14:54 2013 -0500 ++ ++ Fix for closures with sunpro compiler ++ ++commit 8308984e479e3274a36e98e8272b5adbb6b774c2 ++Author: Anthony Green ++Date: Tue Jan 8 15:14:21 2013 -0500 ++ ++ Make sure we're running dejagnu tests with the right compiler. ++ ++commit f26c7ca67147450db2fe25ea932944e6cf145d5c ++Author: Anthony Green ++Date: Tue Jan 8 14:47:05 2013 -0500 ++ ++ Make compiler options in dejagnu runs compiler specific ++ ++commit 74c776e21907fc2e59257c021f23077f8b7966cb ++Author: Anthony Green ++Date: Tue Jan 8 12:25:54 2013 -0500 ++ ++ Switch x86 Solaris to X86 from X86_64 ++ ++commit 8962c8c8d06803e310bac0ffc8e84ea15daeff3f ++Author: Anthony Green ++Date: Tue Jan 8 12:22:24 2013 -0500 ++ ++ Fix read-only eh_frame test ++ ++commit 35ddb69c2b49746d940e919ca226ecc1be94f14a ++Author: Anthony Green ++Date: Tue Jan 8 07:53:37 2013 -0500 ++ ++ Only emit DWARF unwind info when building with GCC ++ ++commit f7879bc3f3a8d0bbfcc38771732c160a58ba9cd8 ++Author: Anthony Green ++Date: Tue Jan 8 07:30:28 2013 -0500 ++ ++ Testsuite fix for Solaris vendor compiler ++ ++commit 67cea90fc0897021466fd102671019d30db474cd ++Author: Anthony Green ++Date: Mon Jan 7 06:30:24 2013 -0500 ++ ++ mend ++ ++commit 0de3277b18cf54be3b81d509b9be9b47d9bc1e82 ++Author: Thorsten Glaser ++Date: Mon Dec 3 00:02:31 2012 +0000 ++ ++ Testsuite fixes (was Re: [PATCH] Fix libffi on m68k-linux-gnu, completely) ++ ++ Dixi quod… ++ ++ >although I believe some 3.0.11 checks to be broken: ++ ++ And indeed, with a few minor changes on top of git master, ++ I still get a full run of PASS plus one XPASS on amd64-linux! ++ ++ With the other patches (from this message’s parent) and ++ these applied, I get a full PASS on m68k-linux as well. ++ ++ So, please git am these three diffs ☺ ++ ++ bye, ++ //mirabilos ++ -- ++ FWIW, I'm quite impressed with mksh interactively. I thought it was much ++ *much* more bare bones. But it turns out it beats the living hell out of ++ ksh93 in that respect. I'd even consider it for my daily use if I hadn't ++ wasted half my life on my zsh setup. :-) -- Frank Terbeck in #!/bin/mksh ++ From 5cb15a3bad1f0fb360520dd48bfc938c821cdcca Mon Sep 17 00:00:00 2001 ++ From: Thorsten Glaser ++ Date: Sun, 2 Dec 2012 23:20:56 +0000 ++ Subject: [PATCH 1/2] Fix tests writing to a closure retval via pointer casts ++ ++ As explained in ++ all other tests that do the same cast to an ffi_arg pointer instead. ++ ++ PASS on amd64-linux (Xen domU) and m68k-linux (ARAnyM) ++ ++ Signed-off-by: Thorsten Glaser ++ ++commit 8f4772f383abd71cfa141c8a70ba11c1aa4ebe2c ++Author: Anthony Green ++Date: Mon Jan 7 06:14:53 2013 -0500 ++ ++ m68k fixes for signed 8 and 16-bit calls. ++ ++commit ea7f8440d58afbebb181e295ff564fdf3d6590a0 ++Author: Anthony Green ++Date: Fri Jan 4 09:09:32 2013 -0500 ++ ++ remove gcc-ism ++ ++commit f06c0f10377ac04eeba5e632dbe5c62c629df4e6 ++Author: Anthony Green ++Date: Wed Jan 2 09:39:17 2013 -0500 ++ ++ Add missing ChangeLog entry and generated files. ++ ++commit 1f8675d4c101d19d67ca0a55ff2ba973349558ad ++Merge: 335f419 f6b58d2 ++Author: Anthony Green ++Date: Wed Jan 2 06:34:38 2013 -0800 ++ ++ Merge pull request #26 from rofl0r/master ++ ++ fix build error on ppc when long double == double ++ ++commit 335f419a86090cda9f215d149572f9481c3ad034 ++Merge: 53236d5 6d6f711 ++Author: Anthony Green ++Date: Wed Jan 2 06:30:03 2013 -0800 ++ ++ Merge pull request #23 from rurban/master ++ ++ cygwin/mingw shared libs need libtool LDFLAGS = -no-undefined ++ ++commit 53236d5061034cc0a7f4647fc1bd05ba1aeb3d2a ++Author: Anthony Green ++Date: Wed Jan 2 09:24:55 2013 -0500 ++ ++ Regenerate files ++ ++commit 72222ca3fbe560e13c8dc89ca441b28b7cc74daf ++Author: Anthony Green ++Date: Wed Jan 2 09:06:38 2013 -0500 ++ ++ Update texinfo.tex ++ ++commit 1e326c95431fc9896422fa36659f3e833852579c ++Author: Anthony Green ++Date: Wed Jan 2 09:05:02 2013 -0500 ++ ++ Update config.guess and config.sub ++ ++commit cb6671f5b8a9596ff968c6b6c304f70adf71b368 ++Author: Anthony Green ++Date: Wed Jan 2 08:56:07 2013 -0500 ++ ++ Missing .gitignore changes for xcode support ++ ++commit ebbe77966855395a2a47ed2c09a38f93eb0481cf ++Author: Anthony Green ++Date: Wed Jan 2 08:54:05 2013 -0500 ++ ++ missed x32 libtool patch. ++ ++commit 4394096da0aca0dd422b479a043c18b4f05c5770 ++Author: Anthony Green ++Date: Wed Jan 2 08:51:35 2013 -0500 ++ ++ missed trampoline_table patch. Move to GCC. ++ ++commit ed7a59c3ff7c84bd95c374a5aff21599f705e6dc ++Author: Anthony Green ++Date: Wed Jan 2 08:48:01 2013 -0500 ++ ++ Windows symbol export fix. Move to GCC. ++ ++commit ccee09a4ff843b11c7d8b6819776f57d187305c7 ++Author: Anthony Green ++Date: Wed Jan 2 08:41:55 2013 -0500 ++ ++ +2012-03-21 Peter Rosin ++ + ++ + * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] ++ + (set_ld_library_path_env_vars): Add the library search dir to PATH ++ + (and save PATH for later). ++ + (restore_ld_library_path_env_vars): Restore PATH. ++ ++commit 089dbce7cc0889eb26444d89ae062c73c69f26f0 ++Author: Anthony Green ++Date: Wed Jan 2 08:37:35 2013 -0500 ++ ++ med ++ ++commit 980a334c42b4b0eff32e55929ec6727d1326b05d ++Author: Anthony Green ++Date: Wed Jan 2 07:36:42 2013 -0500 ++ ++ Test GCC update ++ ++commit 8bad679ade5000e57cdc9cacde22e8b99840930f ++Author: Anthony Green ++Date: Wed Jan 2 08:28:35 2013 -0500 ++ ++ New stand-alone patch ++ ++commit 981c32ee115e9f0d6546a74592875e138222a9d1 ++Author: Anthony Green ++Date: Wed Jan 2 07:34:03 2013 -0500 ++ ++ Merge with GCC. Eliminate quilt bits. ++ ++commit 61a054929517fb80c437ba71c91f3e20cfff581a ++Author: Anthony Green ++Date: Wed Nov 28 06:07:41 2012 -0500 ++ ++ Refresh config.guess and config.sub ++ ++commit f6b58d2bdc0a24ce94dedce59802f091979df265 ++Author: rofl0r ++Date: Thu Nov 22 16:26:21 2012 +0100 ++ ++ fix build on ppc when long double == double ++ ++commit 69da33a0761aeac73f9e9646269da61c906d6020 ++Author: Anthony Green ++Date: Mon Nov 12 15:25:47 2012 -0500 ++ ++ Pull in config.sub for aarch64 support and more ++ ++commit f680b598b7bdde325ac9349e8c35151c228bf2df ++Author: Anthony Green ++Date: Tue Nov 6 16:00:40 2012 -0500 ++ ++ Add missing aarch64 configury bits ++ ++commit dfadfb19853c57c8623c436d0ef2bdafab24b433 ++Author: Anthony Green ++Date: Wed Oct 31 06:46:41 2012 -0400 ++ ++ Rebase for ppc64 fix ++ ++commit e944b8c7eb1e2eeb9c0f3b9742b4d7f476860ce1 ++Author: Anthony Green ++Date: Tue Oct 30 14:06:09 2012 -0400 ++ ++ Add PaX work-around ++ ++commit 9ccd51be1fdeb99f8b4f42f905166c2abbba8ac0 ++Merge: f342996 fa5d747 ++Author: Anthony Green ++Date: Tue Oct 30 13:37:37 2012 -0400 ++ ++ Fix commit conflicts ++ ++commit f342996cb50eb23b868afcff5ac0cdbb6b505d63 ++Author: Anthony Green ++Date: Tue Oct 30 07:42:27 2012 -0400 ++ ++ Darwin12 fix ++ ++commit 58e8b66f70cef2e3c9b0e5a707b45d634cbbf5d9 ++Author: Anthony Green ++Date: Tue Oct 30 07:07:19 2012 -0400 ++ ++ AArch64 port ++ ++commit fa5d747905472571fd472c07d4726017624f66b3 ++Author: Anthony Green ++Date: Tue Oct 30 07:07:19 2012 -0400 ++ ++ AArch64 port ++ ++commit 6993a6686f43f2313b18142c1e96189a27db2aa3 ++Author: Anthony Green ++Date: Tue Oct 30 06:59:32 2012 -0400 ++ ++ Fix autoconf macros ++ ++commit 70084e70ddb13b29dd05c751b1904de206bbe790 ++Author: Anthony Green ++Date: Fri Oct 12 23:55:06 2012 -0400 ++ ++ Update Tile* port info ++ ++commit 9c00a3f6742d61404b31268cc773e7130ff43331 ++Author: Anthony Green ++Date: Fri Oct 12 16:46:06 2012 -0400 ++ ++ TILE-Gx/TILEPro support ++ ++commit 048d2f41c3a6664b4b64bf21e804686662da4160 ++Author: Anthony Green ++Date: Thu Oct 11 10:55:25 2012 -0400 ++ ++ Rebase ++ ++commit 6d6f71108064f5069edd7bf771059d3b82640135 ++Author: Reini Urban ++Date: Sat Jul 7 12:42:00 2012 -0500 ++ ++ cygwin/mingw shared libs need libtool LDFLAGS = -no-undefined ++ ++ otherwise only static libs are created. ++ ++commit d330f19292da8f39a78a9e2b0ba08df8094e3bc5 ++Author: Nicolas Lelong ++Date: Sat May 5 09:37:02 2012 -0400 ++ ++ iOS build fixes. ++ ++commit 09b23cfc1d6d15361eee18818851fd3cacb26559 ++Author: Anthony Green ++Date: Fri Apr 27 08:29:48 2012 -0400 ++ ++ Update README with Blackfin/uClinux support ++ ++commit 213ed15c70e72d666154c08e2b41dae3f61f20d3 ++Author: Anthony Green ++Date: Fri Apr 27 01:34:15 2012 -0400 ++ ++ Add blackfin supprt from Alexandre Keunecke. ++ ++commit ff3d76fd427382ce7d2b2ed54acdd0bce470ca4f ++Author: Anthony Green ++Date: Wed Apr 11 23:16:48 2012 -0400 ++ ++ 3.0.11 ++ ++commit 7e0a412c4fd9cbe77b467a9bf86f56aea62632c3 ++Author: Anthony Green ++Date: Wed Apr 11 22:47:44 2012 -0400 ++ ++ Update files to ship ++ ++commit 39e6a5860416f7bad992149817e1da1ba7c460d4 ++Author: Zachary Waldowski ++Date: Wed Apr 11 22:39:46 2012 -0400 ++ ++ More mac/ios build improvements ++ ++commit 853cc722a16f8d1254573ef3bb73c7b8f3d8a110 ++Author: Anthony Green ++Date: Tue Apr 10 06:33:33 2012 -0400 ++ ++ Fix typo for darwin targets ++ ++commit 3f5023068cda07a3dd6dacbaa875a5b5fc96d4bb ++Author: Anthony Green ++Date: Fri Apr 6 20:34:51 2012 -0400 ++ ++ mend ++ ++commit ebb8e8945681ce0af7a5c47a980287e8ece84b84 ++Author: Mike Lewis ++Date: Fri Apr 6 20:02:08 2012 -0400 ++ ++ Build iOS library with xcode ++ ++commit a098b44f4c592c2192fcdef4fad6108eb3f4301c ++Author: Anthony Green ++Date: Fri Apr 6 17:04:35 2012 -0400 ++ ++ Reapply missing testsuite changes for arm ++ ++commit 10d1e51393f08c14045db85843208f44f9f1e9ba ++Author: Anthony Green ++Date: Fri Apr 6 11:57:14 2012 -0400 ++ ++ Update to rc4. Upgrade autoconf version. ++ ++commit 9bcc884276dc0a807b2605e510b11b1740dd9aa2 ++Author: Anthony Green ++Date: Fri Apr 6 11:53:07 2012 -0400 ++ ++ Fix Linux/x32 reference in README ++ ++commit a044a56b1cd2a0924f5ec0d6b5a5089d14fcd1a1 ++Author: Anthony Green ++Date: Fri Apr 6 10:39:10 2012 -0400 ++ ++ Linux/x32 libtool fix ++ ++commit 59bb61a36661b972e8443531d3b7bc736e131a4b ++Author: Anthony Green ++Date: Fri Apr 6 08:26:14 2012 -0400 ++ ++ Update libtool version, README, tests dists ++ ++commit f2981454cbe25cf9411b710f46c5f5552003a123 ++Author: Anthony Green ++Date: Thu Apr 5 15:45:19 2012 -0400 ++ ++ Revert debug code changes ++ ++commit 39dccddb606f6fdb8dcb177d416e884041da6e30 ++Author: Zachary Waldowski ++Date: Thu Apr 5 12:32:41 2012 -0400 ++ ++ Fix building with Clang for Darwin (OS X 10.6+ and iOS ++ 4.0+) ++ ++commit 3afaa9a34a81a305227ae8cf4f12b9d0484d055e ++Author: Peter Rosin ++Date: Tue Apr 3 07:40:31 2012 -0400 ++ ++ Fix return_uc.c test case on windows. ++ ++commit 65f40c35a2873d8328359ec4512bd0736dbe32c7 ++Author: Anthony Green ++Date: Tue Apr 3 07:35:59 2012 -0400 ++ ++ Repair ppc build regression. ++ ++commit 0a1ab12a8d15caa894116a82249551f23ef65612 ++Author: Peter Rosin ++Date: Fri Mar 30 08:14:08 2012 -0400 ++ ++ Various MSVC-related changes. ++ ++commit e1539266e6c6dde3c99832323586f33f977d1dc0 ++Author: Anthony Green ++Date: Fri Mar 30 00:40:18 2012 -0400 ++ ++ ARM VFP fix for old toolchains ++ ++commit 7c5e60b5f47d725036a72162f136272bc407e3a1 ++Author: Anthony Green ++Date: Thu Mar 29 08:48:22 2012 -0400 ++ ++ Rebase on fixed GCC sources ++ ++commit e72ed5eeaa9cfb0fdc86f6b3422734177b659f96 ++Author: Anthony Green ++Date: Wed Mar 21 09:52:28 2012 -0400 ++ ++ Fix vararg float test ++ ++commit bd78c9c3311244dd5f877c915b0dff91621dd253 ++Author: Anthony Green ++Date: Wed Mar 21 08:09:30 2012 -0400 ++ ++ More cygwin fixes ++ ++commit 84d3253f86dad6b4f261231935675d35fd964b05 ++Author: Anthony Green ++Date: Mon Mar 19 23:07:35 2012 -0400 ++ ++ Rebase post GCC merge ++ ++commit 964c5b93f80dcaacf73056b7d15a4d2b4b7a217c ++Author: Anthony Green ++Date: Sat Mar 3 14:46:20 2012 -0500 ++ ++ abi check fixes and Linux/x32 support ++ ++commit 6c194233a5f6f1d274669afc5924a9e1f69d4876 ++Author: Anthony Green ++Date: Sat Mar 3 14:17:54 2012 -0500 ++ ++ Add -no-undefined for both 32- and 64-bit x86 ++ windows-like hosts. ++ ++commit 8360bf1cd0aba8db5582266da70467de7e89a57a ++Author: Anthony Green ++Date: Thu Feb 23 07:01:13 2012 -0500 ++ ++ Ensure that users don't include ffitarget.h directly ++ ++commit d578b89619cf3d2baff027b203619dc307fc12e3 ++Author: Anthony Green ++Date: Wed Feb 15 00:18:18 2012 -0500 ++ ++ Fix ABI check regression ++ ++commit dee20f8e45c486f5018f31e09bb362992aa498c3 ++Author: Anthony Green ++Date: Fri Feb 10 13:06:46 2012 -0500 ++ ++ Rebased from gcc ++ ++commit 4130e1972d001143e5e9f3c6b65f2a6f9524169e ++Author: Anthony Green ++Date: Fri Feb 3 13:18:27 2012 -0600 ++ ++ Refresh autoconf-archive m4 scripts ++ ++commit 1ff9c604bb214b5a305064af1049577ef783730a ++Author: Anthony Green ++Date: Wed Feb 1 16:34:30 2012 -0600 ++ ++ Rebase from GCC ++ ++commit 211060eb8f714af0e935430efa6bb45e8e3ffc5d ++Author: Anthony Green ++Date: Mon Jan 23 14:24:01 2012 -0500 ++ ++ Alpha fix ++ ++commit 78d9c638ba0de6edfbc603fd65d19c6562663248 ++Author: Anthony Green ++Date: Mon Jan 23 14:17:24 2012 -0500 ++ ++ mend ++ ++commit afaf3381604bd81803d8a5f3bf4d462299f1aac3 ++Author: Anthony Green ++Date: Mon Jan 23 14:17:13 2012 -0500 ++ ++ mend ++ ++commit 9e9c4aeb77de5608d602109f22100c1c0c79faad ++Author: Anthony Green ++Date: Mon Jan 23 14:11:23 2012 -0500 ++ ++ Add Amiga support ++ ++commit 8efc0b1f4027d5a3cbf205e55d422d94e60f3226 ++Author: Anthony Green ++Date: Mon Jan 23 13:47:38 2012 -0500 ++ ++ Unlikely fixes ++ ++commit 1df51398ae183dc208ba4599ee867278b04d13d3 ++Author: Anthony Green ++Date: Mon Jan 23 13:43:59 2012 -0500 ++ ++ mend ++ ++commit cd2277cc796b96b149cd284ae85326529fe7fb9c ++Author: Anthony Green ++Date: Mon Jan 23 13:43:38 2012 -0500 ++ ++ mend ++ ++commit 164e6fe04b189746c8bd5810c6e3e919770bb9d4 ++Author: Anthony Green ++Date: Mon Jan 23 12:41:06 2012 -0500 ++ ++ m68k fixes ++ ++commit c365ee7577bef00cb3c2c0b5224147aea04138d8 ++Author: Anthony Green ++Date: Mon Jan 23 11:13:18 2012 -0500 ++ ++ Refresh ++ ++commit f22c38bbd93bcc0c04bf26c3e414556b3177c385 ++Author: Anthony Green ++Date: Fri Nov 18 15:13:41 2011 -0500 ++ ++ Update variadic patch ++ ++commit 03e9ee321a3c208f88d2432587ce40b2bb2430ba ++Author: Anthony Green ++Date: Fri Nov 18 15:13:00 2011 -0500 ++ ++ Fix cls_double_va.c and update docs ++ ++commit 95f31151ec792809cfb80d385350f9f56d95aa25 ++Author: Anthony Green ++Date: Sat Nov 12 23:46:05 2011 -0500 ++ ++ Rerun automake ++ ++commit 198ed1ef85cf18342627f8d44bc3f12c9975a49d ++Author: Anthony Green ++Date: Sat Nov 12 23:45:20 2011 -0500 ++ ++ Update version number ++ ++commit 4f17e1f142e805b13959ba2594ee735eae439f4e ++Author: Anthony Green ++Date: Sat Nov 12 17:22:24 2011 -0500 ++ ++ Fix last patch ++ ++commit ff9454da44859716a5bd4eaa344499288c79694f ++Author: Anthony Green ++Date: Sat Nov 12 17:18:51 2011 -0500 ++ ++ Add David Gilbert's variadic function call support ++ ++commit ea14ae85e8f54ff046b7fb8a9cfe349475272044 ++Author: Anthony Green ++Date: Sat Nov 12 16:36:59 2011 -0500 ++ ++ clean up ++ ++commit 52891f8a93f9b8de801cca4cf05639422dc9773e ++Author: Anthony Green ++Date: Sat Nov 12 16:35:55 2011 -0500 ++ ++ Add powerpc soft float support ++ ++commit c8f1bde8e2566c5a87474b4d08aa934d6d28ee75 ++Author: Anthony Green ++Date: Sat Nov 12 16:21:02 2011 -0500 ++ ++ Remove junk file ++ ++commit 6a6e7f862f3cc677e19131587caa619e7f9c7ffd ++Author: Anthony Green ++Date: Sat Nov 12 16:20:42 2011 -0500 ++ ++ Fix kfreebsd ++ ++commit d52fbed05ccbdee9ed8b9c911cbb4f85b0ff0f2a ++Author: Anthony Green ++Date: Sat Nov 12 16:13:41 2011 -0500 ++ ++ Add missing ChangeLog entry ++ ++commit 322052ce65c4fdac85bedc24726fd0e0094ba521 ++Author: Anthony Green ++Date: Sat Nov 12 16:11:49 2011 -0500 ++ ++ Fix arm wince alignment issue ++ ++commit af18df2bc2f52df81e7b5c619bd86db8489dc873 ++Author: Anthony Green ++Date: Sat Nov 12 15:52:08 2011 -0500 ++ ++ Remove use of ppc string instructions ++ ++commit 236c9391321f83ad40daf03f40c35c9ebc1da6b3 ++Author: Anthony Green ++Date: Sat Nov 12 07:37:40 2011 -0500 ++ ++ Fix darwin11 build problem ++ ++commit c411f140f305ebb00d33c92b7cb2742bcd241b6a ++Author: Anthony Green ++Date: Sat Nov 12 07:32:36 2011 -0500 ++ ++ Fix ax_enable_builddir macro on BSD systems ++ ++commit 3d56106b07735abef6ae9f032e94f560a0ed2f30 ++Author: Anthony Green ++Date: Sat Nov 12 07:20:24 2011 -0500 ++ ++ Rebase ++ ++commit 8c01954c50bf8ef2e00a3db166060a1b8f83a20d ++Author: Anthony Green ++Date: Tue Sep 6 14:26:32 2011 -0400 ++ ++ Build assembly files with debug info ++ ++commit fed646a2078969f4ce89c29107f1e72e03f4a977 ++Author: Anthony Green ++Date: Tue Sep 6 09:50:20 2011 -0400 ++ ++ Regenerate configury with missing m4 macros ++ ++commit d76441cf71216f8f1e62e7ec852a7f4e21371ec8 ++Author: Anthony Green ++Date: Wed Aug 24 10:14:23 2011 -0400 ++ ++ Update list of supported OpenBSD systems ++ ++commit ee6696fdf4768ba6dd037fb6dd99435afa13816e ++Author: Anthony Green ++Date: Tue Aug 23 12:30:29 2011 -0400 ++ ++ 3.0.11-rc1. soname bump. ++ ++commit c6265c36a91eab8175d0e72db84d8225418f2379 ++Author: Anthony Green ++Date: Tue Aug 23 10:31:33 2011 -0400 ++ ++ Version 3.0.10 ++ ++commit cc5e41bf32d18a14dbdd653d52eacdbdc934c392 ++Author: Anthony Green ++Date: Mon Aug 22 16:34:24 2011 -0400 ++ ++ Fix use of autoconf macros ++ ++commit 049d8386ff52399e69a530b55b9feedc8a2589d2 ++Author: Anthony Green ++Date: Mon Aug 22 14:50:10 2011 -0400 ++ ++ Many new patches ++ ++commit 3b7efa4e74f0dcebf70b447391987aedd3473306 ++Author: Anthony Green ++Date: Mon Aug 15 13:25:13 2011 -0400 ++ ++ Revert remove-debug-code patch temporarily (for ARM Fedora release) ++ ++commit d992ac54a2a9e7e064ffebcb91e05e7cb86185c7 ++Author: Anthony Green ++Date: Fri Jul 29 17:32:53 2011 -0400 ++ ++ Refresh from GCC ++ ++commit 2d3fb36420e09304220ee6c0652bae5eccdb965d ++Author: Anthony Green ++Date: Wed Mar 30 16:54:42 2011 -0400 ++ ++ Fix darwin EH ++ ++commit 30ff28e1d8cd9ed5319f1fbe9c7cccacc8161fb3 ++Author: Anthony Green ++Date: Mon Feb 28 15:36:23 2011 -0500 ++ ++ Fix permissions ++ ++commit 09f8f310f4f53a24289682d3d28f4399d7bafc3b ++Author: Anthony Green ++Date: Mon Feb 28 15:36:07 2011 -0500 ++ ++ More AIX fixes. rc9. ++ ++commit 53d7b165642c220aa5166ba350b490802f359b54 ++Merge: 18dd85d 3000dc2 ++Author: Anthony Green ++Date: Mon Feb 28 15:23:31 2011 -0500 ++ ++ Merge branch 'master' of https://github.com/landonf/libffi-ios ++ ++commit 18dd85d6cb9f3f3eea2a3b70eb4e150045905c55 ++Author: Anthony Green ++Date: Fri Feb 25 16:23:04 2011 -0500 ++ ++ rc8. fix last patch. ++ ++commit 74ee6ea8b42e60d44a3ae8938b1e42a38c1e66b4 ++Author: Anthony Green ++Date: Fri Feb 25 15:52:14 2011 -0500 ++ ++ rc7. More AIX fixes. ++ ++commit 2541679dbd3db0014890f42192dbf8008ab923fa ++Author: Anthony Green ++Date: Fri Feb 25 15:09:13 2011 -0500 ++ ++ Fix ppc32 bug ++ ++commit cbb062cc35c518004f1ab45c847f8ec4f66069ad ++Author: Anthony Green ++Date: Thu Feb 17 20:39:21 2011 -0500 ++ ++ Another non-GCC configury fix ++ ++commit 8cf8878425e9971866fa6b27a3e4914729ad3960 ++Author: Anthony Green ++Date: Tue Feb 15 15:19:49 2011 -0500 ++ ++ Fix ax_cc_maxopt.m4 ++ ++commit 24b72070c0937f9000744c77a636f07e04786b6a ++Author: Anthony Green ++Date: Mon Feb 14 15:30:57 2011 -0500 ++ ++ Fix warning and msvcc patches ++ ++commit d72c49e556a8c516e97f6722d1be2f1209c21207 ++Author: Anthony Green ++Date: Sun Feb 13 11:41:05 2011 -0500 ++ ++ Add missing msvcc.sh ++ ++commit 3000dc237f6017a7445d8404097a4f46b73fdd29 ++Merge: 55e4a5a 1fbf9dc ++Author: Landon Fuller ++Date: Sun Feb 13 08:55:53 2011 -0500 ++ ++ Merge remote branch 'upstream/master' ++ ++commit 1fbf9dc44feea564e84ad7406d17c5d5906ce0e0 ++Author: Anthony Green ++Date: Sun Feb 13 08:06:39 2011 -0500 ++ ++ Fix bad_abi test. rc5. ++ ++commit 90af15ef5c1614b76370c4d13954586fabf9e8e3 ++Author: Anthony Green ++Date: Sat Feb 12 12:29:36 2011 -0500 ++ ++ iOS fixes ++ ++commit 55e4a5aa1568558a04aa40f16fc022e459af53e3 ++Author: Landon Fuller ++Date: Sat Feb 12 12:13:46 2011 -0500 ++ ++ Add support for building a full armv6/armv7/i386 universal iOS library ++ ++commit a0c80f279b8733d001cb5e5c5a3289ecb7a6e56a ++Author: Landon Fuller ++Date: Sat Feb 12 11:43:49 2011 -0500 ++ ++ Update my e-mail address. ++ ++commit 8195e0e11df7a53fa474caa9375f73ca1136ed66 ++Author: Landon Fuller ++Date: Sat Feb 12 11:27:00 2011 -0500 ++ ++ Fix symbol prefixes on Darwin. ++ ++commit 56b3f8cef0f28cefaa0f40fe0cf7c524adef131d ++Author: Landon Fuller ++Date: Sat Feb 12 11:14:54 2011 -0500 ++ ++ Modify the ffi_closure structures to hold table/table entry pointers instead of a code buffer. ++ ++ This re-integrates commit da2773e02ab26cc11a7f. ++ ++commit 28a00f61ff3f64c4eb2269ce2aea3d493274469e ++Author: Landon Fuller ++Date: Sat Feb 12 11:01:48 2011 -0500 ++ ++ Apple assembler support; fixed most gas/ELF-isms. ++ ++commit 7f2ea33a80bfced5e48ed7292f3b8f057d54ff8f ++Author: Landon Fuller ++Date: Sat Feb 12 10:39:18 2011 -0500 ++ ++ Replace RETLDM macro. ++ ++ The macro is incompatible with Apple's assembler; switch to ++ a simple inline version. ++ ++commit 92ff23e77fa586455b427b71f49e1d9502470e6e ++Author: Landon Fuller ++Date: Sat Feb 12 10:24:49 2011 -0500 ++ ++ Switch to the current iOS 4.2 SDK. ++ ++commit 58fb8ca2dfb89ad70284bb9678d3d4dbb658c8a7 ++Merge: cc3fbd9 71c792f ++Author: Landon Fuller ++Date: Sat Feb 12 10:23:19 2011 -0500 ++ ++ Merge remote branch 'upstream/master' ++ ++commit cc3fbd975ce9366d4c40a6ff6c108f664867bd7c ++Merge: e449a43 f6ab3ed ++Author: Landon Fuller ++Date: Sat Feb 12 10:21:02 2011 -0500 ++ ++ Merge branch 'master' of github.com:landonf/libffi-ios ++ ++commit e449a43bbe12f8119399928db1ae26adc71dde14 ++Author: Landon Fuller ++Date: Sat Feb 12 10:20:42 2011 -0500 ++ ++ Allow specification of the minimum supported iOS version. ++ ++commit 71c792f51bcf3e2f334e5ea1fb1a8b667cb3aedb ++Author: Anthony Green ++Date: Sat Feb 12 09:33:11 2011 -0500 ++ ++ rc4 ++ ++commit 7c7c9f327299331022f6000603a35f2310dfe308 ++Author: Anthony Green ++Date: Sat Feb 12 09:29:29 2011 -0500 ++ ++ ungccify parts of the build ++ ++commit ed62e48b95a0fa60b685f647cb73c9e190eec35c ++Author: Anthony Green ++Date: Fri Feb 11 12:23:58 2011 -0500 ++ ++ Fix permissions ++ ++commit 17d9e9e68ddb1b915a0b9751713033861b598575 ++Author: Anthony Green ++Date: Fri Feb 11 12:23:20 2011 -0500 ++ ++ Use newer autotools. Only build debug.c when --enable-debug. ++ ++commit 6972a4ffda75761eaab7dfbe0fb1516b255e8e0c ++Author: Anthony Green ++Date: Fri Feb 11 07:32:51 2011 -0500 ++ ++ Fix xlc build on AIX ++ ++commit 1833aa0fb9831eb0725b63e35886c0f6d35df480 ++Author: Anthony Green ++Date: Fri Feb 11 07:11:04 2011 -0500 ++ ++ sparc ABI test fix. ++ ++commit f1fb139b4e283fffdcf205a903943d5e9d2bb2a2 ++Author: Anthony Green ++Date: Wed Feb 9 18:30:02 2011 -0500 ++ ++ Fix tests ++ ++commit 5cb470331d181c84d5d621e88868327a324a5898 ++Author: Anthony Green ++Date: Wed Feb 9 15:23:06 2011 -0500 ++ ++ Fix permissions ++ ++commit 269deef6dbbb426695919d3398357fada3bb288c ++Author: Anthony Green ++Date: Wed Feb 9 15:22:23 2011 -0500 ++ ++ rc3 ++ ++commit 42695e72504f647444b8e8e9b90bd24f1e3220e1 ++Author: Anthony Green ++Date: Wed Feb 9 15:12:35 2011 -0500 ++ ++ Fix IRIX support ++ ++commit a6e56b97f62a3feeb3301c24a2e4cae55e546021 ++Author: Anthony Green ++Date: Wed Feb 9 15:00:42 2011 -0500 ++ ++ Add powerpc64-*-darwin* support ++ ++commit 747d6c32d4abb07c10c3a1f93579c3929aaa2487 ++Author: Anthony Green ++Date: Wed Feb 9 14:56:23 2011 -0500 ++ ++ Add Interix support ++ ++commit eab6e41cde382aa07de6c011d514a14c0d62eb47 ++Author: Anthony Green ++Date: Wed Feb 9 10:15:02 2011 -0500 ++ ++ Remove README.markdown form libffi-ios ++ ++commit 69dbe845f4ee3e6ce8999f17a1e4f2179ef7da89 ++Author: Anthony Green ++Date: Wed Feb 9 07:38:43 2011 -0500 ++ ++ Fix xfails ++ ++commit f498318c07b95137fe259d86bdbe15347588b84a ++Author: Anthony Green ++Date: Wed Feb 9 06:26:46 2011 -0500 ++ ++ Update README for iOS again ++ ++commit 630b9c0ac43c7edcbfd892e23c09fb26724f4ac0 ++Author: Anthony Green ++Date: Wed Feb 9 06:24:23 2011 -0500 ++ ++ Update to rc2 ++ ++commit 0cad4386fa4c9ea5f8ca88b16247db4e5c8fea90 ++Author: Anthony Green ++Date: Wed Feb 9 06:11:46 2011 -0500 ++ ++ Add ChangeLog entry. Fix copyright headers. ++ ++commit 09cb76f2645bd2c151846e9249d8ea707ba01e8c ++Author: Anthony Green ++Date: Tue Feb 8 20:39:51 2011 -0500 ++ ++ Add missing change ++ ++commit 2e3a48ccdd54340983c46a29a0b41985e3e789ac ++Author: Anthony Green ++Date: Tue Feb 8 20:37:26 2011 -0500 ++ ++ Fix make dist ++ ++commit 5e4814d9928e236a2a4afe84d6e1d4fdaa473206 ++Author: Anthony Green ++Date: Tue Feb 8 19:46:28 2011 -0500 ++ ++ fix permissions ++ ++commit 5c0cc6f1536aa1738795a97303810a823c7fa2cb ++Author: Anthony Green ++Date: Tue Feb 8 19:45:59 2011 -0500 ++ ++ 3.0.10rc1 ++ ++commit 857fe3de46d2286afa2fe772920ecf4aefa1688f ++Author: Anthony Green ++Date: Tue Feb 8 19:39:20 2011 -0500 ++ ++ Clean ups ++ ++commit e2214f8adb5577c247452e2cc9f4cbe304d7ca9f ++Author: Anthony Green ++Date: Tue Feb 8 19:22:56 2011 -0500 ++ ++ Update README ++ ++commit 1106229a5721a659da5c231ec0e8211119615394 ++Merge: bc9d0be f6ab3ed ++Author: Anthony Green ++Date: Tue Feb 8 19:20:09 2011 -0500 ++ ++ Add iOS support ++ ++commit bc9d0be2958ce475757f34dd2c878948aa77a39f ++Author: Anthony Green ++Date: Tue Feb 8 17:04:26 2011 -0500 ++ ++ 3.0.10rc0 changes ++ ++commit 3b836249feae6d08d3e6887486e4b9961ddafa09 ++Author: Anthony Green ++Date: Tue Feb 8 14:28:59 2011 -0500 ++ ++ Rebase from GCC ++ ++commit a26e3940619faeba6de54824c9540c90b1aab513 ++Author: Anthony Green ++Date: Tue Feb 8 13:56:12 2011 -0500 ++ ++ copyright updates patch ++ ++commit b8099539f00e224107594101e9760b6dc081a056 ++Author: Anthony Green ++Date: Tue Feb 8 13:50:43 2011 -0500 ++ ++ Fix msvcc.sh botch ++ ++commit dc411e8f99113a34656bfd2d3ae51259972488cc ++Author: Anthony Green ++Date: Tue Feb 8 10:49:29 2011 -0500 ++ ++ Fix HP-UX build ++ ++commit 404585d1348e30ac58203bbd876d9131e5aed874 ++Author: Anthony Green ++Date: Tue Feb 8 10:44:36 2011 -0500 ++ ++ Fix sparc v8 aggregate type returns for sun's compiler ++ ++commit 19ce713188e193e4522740d24c20170411883d2d ++Author: Anthony Green ++Date: Tue Feb 8 10:34:23 2011 -0500 ++ ++ grammar fix ++ ++commit 89284fe55f1a8ad3bddbea796ee00d0e3ba411ce ++Author: Anthony Green ++Date: Tue Feb 8 10:19:19 2011 -0500 ++ ++ Fix AIX build with IBM XLC ++ ++commit ba022c338af97cb18d9f8ed5a607fd483a61c09c ++Author: Anthony Green ++Date: Tue Feb 8 10:12:48 2011 -0500 ++ ++ fix win64-underscore patch ++ ++commit 097e5f3924ee92a3ba6cd72f787da8a3eb14fea3 ++Author: Anthony Green ++Date: Tue Feb 8 10:11:00 2011 -0500 ++ ++ x86 pcrel test part 2 ++ ++commit ed2c518d960b91d444be74e5a55779a9c4602f3b ++Author: Anthony Green ++Date: Tue Feb 8 10:10:07 2011 -0500 ++ ++ x86 pcrel test ++ ++commit 0e5843995f46900ef212531281e08b224464f413 ++Author: Anthony Green ++Date: Tue Feb 8 07:52:40 2011 -0500 ++ ++ Refresh from GCC ++ ++commit 5b9cd52784339a42e417174a55e310e214d435f9 ++Author: Anthony Green ++Date: Mon Nov 22 15:19:57 2010 -0500 ++ ++ win64-underscore patch ++ ++commit 2db72615b50eb5c0f29725c02c740a2f0d7fc7d9 ++Author: Anthony Green ++Date: Sun Nov 21 10:50:56 2010 -0500 ++ ++ Rebase ++ ++commit f6ab3edc23dc8fc7c47a31c896044150c23f04b5 ++Author: Landon Fuller ++Date: Wed Oct 27 19:34:51 2010 -0400 ++ ++ Include the license header in the generated output. ++ ++commit cef619462887fa0f360e3ee702d1e04f112b5b38 ++Author: Landon Fuller ++Date: Wed Oct 27 13:59:30 2010 -0400 ++ ++ Add missing copyright/license header. ++ ++commit 53f387b203413c9aa6e31f49dbb70d37d816330b ++Author: Landon Fuller ++Date: Sun Sep 19 19:57:17 2010 -0700 ++ ++ Minor README fix. ++ ++commit 4fbcb5b5fbce11f4b168060e00639db33c85b75b ++Author: Landon Fuller ++Date: Sun Sep 19 19:50:37 2010 -0700 ++ ++ Minor README fix. ++ ++commit 8e7652ef6acab5db7a29f786686a54f05cdbdc7d ++Author: Landon Fuller ++Date: Sun Sep 19 19:49:39 2010 -0700 ++ ++ Add a libffi-ios-specific github README. ++ ++commit 83038cf24aa1a92b62b91ffee1dcc25d79243484 ++Author: Landon Fuller ++Date: Sun Sep 19 14:36:45 2010 -0700 ++ ++ Implement FFI_EXEC_TRAMPOLINE_TABLE allocator for iOS/ARM. ++ ++ This provides working closure support on iOS/ARM devices where ++ PROT_WRITE|PROT_EXEC is not permitted. The code passes basic ++ smoke tests, but requires further review. ++ ++commit b00ff3e98fdde622cef617030e14d5356dff988f ++Author: Landon Fuller ++Date: Sun Sep 19 14:22:26 2010 -0700 ++ ++ Rename the generated symbol ++ ++commit da2773e02ab26cc11a7fe87e985599f35cdf0649 ++Author: Landon Fuller ++Date: Sun Sep 19 14:21:37 2010 -0700 ++ ++ Modify the ffi_closure structures to hold table/table entry pointers instead of a code buffer. ++ ++commit 01d71b7bed41844f80cb9feef20dcc5ece5ba2d0 ++Author: Landon Fuller ++Date: Sun Sep 19 14:21:14 2010 -0700 ++ ++ Regenerated the autoconf script ++ ++commit 19afda0069c42e51c81dca7b10a5cf884b4cdce0 ++Author: Landon Fuller ++Date: Sun Sep 19 14:20:52 2010 -0700 ++ ++ Enable AC_SUBST for FFI_EXEC_TRAMPOLINE_TABLE ++ ++commit 9e1196444e78aef20028c18891f44ebe39a815fd ++Author: Landon Fuller ++Date: Sun Sep 19 10:43:06 2010 -0700 ++ ++ Add a hard-coded FFI_EXEC_TRAMPOLINE_TABLE arm implementation. ++ ++ This implements support for re-mapping a shared table of executable ++ trampolines directly in front of a writable configuration page, working ++ around PROT_WRITE restrictions for sandboxed applications on Apple's ++ iOS. ++ ++ This implementation is for testing purposes; a proper allocator is still ++ necessary, and ARM-specific code needs to be moved out of ++ src/closures.c. ++ ++commit f38364b399184e682fc3e785084bd497827bc5af ++Author: Landon Fuller ++Date: Sun Sep 19 10:42:36 2010 -0700 ++ ++ Fix symbol prefix for ffi_closure_SYSV_inner on Darwin. ++ ++commit 36849e7716b77aa25e4175d1f4be1b93dbf47aac ++Author: Landon Fuller ++Date: Sun Sep 19 09:35:04 2010 -0700 ++ ++ Whitespace/comment fixes. ++ ++commit b764162526854686e579a48b6ac5981f4eb886a3 ++Author: Landon Fuller ++Date: Sun Sep 19 09:04:34 2010 -0700 ++ ++ Fix the script name (build-iphone.sh -> build-ios.sh) ++ ++commit a3d9aa85013341451ea97766485b7a11852d32b2 ++Author: Landon Fuller ++Date: Sun Sep 19 09:03:52 2010 -0700 ++ ++ Update the autogenerated autoconf/automake files. ++ ++commit c71480eaf839f26bbdfcd8965f65ac4d8defddc0 ++Author: Landon Fuller ++Date: Sun Sep 19 09:02:05 2010 -0700 ++ ++ Update automake/autoconf to conditionally build src/arm/trampoline.S if FFI_EXEC_TRAMPOLINE_TABLE is enabled. ++ ++commit 9af9291b73bc5e27ecd949bec8157f20426d65b8 ++Author: Landon Fuller ++Date: Sun Sep 19 08:52:33 2010 -0700 ++ ++ Add the trampoline table generated by gentramp.sh ++ ++commit 68ce0c383ece84f69945d1c8c3fed03f7f9cb5d6 ++Author: Landon Fuller ++Date: Sun Sep 19 08:38:19 2010 -0700 ++ ++ Add a shell script that generates the ARM trampoline page. ++ ++ This generates a page of 340 trampolines, aligned within one page. The ++ trampolines use pc-relative addressing to reference config data ++ (context, jump address) from a page placed directly prior to the ++ trampoline page. This can be used on systems -- such as iOS -- that do not ++ support writable, executable memory by remapping the executable page ++ containing the trampolines directly above a newly allocated writable ++ config page. ++ ++commit 75af086be8830a8eafe9b1ebda199d788bcb0c62 ++Author: Landon Fuller ++Date: Sat Sep 18 18:12:19 2010 -0700 ++ ++ Update autoconf files ++ ++commit 1ac92cca9b02ef8d6a769f0de1adccd5c9630355 ++Author: Landon Fuller ++Date: Sat Sep 18 18:08:14 2010 -0700 ++ ++ Add autoconf check for W^X platforms that require a trampoline table. ++ ++ This adds the FFI_EXEC_TRAMPOLINE_TABLE. The flag is enabled for ++ arm-apple-darwin, where PROT_EXEC on writable (or formerly writable) pages is ++ not permitted for sandboxed binaries. ++ ++commit be72fbab29b7190c702d8e1ac3d149855e95879d ++Author: Landon Fuller ++Date: Sat Sep 18 18:02:25 2010 -0700 ++ ++ Use the correct host triple for arm/darwin ++ ++commit 70150bdf4509269965c72f2032bf74f285767afe ++Author: Landon Fuller ++Date: Sat Sep 18 16:38:03 2010 -0700 ++ ++ Add missing UNWIND entry; disables .pad on non-EABI targets. ++ ++commit 6b452bafaec498df975ba8ac4c99de174e5f74f7 ++Author: Landon Fuller ++Date: Sat Sep 18 16:21:32 2010 -0700 ++ ++ Apple assembler support; fixed most gas/ELF-isms. ++ ++commit 8ddac835b6f8b54ede764d0ea977dee4c82e2d67 ++Author: Landon Fuller ++Date: Sat Sep 18 15:38:06 2010 -0700 ++ ++ Fix placement of the __APPLE__ macro. ++ ++commit 69043d02936bb0579ac59b4ee1ed8dec38c38db7 ++Author: Landon Fuller ++Date: Sat Sep 18 15:32:08 2010 -0700 ++ ++ Work-around libffi's FP ABI detection. ++ ++ On iOS, we must use the AAPCS floating point return value calling ++ conventions. libffi's ARM implementation will only use these conventions ++ if __SOFTFP__ is defined, which is not the case when GCC's ++ -mfloat-abi defaults to 'softfp' instead of 'soft'. To work around this ++ we manually define __SOFTFP__ for Apple platforms in the ARM-specific ++ sysv.S. ++ ++ See also: ++ http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iPhoneOSABIReference/Introduction/Introduction.html ++ http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf ++ ++commit a82e6c354ea805114642a6e440abd0832cb1d23f ++Author: Landon Fuller ++Date: Sat Sep 18 14:44:24 2010 -0700 ++ ++ Add a stub iOS build script to drive autoconf ++ ++commit 84e8de6e9fc19388f6f1102c013b7d0d52940ecc ++Author: Anthony Green ++Date: Fri Aug 6 01:35:12 2010 -0400 ++ ++ Restore execute permissions ++ ++commit 3aeecc9eb1a6feba6549849cdd335c926415a4fc ++Author: Anthony Green ++Date: Thu Aug 5 15:19:00 2010 -0400 ++ ++ Fix win64-struct-args patch ++ ++commit 00d0b59cd13f89ab8b44bd894eb7f0a131fcb472 ++Author: Anthony Green ++Date: Thu Aug 5 14:56:53 2010 -0400 ++ ++ Fix debug build for windows ++ ++commit bda487e87064f27965155459a62dc52a744778d0 ++Author: Anthony Green ++Date: Thu Aug 5 09:02:41 2010 -0400 ++ ++ Don't use -safeseh with ml64 ++ ++commit c1d28ba8d5029795af313ffeb81c97efc6d4c847 ++Author: Anthony Green ++Date: Thu Aug 5 08:48:16 2010 -0400 ++ ++ stdcall-x86-closure-fix ++ ++commit 5feacad4a56c85b3f23a267a30b2cf424cd59548 ++Author: Anthony Green ++Date: Thu Aug 5 08:30:04 2010 -0400 ++ ++ define generic symbols carefully ++ ++commit 10ea848900bc3018ac213cef52b44cacbe5cbebc ++Author: Anthony Green ++Date: Thu Aug 5 08:24:27 2010 -0400 ++ ++ don't copy win64 struct args ++ ++commit d14178be4c49c3ada44a9fe9efe11d444372ddab ++Author: Anthony Green ++Date: Fri Jul 23 09:14:00 2010 -0400 ++ ++ FFI_LAST_ABI fix ++ ++commit 3f5b1375ab1e2b8e3d593e21b27097a4a50f9b83 ++Author: Anthony Green ++Date: Mon Jul 12 14:39:18 2010 -0400 ++ ++ rebase ++ ++commit eaf444eabc4c78703c0f98ac0197b1619c1b1bef ++Author: Anthony Green ++Date: Sat Jul 10 08:59:09 2010 -0400 ++ ++ Fix selinux test ++ ++commit 630974152247f100ece4d44f10c3721bb4599fbf ++Author: Anthony Green ++Date: Wed May 5 20:14:56 2010 -0400 ++ ++ Micharl Kohler's spelling fixes ++ ++commit 9dc9a293f3d4589fcaf02dd4288c8cebaefa508e ++Author: Anthony Green ++Date: Tue Apr 13 10:33:52 2010 -0400 ++ ++ Rebase to latest GCC sources ++ ++commit f2c2a4fce9b3eca9f39b4f3545118bc256da4a73 ++Author: Anthony Green ++Date: Tue Apr 13 10:19:28 2010 -0400 ++ ++ Remove warnings and add OS/2 support ++ ++commit c0b69e57d529e33d18b658cc5572a21e3663247c ++Author: Anthony Green ++Date: Tue Mar 30 08:30:22 2010 -0400 ++ ++ Dan Witte's windows build fixes. ++ ++commit 59a259f4d348f593b45f452309f4d020a28051c4 ++Author: Anthony Green ++Date: Mon Mar 15 05:57:51 2010 -0400 ++ ++ Remove junk file ++ ++commit 3de1eb36d37a66829e606421939874d0d60d816d ++Author: Anthony Green ++Date: Mon Mar 15 05:57:24 2010 -0400 ++ ++ fix-comments patch ++ ++commit c3813b6d7f8a777700f4c5862190c0db148d4de8 ++Author: Anthony Green ++Date: Tue Jan 26 16:48:56 2010 -0500 ++ ++ Rebuild Makefiles with automake 1.11.1 for CVE-2009-4029. ++ ++commit 8d27f68baa365bf883b6053c5f6bc819646d5434 ++Author: Anthony Green ++Date: Fri Jan 15 11:35:37 2010 -0500 ++ ++ Mention recent changes in README ++ ++commit ff3cd68b8cf2d9a28cad7aa9beff46236eacec8c ++Author: Anthony Green ++Date: Fri Jan 15 11:27:24 2010 -0500 ++ ++ Add msvc.sh wrapper ++ ++commit cadeba6cb53414a1253582f1719c286665de7b6c ++Author: Anthony Green ++Date: Fri Jan 15 10:46:51 2010 -0500 ++ ++ Microsoft Visual C port ++ ++commit 0739e7dc00db766eb64f502ec4137b817638c9a1 ++Author: Anthony Green ++Date: Fri Jan 15 09:48:33 2010 -0500 ++ ++ Add x86 Sun Studio compiler support ++ ++commit edfdfd2e85b8d01d2455934f1d7f4d7eb2f3cf1c ++Author: Anthony Green ++Date: Wed Jan 13 02:56:19 2010 -0500 ++ ++ Add closure example doc ++ ++commit 7b7a42f221cf171e8d09df34cac6dc1fd8458cc3 ++Author: Anthony Green ++Date: Tue Jan 12 09:14:14 2010 -0500 ++ ++ Rebase from GCC ++ ++commit 4b18d1f73dc7733137869e4ab5725cb90c1c8fde ++Author: Anthony Green ++Date: Fri Jan 1 10:24:27 2010 -0500 ++ ++ Add x86-64 MingW to README ++ ++commit c3042afaf3f84abbbe9c91bf9bc9896b0d9eb003 ++Author: Anthony Green ++Date: Fri Jan 1 08:08:02 2010 -0500 ++ ++ Reset quilt patches post 3.0.9 merge with GCC ++ ++commit b0304e9679bdfec6ac45a57b5c96542697249418 ++Author: Anthony Green ++Date: Thu Dec 31 11:32:40 2009 -0500 ++ ++ Update version ++ ++commit 2e7e03d014d9c9bf40e97ce75cba089ad052fa6b ++Author: Anthony Green ++Date: Thu Dec 31 07:43:22 2009 -0500 ++ ++ Final updates before 3.0.9 ++ ++commit aea706c52825c8eee677ffa7fdbdd3aed1725492 ++Author: Anthony Green ++Date: Tue Dec 29 10:09:31 2009 -0500 ++ ++ really 3.0.9rc12 ++ ++commit 0cfe60e9d13f132b88995cfee41f2156344f6fa2 ++Author: Anthony Green ++Date: Tue Dec 29 10:06:04 2009 -0500 ++ ++ 3.0.9rc12 ++ ++commit 14e2e92e8645804b6940b3e96c98e9f7f384a6b2 ++Author: Anthony Green ++Date: Sun Dec 27 21:03:33 2009 -0500 ++ ++ 3.0.9rc11 ++ ++commit 884402787bf8eaf7ec207085037cf8ace2f660ec ++Author: Anthony Green ++Date: Sat Dec 26 12:57:23 2009 -0500 ++ ++ HPUX support and avr32 test fixes. ++ ++commit 01c78756aff22efb1f122f8e93e068d7bf2185c7 ++Author: Anthony Green ++Date: Sat Dec 26 10:05:18 2009 -0500 ++ ++ 3.0.9rc9 ++ ++commit 70868464651320268d79c6894db5a50fdc11032a ++Author: Anthony Green ++Date: Sat Dec 26 09:58:03 2009 -0500 ++ ++ Remove xfails for mips and arm ++ ++commit 838d4ad920ec85cf5ca3b511221d67f6d9a99024 ++Author: Anthony Green ++Date: Sat Dec 26 09:57:27 2009 -0500 ++ ++ Remove a bunch of xfails. ++ ++commit 7e37eaaf772f48906e69618c773b0a36c3927de9 ++Author: Anthony Green ++Date: Sat Dec 26 07:46:50 2009 -0500 ++ ++ Fix huge_struct for solaris ++ ++commit 07cc7a37194bc34064ebed7f2724333a798411c8 ++Author: Anthony Green ++Date: Sat Dec 26 07:23:04 2009 -0500 ++ ++ 3.0.9rc8 ++ ++commit 2b9be16ffabc81326128bc1bbdddff8ddc5d13d3 ++Author: Anthony Green ++Date: Sat Dec 26 07:04:45 2009 -0500 ++ ++ 3.0.9rc8 ++ ++commit 9458d88f676e9a21ab8993a54e16754b11687419 ++Author: Anthony Green ++Date: Sat Dec 26 07:02:27 2009 -0500 ++ ++ Rebase from GCC ++ ++commit 6a3412417593f068a04dc6163f4269cb295ad5ca ++Author: Anthony Green ++Date: Sat Dec 26 06:51:33 2009 -0500 ++ ++ Add Andreas Schwab's powerpc fix ++ ++commit 39c8792ece1043f41f4c395a2ce71f4cf0ff4674 ++Author: Anthony Green ++Date: Fri Dec 25 21:52:28 2009 -0500 ++ ++ 3.0.9rc7 ++ ++commit 1d04af52e3e24db69f742064694c22f8df5cc70e ++Author: Anthony Green ++Date: Fri Dec 25 09:50:36 2009 -0500 ++ ++ Updated some mips XFAILs ++ ++commit 26e9509c9b7929bc4fcf697071699051a652b1fd ++Author: Anthony Green ++Date: Fri Dec 25 02:19:23 2009 -0500 ++ ++ Clean up ChangeLog.libffi for older patches. ++ ++commit 9c157d3215e4393777f83eb6fa801df6528f40d7 ++Author: Anthony Green ++Date: Fri Dec 25 02:15:40 2009 -0500 ++ ++ Clean up undefine_AC_ARG_VAR_PRECIOUS patch. ++ ++commit d22de05b0bfc480766bc1240615ce2830eee71b8 ++Author: Anthony Green ++Date: Fri Dec 25 02:04:23 2009 -0500 ++ ++ Fix patches ++ ++commit 1fe3dc7c20dc4dbd8fed0d19c8618027d44ed971 ++Author: Anthony Green ++Date: Fri Dec 25 01:39:00 2009 -0500 ++ ++ Add windows support patch. ++ ++commit f7c0bc613a88f7dbc2d18b345c10fa438833c170 ++Author: Anthony Green ++Date: Fri Dec 25 01:22:11 2009 -0500 ++ ++ 3.0.9rc6 ++ ++commit c7fa2da8260258c11ab1dc7ac06fb611a2c1b50f ++Author: Anthony Green ++Date: Thu Dec 24 07:22:44 2009 -0500 ++ ++ 3.0.9rc6 ++ ++commit da11bece0fde66fc0268db3a01207dda857e25d2 ++Author: Anthony Green ++Date: Thu Dec 24 05:34:46 2009 -0500 ++ ++ Release 3.0.9rc5 ++ ++commit e3399b11edeab546b066bfc18574f3edb905d0dc ++Author: Anthony Green ++Date: Thu Dec 24 01:09:32 2009 -0500 ++ ++ Update README ++ ++commit 115ab36fceee69740a01ce49bc27e1908cc237b1 ++Author: Anthony Green ++Date: Thu Dec 24 00:22:00 2009 -0500 ++ ++ Update missing changes for 3.0.9r4. ++ ++commit f8c7a245bf5a80bd7e730ec03fcad17c8dcfcb07 ++Author: Anthony Green ++Date: Wed Dec 23 23:46:22 2009 -0500 ++ ++ Switch to quilt. Rebase to latest GCC. ++ ++commit ce806772f02387b9a74f6496a263a368bccd5d59 ++Merge: cd98813 dcc1f6b ++Author: Anthony Green ++Date: Mon Oct 5 00:41:35 2009 -0400 ++ ++ Merge branch 'master' of git@github.com:atgreen/libffi ++ ++commit dcc1f6b4f1ffd2713bf68b791a13f85d455c8b1b ++Author: Anthony Green ++Date: Mon Oct 5 00:29:33 2009 -0400 ++ ++ More clean up. ++ ++commit 2829f5941a223b9d851d8ab6318318e6197d7e01 ++Author: Anthony Green ++Date: Mon Oct 5 00:28:03 2009 -0400 ++ ++ Clean up ++ ++commit cd98813de517ea64041637e3e78d27a001d6d3b4 ++Author: Anthony Green ++Date: Mon Oct 5 00:25:29 2009 -0400 ++ ++ From Jens Rehsack. Fix for 64-bit AIX. ++ ++commit e4a91de766acc47f6c50f13cc11719a65e23ecba ++Author: Anthony Green ++Date: Mon Oct 5 00:16:17 2009 -0400 ++ ++ From Abdulaziz Ghuloum. Adds special case for Snow Leopard. ++ ++commit 3425a763bcdaadb8b430226f427ec833afdcc96a ++Author: Anthony Green ++Date: Sun Oct 4 23:57:29 2009 -0400 ++ ++ Fix detection of free/openbsd. From Alexis Ballier. ++ ++commit 2340e7a777902de61499d47823ad8d5e0eeb6203 ++Author: Anthony Green ++Date: Sun Oct 4 23:53:17 2009 -0400 ++ ++ AVR support ++ ++commit 5cbe2058c128e848446ae79fe15ee54260a90559 ++Author: Anthony Green ++Date: Sun Oct 4 23:53:11 2009 -0400 ++ ++ Initial stand-alone patch. ++ ++commit c6dddbd02bad9654ed58cdb0feb360934d105dec ++Author: Anthony Green ++Date: Sun Oct 4 08:11:33 2009 -0400 ++ ++ Initial commit ++ ++commit 5ffc0c37486fb1538bccc0ca7acc807d4f1af932 ++Author: Anthony Green ++Date: Sun Oct 4 07:58:22 2009 -0400 ++ ++ Update version to 3.0.9rc1. Add more useful things to .gitignore. ++ ++commit bd29f83ee9f6fa6b65adee9d3f57834f364d9887 ++Author: Anthony Green ++Date: Tue Sep 29 12:07:26 2009 -0400 ++ ++ Add .gitignore ++ ++commit 9474f853f83e3f0167c1b306177321bfcc93e56d ++Author: Anthony Green ++Date: Tue Sep 29 11:13:02 2009 -0400 ++ ++ Remove old CVSROOT files. ++ ++commit 0c25275ec24bfe2c2c25a000465f0950ef9dd51b ++Author: twall ++Date: Wed Aug 19 12:57:34 2009 +0000 ++ ++ Apply Dave Korn's cygwin/GCC changes ++ ++commit 39228c27ed3f677a95b46380a8d31602b5777e1a ++Author: aph ++Date: Tue Jun 16 18:00:47 2009 +0000 ++ ++ 2009-06-16 Wim Lewis ++ ++ * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are ++ supposed to be callee-saved. ++ * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of ++ return buffer for odd-size structs. ++ ++commit 5e93cc704d127c2c8ae7f5d2cef621145d43e777 ++Author: aph ++Date: Tue Jun 16 17:41:47 2009 +0000 ++ ++ 2009-06-16 Andreas Tobler ++ ++ PR libffi/40444 ++ * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add ++ allow_stack_execute for Darwin. ++ ++commit b509af8959dc371b92392c623522ea6f4946a71d ++Author: aph ++Date: Tue Jun 16 16:17:52 2009 +0000 ++ ++ 2009-06-16 Andrew Haley ++ ++ * configure.ac (TARGETDIR): Add missing blank lines. ++ * configure: Regenerate. ++ ++commit d57e96dc56ee76fbbb9b59d73aeaa92354db5ecb ++Author: aph ++Date: Tue Jun 16 09:59:02 2009 +0000 ++ ++ 2009-06-16 Andrew Haley ++ ++ * testsuite/libffi.call/cls_align_sint64.c, ++ testsuite/libffi.call/cls_align_uint64.c, ++ testsuite/libffi.call/cls_longdouble_va.c, ++ testsuite/libffi.call/cls_ulonglong.c, ++ testsuite/libffi.call/return_ll1.c, ++ testsuite/libffi.call/stret_medium2.c: Fix printf format ++ specifiers. ++ * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs. ++ * testsuite/libffi.call/float2.c: Fix dg-excess-errors. ++ * testsuite/libffi.call/ffitest.h, ++ testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. ++ ++commit b01d6d1982c9e020507029bfd5a58a8c60d111fa ++Author: aph ++Date: Tue Jun 16 09:44:54 2009 +0000 ++ ++ 2009-06-16 Andrew Haley ++ ++ * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. ++ * testsuite/libffi.call/err_bad_abi.c: Likewise. ++ ++commit 35b6ded138591900a88055a8a8ac1fadc29a76d6 ++Author: aph ++Date: Fri Jun 12 15:29:20 2009 +0000 ++ ++ 2009-06-11 Kaz Kojima ++ ++ * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. ++ * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. ++ * testsuite/libffi.call/err_bad_typedef.c: Likewise. ++ ++commit acc46605f2d95d67d69398e7644610f10a157ce3 ++Author: aph ++Date: Fri Jun 12 14:21:28 2009 +0000 ++ ++ 2009-06-12 Andrew Haley ++ ++ * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, ++ testsuite/libffi.call/cls_align_uint64.c, ++ testsuite/libffi.call/cls_ulonglong.c, ++ testsuite/libffi.call/return_ll1.c, ++ testsuite/libffi.call/stret_medium2.c: Fix printf format ++ specifiers. ++ testsuite/libffi.special/unwindtest.cc: include stdint.h. ++ ++commit 16d1996ed0797bd7c11aca2b0fe7e7748751aaf6 ++Author: twall ++Date: Thu Jun 11 14:27:42 2009 +0000 ++ ++ update changelog ++ ++commit 92a515c33efe91be3cb0258f01c63aff208489c7 ++Author: twall ++Date: Thu Jun 11 14:27:28 2009 +0000 ++ ++ use ffi_closure_alloc instead of stack-based closure ++ ++commit e4363160ba9e50167f9ca0a7399d537a1d2cd0ce ++Author: twall ++Date: Thu Jun 11 14:26:23 2009 +0000 ++ ++ remove unused extern ++ ++commit 1dc2781d2ba38f5f000ff70069d617fb21e1d2af ++Author: twall ++Date: Thu Jun 11 11:36:16 2009 +0000 ++ ++ remove not-yet-applied changelog entries ++ ++commit bb27735fe689dac97ec0dc847ed8d3d519620109 ++Author: twall ++Date: Wed Jun 10 10:42:36 2009 +0000 ++ ++ add win64 support ++ ++commit b2a54c100c74854a409820817d54617fdda39eb8 ++Author: aph ++Date: Mon Jun 8 16:50:49 2009 +0000 ++ ++ 2009-06-08 Andrew Haley ++ ++ * testsuite/libffi.call/err_bad_abi.c: Add xfails. ++ * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. ++ * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. ++ * testsuite/libffi.call/err_bad_typedef.c: Add xfails. ++ ++ * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. ++ * testsuite/libffi.call/stret_medium.c: Likewise. ++ * testsuite/libffi.call/stret_large2.c: Likewise. ++ * testsuite/libffi.call/stret_large.c: Likewise. ++ ++commit 25723e7141f73d3736d7244b980c89d97db852b6 ++Author: aph ++Date: Fri Jun 5 13:03:40 2009 +0000 ++ ++ 2009-06-05 Andrew Haley ++ ++ * src/x86/win32.S (_ffi_closure_STDCALL): Import from gcc. ++ ++commit 70758199c7cd41f411987360ccb302b497a56dc9 ++Author: aph ++Date: Thu Jun 4 16:29:58 2009 +0000 ++ ++ 2009-06-04 Andrew Haley ++ ++ * src/powerpc/ffitarget.h: Fix misapplied merge from gcc. ++ ++commit e8bb12563f9aa23ddf36fa6a5b92b16b5c3e1a7f ++Author: aph ++Date: Thu Jun 4 14:59:18 2009 +0000 ++ ++ 2009-06-04 Andrew Haley ++ ++ * src/mips/o32.S, ++ src/mips/n32.S: Fix licence formatting. ++ ++commit d66a8e32c3671479e3ce0f6819673e5932ba6b7f ++Author: aph ++Date: Thu Jun 4 14:43:40 2009 +0000 ++ ++ 2009-06-04 Andrew Haley ++ ++ * src/x86/darwin.S: Fix licence formatting. ++ src/x86/win32.S: Likewise. ++ src/sh64/sysv.S: Likewise. ++ src/sh/sysv.S: Likewise. ++ ++commit 7c3b7fd6b5db746b5b09a718f3044f811372f941 ++Author: aph ++Date: Thu Jun 4 14:39:20 2009 +0000 ++ ++ 2009-06-04 Andrew Haley ++ ++ * src/sh64/ffi.c: Remove lint directives. Was missing from merge ++ of Andreas Tobler's patch from 2006-04-22. ++ ++commit 1a2f93a8b362db13638afd9fcb3f2650180bfa17 ++Author: aph ++Date: Thu Jun 4 10:45:51 2009 +0000 ++ ++ 2009-06-04 Andrew Haley ++ ++ * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of ++ 2007-03-07. ++ ++commit 944c95cf7aaaaf7c5fa368cda4673dd38f45020e ++Author: aph ++Date: Wed Jun 3 17:42:56 2009 +0000 ++ ++ 2009-05-22 Dave Korn ++ ++ * src/x86/win32.S (_ffi_closure_STDCALL): New function. ++ (.eh_frame): Add FDE for it. ++ ++ 2009-05-22 Dave Korn ++ ++ * configure.ac: Also check if assembler supports pc-relative ++ relocs on X86_WIN32 targets. ++ * configure: Regenerate. ++ * src/x86/win32.S (ffi_prep_args): Declare extern, not global. ++ (_ffi_call_SYSV): Add missing function type symbol .def and ++ add EH markup labels. ++ (_ffi_call_STDCALL): Likewise. ++ (_ffi_closure_SYSV): Likewise. ++ (_ffi_closure_raw_SYSV): Likewise. ++ (.eh_frame): Add hand-crafted EH data. ++ ++ 2008-11-21 Eric Botcazou ++ ++ * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for ++ signed/unsigned int8/16 return values. ++ * src/sparc/v8.S (ffi_call_v8): Likewise. ++ (ffi_closure_v8): Likewise. ++ ++ 2008-03-26 Kaz Kojima ++ ++ * src/sh/sysv.S: Add .note.GNU-stack on Linux. ++ * src/sh64/sysv.S: Likewise. ++ ++ 2008-03-26 Daniel Jacobowitz ++ ++ * src/arm/sysv.S: Fix ARM comment marker. ++ ++commit 00fa972430bb1535a4b34bf029ebcad500027b0c ++Author: twall ++Date: Sat Dec 27 16:59:05 2008 +0000 ++ ++ properly glob-match ++ ++commit f5179e6794ac35af26fe86e468b8508a7a570c55 ++Author: twall ++Date: Fri Dec 26 19:06:28 2008 +0000 ++ ++ Mark XFAIL on longdouble tests for x86_64/mingw ++ ++commit 80e2b5a749208c8a18f994ec5bee84594d051cc8 ++Author: twall ++Date: Mon Dec 22 15:21:15 2008 +0000 ++ ++ clean up tests for win64 use ++ ++commit 7063d9996f742576095c7b0eb5016c0f9a670aec ++Author: green ++Date: Fri Dec 19 16:13:46 2008 +0000 ++ ++ Version 3.0.8 with x86-solaris support ++ ++commit bdfeb13f0df0a63b19d62597517237b54d92228b ++Author: green ++Date: Fri Dec 19 15:47:44 2008 +0000 ++ ++ Bump to 3.0.7 ++ ++commit 69205de17d6ac4c11d4ba92d6a5b40a0c5f246b2 ++Author: green ++Date: Thu Jul 24 18:03:48 2008 +0000 ++ ++ Many test fixes (failures due to excessive compiler warnings). ++ ++commit 260d513fea00b3613fe957a44a157fe72c4ca29e ++Author: green ++Date: Thu Jul 17 13:13:52 2008 +0000 ++ ++ Version 3.0.6. sh/sh64 fixes. ++ ++commit 3704031875feabb74e3655ed03cff4c2b3c76ac6 ++Author: green ++Date: Thu Apr 3 18:57:57 2008 +0000 ++ ++ Rev 3.0.5. ++ ++commit 8406f5f48f7f58a1c982a93a95d521cf82b3241f ++Author: green ++Date: Thu Apr 3 18:57:34 2008 +0000 ++ ++ 3.0.5 ++ ++commit 23a9e73212b62f9684cedb0ce70e92c59cfdaffa ++Author: green ++Date: Wed Mar 5 00:07:02 2008 +0000 ++ ++ 2008-03-04 Anthony Green ++ Blake Chaffin ++ hos@tamanegi.org ++ ++ * testsuite/libffi.call/cls_align_longdouble_split2.c ++ testsuite/libffi.call/cls_align_longdouble_split.c ++ testsuite/libffi.call/cls_dbls_struct.c ++ testsuite/libffi.call/cls_double_va.c ++ testsuite/libffi.call/cls_longdouble.c ++ testsuite/libffi.call/cls_longdouble_va.c ++ testsuite/libffi.call/cls_pointer.c ++ testsuite/libffi.call/cls_pointer_stack.c ++ testsuite/libffi.call/err_bad_abi.c ++ testsuite/libffi.call/err_bad_typedef.c ++ testsuite/libffi.call/huge_struct.c ++ testsuite/libffi.call/stret_large2.c ++ testsuite/libffi.call/stret_large.c ++ testsuite/libffi.call/stret_medium2.c ++ testsuite/libffi.call/stret_medium.c: New tests from Apple. ++ ++commit 429e37d3ad653e52e75bf725c883ab79e859f89a ++Author: green ++Date: Thu Feb 28 04:50:19 2008 +0000 ++ ++ clicky ++ ++commit 51e79c428348c033314f54bcb30f7e388c59e347 ++Author: green ++Date: Thu Feb 28 04:47:35 2008 +0000 ++ ++ getclicky ++ ++commit affcab04e280efeace45a72c4dc6152c0e4f1b7f ++Author: green ++Date: Tue Feb 26 19:01:53 2008 +0000 ++ ++ 2008-02-26 Jakub Jelinek ++ Anthony Green ++ ++ * src/alpha/osf.S: Add .note.GNU-stack on Linux. ++ * src/s390/sysv.S: Likewise. ++ * src/powerpc/linux64.S: Likewise. ++ * src/powerpc/linux64_closure.S: Likewise. ++ * src/powerpc/ppc_closure.S: Likewise. ++ * src/powerpc/sysv.S: Likewise. ++ * src/x86/unix64.S: Likewise. ++ * src/x86/sysv.S: Likewise. ++ * src/sparc/v8.S: Likewise. ++ * src/sparc/v9.S: Likewise. ++ * src/m68k/sysv.S: Likewise. ++ * src/ia64/unix.S: Likewise. ++ * src/arm/sysv.S: Likewise. ++ ++commit 59689d5522c159a3ac967adb6b891cf5f22c890f ++Author: green ++Date: Tue Feb 26 17:40:51 2008 +0000 ++ ++ 2008-02-26 Anthony Green ++ Thomas Heller ++ ++ * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C ++ comment. ++ ++commit b13c84cf4668828ff8429ba4a2f94cd1eb574ae0 ++Author: green ++Date: Tue Feb 26 17:38:15 2008 +0000 ++ ++ 2008-02-26 Anthony Green ++ Thomas Heller ++ ++ * include/ffi.h.in: Change void (*)() to void (*)(void). ++ ++commit 265289f679ffd24a88ae1aa2cef0e4aa14703cd8 ++Author: green ++Date: Tue Feb 26 17:34:36 2008 +0000 ++ ++ 2008-02-26 Anthony Green ++ ++ * src/alpha/ffi.c: Change void (*)() to void (*)(void). ++ src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c, ++ src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c, ++ src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S, ++ src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c, ++ src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c, ++ src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S,> src/x86/ffi64.c: Ditto. ++ ++commit fb5036cd6d0f909918e90f7d2d9fd80d46682d5d ++Author: green ++Date: Sun Feb 24 17:25:25 2008 +0000 ++ ++ fix date ++ ++commit 40bec108e7d0181e6c9928aa7a33187bcc0f3d6f ++Author: green ++Date: Sun Feb 24 17:25:02 2008 +0000 ++ ++ New release ++ ++commit b922048fa82ea109a4af269ee47bbc2a586bbac2 ++Author: green ++Date: Sun Feb 24 17:24:00 2008 +0000 ++ ++ 2008-02-24 Anthony Green ++ ++ * configure.ac: Accept openbsd*, not just openbsd. ++ Bump version to 3.0.4. ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ * libtool-version: Increment revision. ++ * README: Update for new release. ++ ++commit affca4b92d06e5554784c7e9b233029ef83f7d8a ++Author: green ++Date: Fri Feb 22 21:53:29 2008 +0000 ++ ++ sync readme with web page. ++ ++commit 3e53d8752ea74859b4c64fbbf935e62a937c4d78 ++Author: green ++Date: Fri Feb 22 21:52:38 2008 +0000 ++ ++ New release ++ ++commit 4d92f6c8e78fe084be65f3e8b58b859901ba796d ++Author: green ++Date: Fri Feb 22 21:49:46 2008 +0000 ++ ++ 2008-02-22 Anthony Green ++ ++ * configure.ac: Bump version to 3.0.3. ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ * libtool-version: Increment revision. ++ * README: Update for new release. Clean up test docs. ++ ++commit 0e185fa11a01f816824ba2687ed3715ab6219bef ++Author: green ++Date: Fri Feb 22 21:43:18 2008 +0000 ++ ++ Update configure script. ++ ++commit f73986bd211cfbbaa593d1309504d0dc68626191 ++Author: green ++Date: Fri Feb 22 21:40:53 2008 +0000 ++ ++ 2008-02-22 Bjoern Koenig ++ Andreas Tobler ++ ++ * configure.ac: Add amd64-*-freebsd* target. ++ * configure: Regenerate. ++ ++commit 0208f68fe5de30c33e7f70ebc281635917013f5a ++Author: green ++Date: Fri Feb 22 21:15:44 2008 +0000 ++ ++ 2008-02-22 Thomas Heller ++ ++ * configure.ac: Add x86 OpenBSD support. ++ * configure: Rebuilt. ++ ++commit 01adb0e638a86cf0d5e668ed8e08be9b0cd2505f ++Author: green ++Date: Thu Feb 21 16:17:26 2008 +0000 ++ ++ Fix README. ++ ++commit 1edd4563225981a14f7d4fb9919b1ed88e38082f ++Author: green ++Date: Thu Feb 21 13:39:01 2008 +0000 ++ ++ 3.0.2 ++ ++commit c9b542800864e2204db6e83f3843a17813ba6165 ++Author: green ++Date: Thu Feb 21 13:36:43 2008 +0000 ++ ++ add missing file ++ ++commit d5fa5633d5c8d3c212a2267cfa38fba4091baa2c ++Author: green ++Date: Thu Feb 21 13:36:19 2008 +0000 ++ ++ 2008-02-21 Anthony Green ++ ++ * configure.ac: Bump version to 3.0.2. ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ * libtool-version: Increment revision. ++ * README: Update for new release. ++ ++ 2008-02-21 Björn König ++ ++ * src/x86/freebsd.S: New file. ++ * configure.ac: Add x86 FreeBSD support. ++ * Makefile.am: Ditto. ++ ++commit ac35bfc6fcadd8880c1efce36724820f9074b318 ++Author: green ++Date: Sat Feb 16 01:03:56 2008 +0000 ++ ++ Updated ++ ++commit f7942975fee7b0162647dd79e2652615b737e98e ++Author: green ++Date: Sat Feb 16 01:02:00 2008 +0000 ++ ++ 2008-02-15 Anthony Green ++ ++ * configure.ac: Bump version to 3.0.1. ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ * libtool-version: Increment revision. ++ * README: Update for new release. ++ ++ 2008-02-15 David Daney ++ ++ * src/mips/ffi.c: Remove extra '>' from include directive. ++ (ffi_prep_closure_loc): Use clear_location instead of tramp. ++ ++commit 59aa6bb1bfc86a610ac1a8b123443efd75854dd1 ++Author: green ++Date: Fri Feb 15 20:52:26 2008 +0000 ++ ++ Add more platforms. ++ ++commit 45a45ab99074448be0ae1a8d2ade50d28b60f8de ++Author: green ++Date: Fri Feb 15 19:16:36 2008 +0000 ++ ++ 3.0 notes ++ ++commit 4db74cbea888c9f1251b85baf00d99b83d3b994d ++Author: green ++Date: Fri Feb 15 19:10:26 2008 +0000 ++ ++ Update ++ ++commit c3e1101ffabf44d8a2ee46e03ba9ab582050a825 ++Author: green ++Date: Fri Feb 15 18:43:40 2008 +0000 ++ ++ 2008-02-15 Anthony Green ++ ++ * configure.ac: Bump version to 3.0.0, ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ ++ 2008-02-15 David Daney ++ ++ * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): ++ Define (conditionally), and use it to include cachectl.h. ++ (ffi_prep_closure_loc): Fix cache flushing. ++ * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. ++ ++commit 7e0cc12e9233ad285db41ce8dbdda61ed2a7fb06 ++Author: green ++Date: Fri Feb 15 15:51:03 2008 +0000 ++ ++ New release ++ ++commit 2d7dc885ec40d53866f29984d595511942c8b686 ++Author: green ++Date: Fri Feb 15 15:30:26 2008 +0000 ++ ++ * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3: ++ Update dates and remove all references to ffi_prep_closure. ++ * configure.ac: Bump version to 2.99.9. ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ ++commit a0525f03eeaaed33b1eac80e0c016455cee3615d ++Author: green ++Date: Fri Feb 15 15:14:30 2008 +0000 ++ ++ New release. ++ ++commit 2b30dfb3146ee26ad956d00ee05eb835ca1a95b4 ++Author: green ++Date: Fri Feb 15 15:12:43 2008 +0000 ++ ++ * man/ffi_prep_closure.3: Delete. ++ * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3. ++ (man_MANS): Ditto. ++ * man/Makefile.in: Rebuilt. ++ * configure.ac: Bump version to 2.99.8. ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ ++commit bf41e64840ebcb6cc31a6f028253c1fde82705d8 ++Author: green ++Date: Fri Feb 15 01:56:50 2008 +0000 ++ ++ Update. ++ ++commit 4d39ddee677bbb61d621893b91e11eac5e7c4af7 ++Author: green ++Date: Fri Feb 15 01:24:06 2008 +0000 ++ ++ * configure.ac: Bump version to 2.99.7. ++ * configure, doc/stamp-vti, doc/version.texi: Rebuilt. ++ * include/ffi.h.in LICENSE src/debug.c src/closures.c ++ src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h ++ src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c ++ src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S ++ src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c ++ src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c ++ src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S ++ src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h ++ src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c ++ src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S ++ src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h ++ src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h ++ src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S ++ src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h ++ src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S ++ src/arm/ffitarget.h src/prep_cif.c: Update license text. ++ ++commit d58b032b41a12bd3d72148da6822ab59dd698ff9 ++Author: green ++Date: Fri Feb 15 00:59:25 2008 +0000 ++ ++ New release ++ ++commit 91e5478df6d5ac63efbb10f025807b4606afab56 ++Author: green ++Date: Fri Feb 15 00:50:30 2008 +0000 ++ ++ Update supported platforms. Bump version. ++ ++commit bd0768f877c8f7fd0d36af2191b203d4d057b1ce ++Author: green ++Date: Fri Feb 15 00:45:33 2008 +0000 ++ ++ * configure.ac: Bump version to 2.99.5. ++ * configure: Rebuilt. ++ * Makefile.am (EXTRA_DIST): Add darwin64.S ++ * Makefile.in: Rebuilt. ++ * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree. ++ * LICENSE: Update WARRANTY. ++ ++commit 49d345f767bd2cfee951bceaab6a1a07986cf293 ++Author: green ++Date: Thu Feb 14 23:43:27 2008 +0000 ++ ++ update license reference ++ ++commit 12ac48fc79b515db7c9accd9fcaa87b0dcefccdb ++Author: green ++Date: Thu Feb 14 23:42:08 2008 +0000 ++ ++ Update WARRANTY ++ ++commit 6b91c41da87e78552f2990dfc504a0a3349f340b ++Author: green ++Date: Thu Feb 14 23:38:27 2008 +0000 ++ ++ fix tarball reference ++ ++commit 2b59579e3533334bee4788e076b4e520c2ab518c ++Author: green ++Date: Thu Feb 14 23:35:58 2008 +0000 ++ ++ First update in 5 years! ++ ++commit 6cbdf3f3a3777a93382a2d508ddef1c353ff0955 ++Author: green ++Date: Thu Feb 14 22:44:06 2008 +0000 ++ ++ Fix .pc file bug and bump version ++ ++commit 1d1dc81104b209df3cfef0840735c59efae2f655 ++Author: green ++Date: Thu Feb 14 22:03:37 2008 +0000 ++ ++ Add man files and info file. Update README. Tag as 2.99.3. ++ ++commit f045a2367f793fa8b01534cf2e25bcc46afc8fa1 ++Author: tromey ++Date: Thu Feb 14 20:46:57 2008 +0000 ++ ++ Move entry from ChangeLog to ChangeLog.libffi ++ ++commit 6257f07d1a9efd27fa83639cfba281f5d3188731 ++Author: tromey ++Date: Thu Feb 14 20:33:17 2008 +0000 ++ ++ * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt. ++ * mdate-sh, texinfo.tex: New files. ++ * Makefile.am (info_TEXINFOS): New variable. ++ * doc/libffi.texi: New file. ++ * doc/version.texi: Likewise. ++ ++commit 4232af563c5509c3760a33e3684a2b958be755e1 ++Author: green ++Date: Thu Feb 14 16:19:21 2008 +0000 ++ ++ * Makefile.am (AM_CFLAGS): Don't compile with -D. ++ (lib_LTLIBRARIES): Define. ++ (toolexeclib_LIBRARIES): Undefine. ++ * Makefile.in: Rebuilt. ++ * configure.ac: Reset version to 2.99.1. ++ * configure.in: Rebuilt. ++ ++commit 961543615c31f092b578a4b4cda914db64f9d0fa ++Author: green ++Date: Thu Feb 14 15:57:40 2008 +0000 ++ ++ Fix typo. ++ ++commit aeb0abab87222f637fbf352d4effd3b76b52ed26 ++Author: green ++Date: Thu Feb 14 15:54:27 2008 +0000 ++ ++ * libffi.pc.in: Usse @PACKAGE_NAME@ and @PACKAGE_VERSION@. ++ * configure.ac: Reset version to 2.99.1. ++ * configure.in: Rebuilt. ++ * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi. ++ * Makefile.in: Rebuilt. ++ * LICENSE: Update copyright notice. ++ ++commit 77fe243556433eae119d8bd7469bfccdd5bd8a1a ++Author: green ++Date: Thu Feb 14 15:37:00 2008 +0000 ++ ++ Fix make dist again ++ ++commit d4970cf4529459bf0f0e43c602cac396786c6802 ++Author: green ++Date: Thu Feb 14 15:18:56 2008 +0000 ++ ++ Fix make dist ++ ++commit f0b1462f2d3024922ad71421bd5c4311fcb16da5 ++Author: green ++Date: Thu Feb 14 15:01:41 2008 +0000 ++ ++ Use pkgconfig. Increment libtool CURRENT version. ++ ++commit 27e52f33baa069012a5adb2a3807f9ca1f2165ab ++Author: green ++Date: Sun Feb 3 13:59:48 2008 +0000 ++ ++ Fix header installs when using DESTDIR. ++ ++commit fadab28eb6e33fb6dcdd7b9323e147142216d548 ++Author: twall ++Date: Sun Feb 3 12:32:22 2008 +0000 ++ ++ update changelog ++ ++commit b5e44c8dfa92c87b99762c303cf5574a16db8f27 ++Author: twall ++Date: Sun Feb 3 01:12:32 2008 +0000 ++ ++ offset from code base address, not data base address ++ ++commit f359848d1a995c0e44566d815f218729dc996e22 ++Author: green ++Date: Fri Feb 1 21:29:43 2008 +0000 ++ ++ Fix header installs. ++ ++commit c30df49e157c7bfc8e19e3f8a72b9464fe225e54 ++Author: green ++Date: Fri Feb 1 21:13:55 2008 +0000 ++ ++ Revert my broken changes to twall's patch. ++ ++commit 675561bb9aa0732c76698df10dd3007b5d0ec759 ++Author: green ++Date: Thu Jan 31 13:44:25 2008 +0000 ++ ++ Fix make dist . ++ ++commit abc0bbf3813dc43e23d4c23e6fe794dbf287639b ++Author: green ++Date: Thu Jan 31 11:58:57 2008 +0000 ++ ++ Add Tim Wall's x86 windows patch. ++ ++commit e332366d15a31198735b593ec8f7fc0558d783b8 ++Author: green ++Date: Wed Jan 30 13:21:02 2008 +0000 ++ ++ Add HJ's -fomit-frame-pointer struct return fix ++ ++commit d4204240392af5b7750a08671b08e9c22dff5e93 ++Author: green ++Date: Wed Jan 30 12:42:34 2008 +0000 ++ ++ Clean up for new automake. ++ ++commit f4932dd020df574637c9fb3fc1bb18e5a8f304cc ++Author: green ++Date: Wed Jan 30 12:40:25 2008 +0000 ++ ++ Fixes to run testsuite ++ ++commit 085520ddc8db6a916bfc416b871fcb2d00074d40 ++Author: green ++Date: Tue Jan 29 15:16:43 2008 +0000 ++ ++ New files from gcc tree. ++ ++commit 77175b3f7234e4875a4ef554ed1fe9fdc4133794 ++Author: green ++Date: Tue Jan 29 15:15:20 2008 +0000 ++ ++ Latest gcc svn sources ++ ++commit 2544e45a0b2b634053df02da3a2ed9680eeed2a1 ++Author: green ++Date: Tue Jan 29 14:28:13 2008 +0000 ++ ++ Install ffitarget.h in $prefix/include. ++ ++commit 6002211b1cc4daeb587d054b4f83968bda2c981e ++Author: green ++Date: Tue Jan 29 12:30:10 2008 +0000 ++ ++ Add new files. ++ ++commit ccabd2b16be883cd03e5f0cd88ccfdd6ca39239d ++Author: green ++Date: Tue Jan 29 12:28:15 2008 +0000 ++ ++ Merge from gcc ++ ++commit e680ecfbfca1da8d1823e48bc89b8375e66e128b ++Author: tromey ++Date: Sun Dec 24 23:12:15 2006 +0000 ++ ++ Pulled in libffi from gcc trunk. ++ Fixed build and install for standalone use. ++ ++commit e7ba08965942ce872fdbc69f70f9848cc3d0bad6 ++Author: root ++Date: Sun Jun 4 23:22:24 2006 +0000 ++ ++ sourcware.org ++ ++commit 0cd4aa24e21aaa964dfbdebc25ec5c8188049375 ++Author: root ++Date: Sun May 30 01:51:57 2004 +0000 ++ ++ Add LockDir ++ ++commit 5826120fbd940d26cca76ed2522187505581e1ed ++Author: green ++Date: Tue Nov 4 06:09:08 2003 +0000 ++ ++ Add link to Gianni's web site. ++ ++commit 220aa4b27db42d7ffaac5056000d5179f00d5ea3 ++Author: jsm ++Date: Tue Jan 21 08:07:42 2003 +0000 ++ ++ Newer, better, increased from before! (list of acceptable anon usernames) ++ ++commit 1c3adc892cc1403dc4d3d7003a2385899836612e ++Author: green ++Date: Fri Dec 6 01:28:03 2002 +0000 ++ ++ Fixed Cygnus references. ++ ++commit 4af66bb62fab9a8e318af3bf01e5486596a0c8d4 ++Author: green ++Date: Sun Oct 21 19:18:42 2001 +0000 ++ ++ Testsuite fixes. ++ ++commit 5435965f9015ce40584c98d3816c3d05e7de1d21 ++Author: green ++Date: Mon Apr 23 00:32:03 2001 +0000 ++ ++ * include/ffi_common.h: Delete, after moving contents to... ++ * include/ffi_private.h: Subsume contents of ffi_common.h. ++ * include/Makefile.am (noinst_HEADERS): Remove ffi_common.h. ++ * include/Makefile.in: Rebuilt. ++ * arm/ffi.c, m68k/ffi.c, mips/ffi.c, powerpc/ffi.c, s390/ffi.c, ++ ia64/ffi.c: Include ffi_private.h, not ffi_common.h. ++ * alpha/ffi.c, sparc/ffi.c, x86/ffi.c: Don't include ffi_common.h. ++ * types.c, raw_api.c, java_raw_api.c, prep_cif.c: Don't include ++ ffi_common.h. ++ * debug.c: Include ffi_private.h instead of ffi_common.h. ++ ++ * mips/ffi.c (calc_n32_struct_flags): Make static. ++ (FIX_ARGP): Remove call to debugging routine ffi_stop_here. ++ ++ * mips/n32.S: Include ffi_private.h. ++ * mips/o32.S: Include ffi_private.h. ++ ++commit 6fdb7de0fe3b7385e1fd78812ae69d9b3069d994 ++Author: green ++Date: Sun Apr 22 19:38:34 2001 +0000 ++ ++ * README: Update some comments. ++ ++ * Makefile.am (SUBDIRS): Add include so ffi.h gets installed. ++ * Makefile.in: Rebuilt. ++ ++ * include/ffi.h: Change ALPHA to __alpha__ and SPARC to __sparc__. ++ * types.c: Ditto. ++ * prep_cif.c (ffi_prep_cif): Ditto. ++ ++ * alpha/ffi.c, alpha/osf.S, sparc/ffi.c, sparc/v8.S, sparc/v9.S: ++ Include ffi_private.h. ++ ++ * include/ffi_private.h (FFI_TYPE_LAST): Define. ++ ++commit bc7144b01b9707ef35f1a2e3e6996e005e82953a ++Author: green ++Date: Sun Apr 22 18:28:36 2001 +0000 ++ ++ Moved files from old home ++ ++commit e57279831e20368c1aa1d2b35462b8629be73959 ++Author: green ++Date: Sun Apr 22 18:23:47 2001 +0000 ++ ++ These are dead. ++ ++commit 7247436b5fe71767b29dc02b4da0fe18b08082e6 ++Author: green ++Date: Sun Apr 22 18:22:43 2001 +0000 ++ ++ All these files live somewhere else now. ++ ++commit a8b0d40ff908e275028f676870c31d0d70274a98 ++Author: green ++Date: Sun Apr 22 18:17:14 2001 +0000 ++ ++ Many changes. Not quite there yet. ++ ++commit f893d2273355710a290a26faebf5f12c3a34d0e3 ++Author: green ++Date: Sun Apr 22 18:13:22 2001 +0000 ++ ++ Moved m68k files ++ ++commit 688ddfeced89cbb9d37b53005e1f7f2b9c78a8d7 ++Author: green ++Date: Sun Apr 22 18:12:33 2001 +0000 ++ ++ New, target indepentent, header ++ ++commit f9e40776d488d5ecf43b3ae21444a1a2f6eca528 ++Author: green ++Date: Sun Apr 22 18:11:57 2001 +0000 ++ ++ Many changes. ++ ++commit 8c1d2eb47f6bc314c431b75c85c107e8e43c4a76 ++Author: green ++Date: Sun Apr 22 18:10:47 2001 +0000 ++ ++ Many changes ++ ++commit 1359dfc6582680a158b3caa3efb7a368da4aa12d ++Author: green ++Date: Sun Apr 22 18:10:20 2001 +0000 ++ ++ Moved ia64 files ++ ++commit 6e2de5eee316a4579869aff50c7c5f6f478582d8 ++Author: green ++Date: Sun Apr 22 18:08:11 2001 +0000 ++ ++ Moved arm files ++ ++commit 8807355af34cba8ffe87aee51152dfccec2771fa ++Author: green ++Date: Mon Apr 9 00:58:38 2001 +0000 ++ ++ Many many updates. Merge from gcc and then some. ++ ++commit f7e9f91adec4ff1c2e7a13b3de81d2c5a3f55e7e ++Author: green ++Date: Mon Apr 17 03:32:37 2000 +0000 ++ ++ Mnay fixes. ++ ++commit c4860de618f4956283f5c8230a2544e403dfe390 ++Author: green ++Date: Mon Apr 17 03:18:46 2000 +0000 ++ ++ Merge from libgcj. Merged patches from net. See ChangeLog for details. ++ ++commit c578b58314990c3853429297c38ba14015fec5fa ++Author: jsm ++Date: Sat Oct 9 20:18:16 1999 +0000 ++ ++ 1999-10-09 Jason Molenda (jsm@bugshack.cygnus.com) ++ ++ * CVSROOT/auto_checkout, CVSROOT/commit_prep, CVSROOT/log_accum: ++ Deleted; generic versions now used for all repositories. ++ ++ * CVSROOT/commitinfo, CVSROOT/loginfo: Change pathnames to ++ generic versions. ++ ++ * CVSROOT/checkoutlist: Don't try to check out the removed ++ files any longer. ++ ++commit acdb20051207fed7652dd9f122f65de5458c474c ++Author: jsm ++Date: Sat Oct 9 20:18:15 1999 +0000 ++ ++ 1999-10-09 Jason Molenda (jsm@bugshack.cygnus.com) ++ ++ * CVSROOT/auto_checkout, CVSROOT/commit_prep, CVSROOT/log_accum: ++ Deleted; generic versions now used for all repositories. ++ ++ * CVSROOT/commitinfo, CVSROOT/loginfo: Change pathnames to ++ generic versions. ++ ++ * CVSROOT/checkoutlist: Don't try to check out the removed ++ files any longer. ++ ++commit e75be655ceedf7ab24c4e99d75eec9efeb979bc7 ++Author: green ++Date: Sun Aug 8 13:16:41 1999 +0000 ++ ++ New configury ++ ++commit d6669a0dd5b266005325bbf6d5a8ff34574d809e ++Author: green ++Date: Sun Aug 8 13:05:12 1999 +0000 ++ ++ * include/ffi.h.in: Try to work around messy header problem ++ with PACKAGE and VERSION. ++ ++ * configure: Rebuilt. ++ * configure.in: Change version to 2.00-beta. ++ ++ * fficonfig.h.in: Rebuilt. ++ * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. ++ ++ * src/x86/ffi.c (ffi_raw_call): Rename. ++ ++commit 4819d52b007934a40d6d29a75ee30e857c4a93ae ++Author: green ++Date: Wed Aug 4 18:02:34 1999 +0000 ++ ++ New file for Kresten's closure work ++ ++commit 2dbf801eb427cbf5021a9e1e512b5fc523524700 ++Author: green ++Date: Wed Aug 4 18:00:05 1999 +0000 ++ ++ Kresten's closure work. Initial checkin. ++ ++commit d170961701b0f2bf7e824d7caba2ebe10002ed84 ++Author: green ++Date: Thu Jul 8 14:36:52 1999 +0000 ++ ++ * configure.in: Add x86 and powerpc BeOS configurations. ++ From Makoto Kato . ++ ++commit c7747d976924ec6f2229cbcfbbdb98d364e10de9 ++Author: jsm ++Date: Wed May 12 23:32:16 1999 +0000 ++ ++ 1999-05-12 Jason Molenda (jsm@bugshack.cygnus.com) ++ * index.html: Add links to libffi* mail list archives. ++ ++commit dd2aa9a8de22e26df3bbc85d068358641f6202f7 ++Author: green ++Date: Thu May 6 05:34:36 1999 +0000 ++ ++ * configure.in: Add warning about this being beta code. ++ Remove src/Makefile.am from the picture. ++ * configure: Rebuilt. ++ * Makefile.am: Move logic from src/Makefile.am. Add changes ++ to support libffi as a target library. ++ * Makefile.in: Rebuilt. ++ * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: ++ Upgraded to new autoconf, automake, libtool. ++ * README: Tweaks. ++ * LICENSE: Update copyright date. ++ * src/Makefile.am, src/Makefile.in: Removed. ++ ++commit 4e9452abed58a3058ccdb446f96a29d50dda1f34 ++Author: green ++Date: Wed May 5 22:06:13 1999 +0000 ++ ++ Updated to new automake, libtool, autoconf - nothing works :-) ++ ++commit 6d3b2bddaf4967fba8b8656c01bfc77ec0f2800c ++Author: jsm ++Date: Mon Apr 26 15:55:28 1999 +0000 ++ ++ 1999-04-26 Jason Molenda (jsm@bugshack.cygnus.com) ++ * index.html: Missed a reference to libffi-discuss@cygnus.com. Fixed. ++ ++commit ebc6a9c28af831d3d187af8ff17319f0f309bd98 ++Author: jsm ++Date: Mon Apr 26 15:53:29 1999 +0000 ++ ++ 1999-04-26 Jason Molenda (jsm@bugshack.cygnus.com) ++ * index.html: Change links to ftp directory to point to sourceware ++ directory. ++ Change mailing list subscription forms to point to sourceware lists. ++ ++commit 78ffc52a8b257061348c576ccb6fbbf8b48b0fff ++Author: jsm ++Date: Sun Apr 18 01:33:21 1999 +0000 ++ ++ Standard sourceware setup. ++ ++commit b4d77e827d7ebef7e57ebcd71e71c15c62f1e0a8 ++Author: jsm ++Date: Mon Nov 30 11:11:25 1998 +0000 ++ ++ Small typeo. (I wouldn't bother except that it made the sentence hard ++ for me to parse on a casual read.) ++ ++commit bfb73f08fdc987e37070c5fb0b196fbd28872888 ++Author: jsm ++Date: Mon Nov 30 10:44:55 1998 +0000 ++ ++ A few cleanups. Most notably, point to the correct subscribe cgi-bin ++ script. ++ ++commit af8b7f037ccee3b7939ee226a1a2bbc2f057b35c ++Author: green ++Date: Mon Nov 30 06:20:05 1998 +0000 ++ ++ * index.html: Reformatted and updated to reflect hosting on ++ sourceware.cygnus.com (new mailing lists, etc). ++ ++commit 334f0b060942aff8d26badaf7dde7830450dc5da ++Author: green ++Date: Sun Nov 29 16:56:12 1998 +0000 ++ ++ initial snapshot of documentation ++ ++commit 3ab5cb4a1dcc7ecd7e773c97582b0099976c4753 ++Author: green ++Date: Sun Nov 29 16:56:10 1998 +0000 ++ ++ Initial revision ++ ++commit d2a9eb5a8b7cbc8b769809cad59c82b975c178e2 ++Merge: d3782ec bc75c54 ++Author: green ++Date: Sun Nov 29 16:48:16 1998 +0000 ++ ++ This commit was generated by cvs2svn to compensate for changes in r7, which ++ included commits to RCS files with non-trunk default branches. ++ ++commit bc75c54bd311658005b065f1bf201b204c81cbca ++Author: green ++Date: Sun Nov 29 16:48:16 1998 +0000 ++ ++ Import of v1 code. ++ ++commit d3782ec8160c644421dcea17b605fec6e328f14e ++Author: jsm ++Date: Fri Nov 20 20:18:00 1998 +0000 ++ ++ Send commit messages to mailing lists. ++ ++commit 8d8d3843c484c2bb70d8375b2b799f75eb03f709 ++Author: jsm ++Date: Thu Oct 1 22:08:36 1998 +0000 ++ ++ initial checkin ++ ++commit 49634f3bf221cc1939abafc788f7e4e31293fe73 ++Author: jsm ++Date: Thu Oct 1 22:08:35 1998 +0000 ++ ++ Add standard setup. ++ ++commit c64a84c7693f8cd400fb94bba3c9bcfd9ad1fc36 ++Author: jsm ++Date: Thu Oct 1 22:08:34 1998 +0000 ++ ++ Add readers and standard modules file. ++ ++commit 9813273b07fd082da573b3b6bfb8d23809b59eea ++Author: jsm ++Date: Thu Oct 1 22:08:33 1998 +0000 ++ ++ initial checkin +diff --git a/js/src/ctypes/libffi/ChangeLog.libffi b/js/src/ctypes/libffi/ChangeLog.libffi +--- a/js/src/ctypes/libffi/ChangeLog.libffi ++++ b/js/src/ctypes/libffi/ChangeLog.libffi +@@ -1,40 +1,11 @@ +-2010-01-15 Anthony Green ++2011-02-08 Andreas Tobler + +- * README: Add notes on building with Microsoft Visual C++. +- +-2010-01-15 Daniel Witte +- +- * msvcc.sh: New file. +- +- * src/x86/win32.S: Port assembly routines to MSVC and #ifdef. +- * src/x86/ffi.c: Tweak function declaration and remove excess +- parens. +- * include/ffi.h.in: Add __declspec(align(8)) to typedef struct +- ffi_closure. +- +- * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new +- function ffi_call_win32 on X86_WIN32. +- * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32. +- (ffi_call_STDCALL): Remove. +- +- * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code +- to ffi_prep_cif_machdep for x86. +- * src/x86/ffi.c (ffi_prep_cif_machdep): To here. +- +-2010-01-15 Oliver Kiddle +- +- * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for +- Sun Studio compiler compatibility. +- +-2010-01-12 Conrad Irwin +- +- * doc/libffi.texi: Add closure example. +- * doc/libffi.info: Rebuilt. ++ * testsuite/lib/libffi.exp: Tweak for stand-alone mode. + + 2009-12-25 Samuli Suominen + + * configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + + 2009-06-16 Andrew Haley +@@ -598,16 +569,16 @@ 2008-01-30 H.J. Lu + + * Makefile.am, include/Makefile.am: Move headers to + libffi_la_SOURCES for new automake. + * Makefile.in, include/Makefile.in: Rebuilt. +- +- * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for ++ ++ * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for + execution outside of gcc tree. + * testsuite/lib/target-libpath.exp: Ditto. + + * testsuite/lib/libffi-dg.exp: Many changes to allow for execution + outside of gcc tree. + +diff --git a/js/src/ctypes/libffi/ChangeLog.libffi-3.1 b/js/src/ctypes/libffi/ChangeLog.libffi-3.1 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/ChangeLog.libffi-3.1 +@@ -0,0 +1,6000 @@ ++2014-03-16 Josh Triplett ++ ++ * ChangeLog: Archive to ChangeLog.libffi-3.1 and delete. Future ++ changelogs will come from git, with autogenerated snapshots shipped in ++ distributed tarballs. ++ ++2014-03-16 Josh Triplett ++ ++ Add support for stdcall, thiscall, and fastcall on non-Windows ++ x86-32. ++ ++ Linux supports the stdcall calling convention, either via ++ functions explicitly declared with the stdcall attribute, or via ++ code compiled with -mrtd which effectively makes stdcall the ++ default. ++ ++ This introduces FFI_STDCALL, FFI_THISCALL, and FFI_FASTCALL on ++ non-Windows x86-32 platforms, as non-default calling conventions. ++ ++ * Makefile.am: Compile in src/x86/win32.S on non-Windows x86-32. ++ * src/x86/ffitarget.h: Add FFI_STDCALL, FFI_THISCALL, and ++ FFI_FASTCALL on non-Windows x86-32. Increase trampoline size to ++ accomodate these calling conventions, and unify some ifdeffery. ++ * src/x86/ffi.c: Add support for FFI_STDCALL, FFI_THISCALL, and ++ FFI_FASTCALL on non-Windows x86-32 platforms; update ifdeffery. ++ * src/x86/win32.S: Support compiling on non-Windows x86-32 ++ platforms. On those platforms, avoid redefining the SYSV symbols ++ already provided by src/x86/sysv.S. ++ * testsuite/libffi.call/closure_stdcall.c: Run on non-Windows. ++ #define __stdcall if needed. ++ * testsuite/libffi.call/closure_thiscall.c: Run on non-Windows. ++ #define __fastcall if needed. ++ * testsuite/libffi.call/fastthis1_win32.c: Run on non-Windows. ++ * testsuite/libffi.call/fastthis2_win32.c: Ditto. ++ * testsuite/libffi.call/fastthis3_win32.c: Ditto. ++ * testsuite/libffi.call/many2_win32.c: Ditto. ++ * testsuite/libffi.call/many_win32.c: Ditto. ++ * testsuite/libffi.call/strlen2_win32.c: Ditto. ++ * testsuite/libffi.call/strlen_win32.c: Ditto. ++ * testsuite/libffi.call/struct1_win32.c: Ditto. ++ * testsuite/libffi.call/struct2_win32.c: Ditto. ++ ++2014-03-16 Josh Triplett ++ ++ * prep_cif.c: Remove unnecessary ifdef for X86_WIN32. ++ ffi_prep_cif_core had a special case for X86_WIN32, checking for ++ FFI_THISCALL in addition to the FFI_FIRST_ABI-to-FFI_LAST_ABI ++ range before returning FFI_BAD_ABI. However, on X86_WIN32, ++ FFI_THISCALL already falls in that range, making the special case ++ unnecessary. Remove it. ++ ++2014-03-16 Josh Triplett ++ ++ * testsuite/libffi.call/closure_stdcall.c, ++ testsuite/libffi.call/closure_thiscall.c: Remove fragile stack ++ pointer checks. These files included inline assembly to save the ++ stack pointer before and after the call, and compare the values. ++ However, compilers can and do leave the stack in different states ++ for these two pieces of inline assembly, such as by saving a ++ temporary value on the stack across the call; observed with gcc ++ -Os, and verified as spurious through careful inspection of ++ disassembly. ++ ++2014-03-16 Josh Triplett ++ ++ * testsuite/libffi.call/many.c: Avoid spurious failure due to ++ excess floating-point precision. ++ * testsuite/libffi.call/many_win32.c: Ditto. ++ ++2014-03-16 Josh Triplett ++ ++ * libtool-ldflags: Re-add. ++ ++2014-03-16 Josh Triplett ++ ++ * Makefile.in, aclocal.m4, compile, config.guess, config.sub, ++ configure, depcomp, include/Makefile.in, install-sh, ++ libtool-ldflags, ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, ++ m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4, ++ man/Makefile.in, mdate-sh, missing, testsuite/Makefile.in: Delete ++ autogenerated files from version control. ++ * .gitignore: Add autogenerated files. ++ * autogen.sh: New script to generate the autogenerated files. ++ * README: Document requirement to run autogen.sh when building ++ directly from version control. ++ * .travis.yml: Run autogen.sh ++ ++2014-03-14 Anthony Green ++ ++ * configure, Makefile.in: Rebuilt. ++ ++2014-03-10 Mike Hommey ++ ++ * configure.ac: Allow building for mipsel with Android NDK r8. ++ * Makefile.am (AM_MAKEFLAGS): Replace double quotes with single ++ quotes. ++ ++2014-03-10 Landry Breuil ++ ++ * configure.ac: Ensure the linker supports @unwind sections in libffi. ++ ++2014-03-01 Anthony Green ++ ++ * Makefile.am (EXTRA_DIST): Replace old scripts with ++ generate-darwin-source-and-headers.py. ++ * Makefile.in: Rebuilt. ++ ++2014-02-28 Anthony Green ++ ++ * Makefile.am (AM_CFLAGS): Reintroduce missing -DFFI_DEBUG for ++ --enable-debug builds. ++ * Makefile.in: Rebuilt. ++ ++2014-02-28 Makoto Kato ++ ++ * src/closures.c: Fix build failure when using clang for Android. ++ ++2014-02-28 Marcin Wojdyr ++ ++ * libffi.pc.in (toolexeclibdir): use -L${toolexeclibdir} instead ++ of -L${libdir}. ++ ++2014-02-28 Paulo Pizarro ++ ++ * src/bfin/sysv.S: Calling functions in shared libraries requires ++ considering the GOT. ++ ++2014-02-28 Josh Triplett ++ ++ * src/x86/ffi64.c (classify_argument): Handle case where ++ FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE. ++ ++2014-02-28 Anthony Green ++ ++ * ltmain.sh: Generate with libtool-2.4.2.418. ++ * m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4: Ditto. ++ * configure: Rebuilt. ++ ++2014-02-28 Dominik Vogt ++ ++ * configure.ac (AC_ARG_ENABLE struct): Fix typo in help ++ message. ++ (AC_ARG_ENABLE raw_api): Ditto. ++ * configure, fficonfig.h.in: Rebuilt. ++ ++2014-02-28 Will Newton ++ ++ * src/arm/sysv.S: Initialize IP register with FP. ++ ++2014-02-28 Yufeng Zhang ++ ++ * src/aarch64/sysv.S (ffi_closure_SYSV): Use x29 as the ++ main CFA reg; update cfi_rel_offset. ++ ++2014-02-15 Marcus Comstedt ++ ++ * src/powerpc/ffi_linux64.c, src/powerpc/linux64_closure.S: Remove ++ assumption on contents of r11 in closure. ++ ++2014-02-09 Heiher ++ ++ * src/mips/n32.S: Fix call floating point va function. ++ ++2014-01-21 Zachary Waldowski ++ ++ * src/aarch64/ffi.c: Fix missing semicolons on assertions under ++ debug mode. ++ ++2013-12-30 Zachary Waldowski ++ ++ * .gitignore: Exclude darwin_* generated source and build_* trees. ++ * src/aarch64/ffi.c, src/arm/ffi.c, src/x86/ffi.c: Inhibit Clang ++ previous prototype warnings. ++ * src/arm/ffi.c: Prevent NULL dereference, fix short type warning ++ * src/dlmalloc.c: Fix warnings from set_segment_flags return type, ++ and the native use of size_t for malloc on platforms ++ * src/arm/sysv.S: Use unified syntax. Clang clean-ups for ++ ARM_FUNC_START. ++ * generate-osx-source-and-headers.py: Remove. ++ * build-ios.sh: Remove. ++ * libffi.xcodeproj/project.pbxproj: Rebuild targets. Include ++ x86_64+aarch64 pieces in library. Export headers properly. ++ * src/x86/ffi64.c: More Clang warning clean-ups. ++ * src/closures.c (open_temp_exec_file_dir): Use size_t. ++ * src/prep_cif.c (ffi_prep_cif_core): Cast ALIGN result. ++ * src/aarch64/sysv.S: Use CNAME for global symbols. Only use ++ .size for ELF targets. ++ * src/aarch64/ffi.c: Clean up for double == long double. Clean up ++ from Clang warnings. Use Clang cache invalidation builtin. Use ++ size_t in place of unsigned in many places. Accommodate for ++ differences in Apple AArch64 ABI. ++ ++2013-12-02 Daniel Rodríguez Troitiño ++ ++ * generate-darwin-source-and-headers.py: Clean up, modernize, ++ merged version of previous scripts. ++ ++2013-11-21 Anthony Green ++ ++ * configure, Makefile.in, include/Makefile.in, include/ffi.h.in, ++ man/Makefile.in, testsuite/Makefile.in, fficonfig.h.in: Rebuilt. ++ ++2013-11-21 Alan Modra ++ ++ * Makefile.am (EXTRA_DIST): Add new src/powerpc files. ++ (nodist_libffi_la_SOURCES ): Likewise. ++ * configure.ac (HAVE_LONG_DOUBLE_VARIANT): Define for powerpc. ++ * include/ffi.h.in (ffi_prep_types): Declare. ++ * src/prep_cif.c (ffi_prep_cif_core): Call ffi_prep_types. ++ * src/types.c (FFI_NONCONST_TYPEDEF): Define and use for ++ HAVE_LONG_DOUBLE_VARIANT. ++ * src/powerpc/ffi_powerpc.h: New file. ++ * src/powerpc/ffi.c: Split into.. ++ * src/powerpc/ffi_sysv.c: ..new file, and.. ++ * src/powerpc/ffi_linux64.c: ..new file, rewriting parts. ++ * src/powerpc/ffitarget.h (enum ffi_abi): Rewrite powerpc ABI ++ selection as bits controlling features. ++ * src/powerpc/linux64.S: For consistency, use POWERPC64 rather ++ than __powerpc64__. ++ * src/powerpc/linux64_closure.S: Likewise. ++ * src/powerpc/ppc_closure.S: Likewise. Move .note.FNU-stack ++ inside guard. ++ * src/powerpc/sysv.S: Likewise. ++ * configure: Regenerate. ++ * fficonfig.h.in: Regenerate. ++ * Makefile.in: Regenerate. ++ ++2013-11-20 Alan Modra ++ ++ * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use ++ NUM_FPR_ARG_REGISTERS64 and NUM_GPR_ARG_REGISTERS64 not their ++ 32-bit versions for 64-bit code. ++ * src/powerpc/linux64_closure.S: Don't use the return value area ++ as a parameter save area on ELFv2. ++ ++2013-11-18 Iain Sandoe ++ ++ * src/powerpc/darwin.S (EH): Correct use of pcrel FDE encoding. ++ * src/powerpc/darwin_closure.S (EH): Likewise. Modernise picbase ++ labels. ++ ++2013-11-18 Anthony Green ++ ++ * src/arm/ffi.c (ffi_call): Hoist declaration of temp to top of ++ function. ++ * src/arm/ffi.c (ffi_closure_inner): Moderize function declaration ++ to appease compiler. ++ Thanks for Gregory P. Smith . ++ ++2013-11-18 Anthony Green ++ ++ * README (tested): Mention PowerPC ELFv2. ++ ++2013-11-16 Alan Modra ++ ++ * src/powerpc/ppc_closure.S: Move errant #endif to where it belongs. ++ Don't bl .Luint128. ++ ++2013-11-16 Alan Modra ++ ++ * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use #if _CALL_ELF ++ test to select parameter save sizing for ELFv2 vs. ELFv1. ++ * src/powerpc/ffitarget.h (FFI_V2_TYPE_FLOAT_HOMOG, ++ FFI_V2_TYPE_DOUBLE_HOMOG, FFI_V2_TYPE_SMALL_STRUCT): Define. ++ (FFI_TRAMPOLINE_SIZE): Define variant for ELFv2. ++ * src/powerpc/ffi.c (FLAG_ARG_NEEDS_PSAVE): Define. ++ (discover_homogeneous_aggregate): New function. ++ (ffi_prep_args64): Adjust start of param save area for ELFv2. ++ Handle homogenous floating point struct parms. ++ (ffi_prep_cif_machdep_core): Adjust space calculation for ELFv2. ++ Handle ELFv2 return values. Set FLAG_ARG_NEEDS_PSAVE. Handle ++ homogenous floating point structs. ++ (ffi_call): Increase size of smst_buffer for ELFv2. Handle ELFv2. ++ (flush_icache): Compile for ELFv2. ++ (ffi_prep_closure_loc): Set up ELFv2 trampoline. ++ (ffi_closure_helper_LINUX64): Don't return all structs directly ++ to caller. Handle homogenous floating point structs. Handle ++ ELFv2 struct return values. ++ * src/powerpc/linux64.S (ffi_call_LINUX64): Set up r2 for ++ ELFv2. Adjust toc save location. Call function pointer using ++ r12. Handle FLAG_RETURNS_SMST. Don't predict branches. ++ * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Set up r2 ++ for ELFv2. Define ELFv2 versions of STACKFRAME, PARMSAVE, and ++ RETVAL. Handle possibly missing parameter save area. Handle ++ ELFv2 return values. ++ (.note.GNU-stack): Move inside outer #ifdef. ++ ++2013-11-16 Alan Modra ++ ++ * src/powerpc/ffi.c (ffi_prep_cif_machdep): Revert 2013-02-08 ++ change. Do not consume an int arg when returning a small struct ++ for FFI_SYSV ABI. ++ (ffi_call): Only use bounce buffer when FLAG_RETURNS_SMST. ++ Properly copy bounce buffer to destination. ++ * src/powerpc/sysv.S: Revert 2013-02-08 change. ++ * src/powerpc/ppc_closure.S: Remove stray '+'. ++ ++2013-11-16 Alan Modra ++ ++ * src/powerpc/ffi.c (ffi_prep_args64): Align struct parameters ++ according to __STRUCT_PARM_ALIGN__. ++ (ffi_prep_cif_machdep_core): Likewise. ++ (ffi_closure_helper_LINUX64): Likewise. ++ ++2013-11-16 Alan Modra ++ ++ * src/powerpc/linux64.S (ffi_call_LINUX64): Tweak restore of r28. ++ (.note.GNU-stack): Move inside outer #ifdef. ++ * src/powerpc/linux64_closure.S (STACKFRAME, PARMSAVE, ++ RETVAL): Define and use throughout. ++ (ffi_closure_LINUX64): Save fprs before buying stack. ++ (.note.GNU-stack): Move inside outer #ifdef. ++ ++2013-11-16 Alan Modra ++ ++ * src/powerpc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define. ++ (FFI_EXTRA_CIF_FIELDS): Define. ++ * src/powerpc/ffi.c (ffi_prep_args64): Save fprs as per the ++ ABI, not to both fpr and param save area. ++ (ffi_prep_cif_machdep_core): Renamed from ffi_prep_cif_machdep. ++ Keep initial flags. Formatting. Remove dead FFI_LINUX_SOFT_FLOAT ++ code. ++ (ffi_prep_cif_machdep, ffi_prep_cif_machdep_var): New functions. ++ (ffi_closure_helper_LINUX64): Pass floating point as per ABI, ++ not to both fpr and parameter save areas. ++ ++ * libffi/testsuite/libffi.call/cls_double_va.c (main): Correct ++ function cast and don't call ffi_prep_cif. ++ * libffi/testsuite/libffi.call/cls_longdouble_va.c (main): Likewise. ++ ++2013-11-15 Andrew Haley ++ ++ * doc/libffi.texi (Closure Example): Fix the sample code. ++ * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. ++ ++2013-11-15 Andrew Haley ++ ++ * testsuite/libffi.call/va_struct1.c (main): Fix broken test. ++ * testsuite/libffi.call/cls_uint_va.c (cls_ret_T_fn): Likewise ++ * testsuite/libffi.call/cls_struct_va1.c (test_fn): Likewise. ++ * testsuite/libffi.call/va_1.c (main): Likewise. ++ ++2013-11-14 David Schneider ++ ++ * src/arm/ffi.c: Fix register allocation for mixed float and ++ doubles. ++ * testsuite/libffi.call/cls_many_mixed_float_double.c: Testcase ++ for many mixed float and double arguments. ++ ++2013-11-13 Alan Modra ++ ++ * doc/libffi.texi (Simple Example): Correct example code. ++ * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. ++ ++2013-11-13 Anthony Green ++ ++ * include/ffi_common.h: Respect HAVE_ALLOCA_H for GNU compiler ++ based build. (Thanks to tmr111116 on github) ++ ++2013-11-09 Anthony Green ++ ++ * m4/libtool.m4: Refresh. ++ * configure, Makefile.in: Rebuilt. ++ * README: Add more notes about next release. ++ ++2013-11-09 Shigeharu TAKENO ++ ++ * m4/ax_gcc_archflag.m4 (ax_gcc_arch): Don't recognize ++ UltraSPARC-IIi as ultrasparc3. ++ ++2013-11-06 Mark Kettenis ++ ++ * src/x86/freebsd.S (ffi_call_SYSV): Align the stack pointer to ++ 16-bytes. ++ ++2013-11-06 Konstantin Belousov ++ ++ * src/x86/freebsd.S (ffi_closure_raw_SYSV): Mark the assembler ++ source as not requiring executable stack. ++ ++2013-11-02 Anthony Green ++ ++ * doc/libffi.texi (The Basics): Clarify return value buffer size ++ requirements. Also, NULL result buffer pointers are no longer ++ supported. ++ * doc/libffi.info: Rebuilt. ++ ++2013-11-02 Mischa Jonker ++ ++ * Makefile.am (nodist_libffi_la_SOURCES): Fix build error. ++ * Makefile.in: Rebuilt. ++ ++2013-11-02 David Schneider ++ ++ * src/arm/ffi.c: more robust argument handling for closures on arm hardfloat ++ * testsuite/libffi.call/many_mixed.c: New file. ++ * testsuite/libffi.call/cls_many_mixed_args.c: More tests. ++ ++2013-11-02 Vitaly Budovski ++ ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Don't align stack for win32. ++ ++2013-10-23 Mark H Weaver ++ ++ * src/mips/ffi.c: Fix handling of uint32_t arguments on the ++ MIPS N32 ABI. ++ ++2013-10-13 Sandra Loosemore ++ ++ * README: Add Nios II to table of supported platforms. ++ * Makefile.am (EXTRA_DIST): Add nios2 files. ++ (nodist_libffi_la_SOURCES): Likewise. ++ * Makefile.in: Regenerated. ++ * configure.ac (nios2*-linux*): New host. ++ (NIOS2): Add AM_CONDITIONAL. ++ * configure: Regenerated. ++ * src/nios2/ffi.c: New. ++ * src/nios2/ffitarget.h: New. ++ * src/nios2/sysv.S: New. ++ * src/prep_cif.c (initialize_aggregate): Handle extra structure ++ alignment via FFI_AGGREGATE_ALIGNMENT. ++ (ffi_prep_cif_core): Conditionalize structure return for NIOS2. ++ ++2013-10-10 Sandra Loosemore ++ ++ * testsuite/libffi.call/cls_many_mixed_args.c (cls_ret_double_fn): ++ Fix uninitialized variable. ++ ++2013-10-11 Marcus Shawcroft ++ ++ * testsuite/libffi.call/many.c (many): Replace * with +. ++ ++2013-10-08 Ondřej Bílka ++ ++ * src/aarch64/ffi.c, src/aarch64/sysv.S, src/arm/ffi.c, ++ src/arm/gentramp.sh, src/bfin/sysv.S, src/closures.c, ++ src/dlmalloc.c, src/ia64/ffi.c, src/microblaze/ffi.c, ++ src/microblaze/sysv.S, src/powerpc/darwin_closure.S, ++ src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/sh/ffi.c, ++ src/tile/tile.S, testsuite/libffi.call/nested_struct11.c: Fix ++ spelling errors. ++ ++2013-10-08 Anthony Green ++ ++ * aclocal.m4, compile, config.guess, config.sub, depcomp, ++ install-sh, mdate-sh, missing, texinfo.tex: Update from upstream. ++ * configure.ac: Update version to 3.0.14-rc0. ++ * Makefile.in, configure, Makefile.in, include/Makefile.in, ++ man/Makefile.in, testsuite/Makefile.in: Rebuilt. ++ * README: Mention M88K and VAX. ++ ++2013-07-15 Miod Vallat ++ ++ * Makefile.am, ++ configure.ac, ++ src/m88k/ffi.c, ++ src/m88k/ffitarget.h, ++ src/m88k/obsd.S, ++ src/vax/elfbsd.S, ++ src/vax/ffi.c, ++ src/vax/ffitarget.h: Add m88k and vax support. ++ ++2013-06-24 Alan Modra ++ ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Move var declaration ++ before statements. ++ (ffi_prep_args64): Support little-endian. ++ (ffi_closure_helper_SYSV, ffi_closure_helper_LINUX64): Likewise. ++ * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise. ++ * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise. ++ ++2013-06-12 Mischa Jonker ++ ++ * configure.ac: Add support for ARC. ++ * Makefile.am: Likewise. ++ * README: Add ARC details. ++ * src/arc/arcompact.S: New. ++ * src/arc/ffi.c: Likewise. ++ * src/arc/ffitarget.h: Likewise. ++ ++2013-03-28 David Schneider ++ ++ * src/arm/ffi.c: Fix support for ARM hard-float calling convention. ++ * src/arm/sysv.S: call different methods for SYSV and VFP ABIs. ++ * testsuite/libffi.call/cls_many_mixed_args.c: testcase for a closure with ++ mixed arguments, many doubles. ++ * testsuite/libffi.call/many_double.c: testcase for calling a function using ++ more than 8 doubles. ++ * testcase/libffi.call/many.c: use absolute value to check result against an ++ epsilon ++ ++2013-03-17 Anthony Green ++ ++ * README: Update for 3.0.13. ++ * configure.ac: Ditto. ++ * configure: Rebuilt. ++ * doc/*: Update version. ++ ++2013-03-17 Dave Korn ++ ++ * src/closures.c (is_emutramp_enabled ++ [!FFI_MMAP_EXEC_EMUTRAMP_PAX]): Move default definition outside ++ enclosing #if scope. ++ ++2013-03-17 Anthony Green ++ ++ * configure.ac: Only modify toolexecdir in certain cases. ++ * configure: Rebuilt. ++ ++2013-03-16 Gilles Talis ++ ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Don't use ++ fparg_count,etc on __NO_FPRS__ targets. ++ ++2013-03-16 Alan Hourihane ++ ++ * src/m68k/sysv.S (epilogue): Don't use extb instruction on ++ m680000 machines. ++ ++2013-03-16 Alex Gaynor ++ ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Always align stack. ++ ++2013-03-13 Markos Chandras ++ ++ * configure.ac: Add support for Imagination Technologies Meta. ++ * Makefile.am: Likewise. ++ * README: Add Imagination Technologies Meta details. ++ * src/metag/ffi.c: New. ++ * src/metag/ffitarget.h: Likewise. ++ * src/metag/sysv.S: Likewise. ++ ++2013-02-24 Andreas Schwab ++ ++ * doc/libffi.texi (Structures): Fix missing category argument of ++ @deftp. ++ ++2013-02-11 Anthony Green ++ ++ * configure.ac: Update release number to 3.0.12. ++ * configure: Rebuilt. ++ * README: Update release info. ++ ++2013-02-10 Anthony Green ++ ++ * README: Add Moxie. ++ * src/moxie/ffi.c: Created. ++ * src/moxie/eabi.S: Created. ++ * src/moxie/ffitarget.h: Created. ++ * Makefile.am (nodist_libffi_la_SOURCES): Add Moxie. ++ * Makefile.in: Rebuilt. ++ * configure.ac: Add Moxie. ++ * configure: Rebuilt. ++ * testsuite/libffi.call/huge_struct.c: Disable format string ++ warnings for moxie*-*-elf tests. ++ ++2013-02-10 Anthony Green ++ ++ * Makefile.am (LTLDFLAGS): Fix reference. ++ * Makefile.in: Rebuilt. ++ ++2013-02-10 Anthony Green ++ ++ * README: Update supported platforms. Update test results link. ++ ++2013-02-09 Anthony Green ++ ++ * testsuite/libffi.call/negint.c: Remove forced -O2. ++ * testsuite/libffi.call/many2.c (foo): Remove GCCism. ++ * testsuite/libffi.call/ffitest.h: Add default PRIuPTR definition. ++ ++ * src/sparc/v8.S (ffi_closure_v8): Import ancient ulonglong ++ closure return type fix developed by Martin v. Löwis for cpython ++ fork. ++ ++2013-02-08 Andreas Tobler ++ ++ * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix small struct ++ support. ++ * src/powerpc/sysv.S: Ditto. ++ ++2013-02-08 Anthony Green ++ ++ * testsuite/libffi.call/cls_longdouble.c: Remove xfail for ++ arm*-*-*. ++ ++2013-02-08 Anthony Green ++ ++ * src/sparc/ffi.c (ffi_prep_closure_loc): Fix cache flushing for GCC. ++ ++2013-02-08 Matthias Klose ++ ++ * man/ffi_prep_cif.3: Clean up for debian linter. ++ ++2013-02-08 Peter Bergner ++ ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Account for FP args pushed ++ on the stack. ++ ++2013-02-08 Anthony Green ++ ++ * Makefile.am (EXTRA_DIST): Add missing files. ++ * testsuite/Makefile.am (EXTRA_DIST): Ditto. ++ * Makefile.in: Rebuilt. ++ ++2013-02-08 Anthony Green ++ ++ * configure.ac: Move sparc asm config checks to within functions ++ for compatibility with sun tools. ++ * configure: Rebuilt. ++ * src/sparc/ffi.c (ffi_prep_closure_loc): Flush cache on v9 ++ systems. ++ * src/sparc/v8.S (ffi_flush_icache): Implement a sparc v9 cache ++ flusher. ++ ++2013-02-08 Nathan Rossi ++ ++ * src/microblaze/ffi.c (ffi_closure_call_SYSV): Fix handling of ++ small big-endian structures. ++ (ffi_prep_args): Ditto. ++ ++2013-02-07 Anthony Green ++ ++ * src/sparc/v8.S (ffi_call_v8): Fix typo from last patch ++ (effectively hiding ffi_call_v8). ++ ++2013-02-07 Anthony Green ++ ++ * configure.ac: Update bug reporting address. ++ * configure.in: Rebuild. ++ ++ * src/sparc/v8.S (ffi_flush_icache): Out-of-line cache flusher for ++ Sun compiler. ++ * src/sparc/ffi.c (ffi_call): Remove warning. ++ Call ffi_flush_icache for non-GCC builds. ++ (ffi_prep_closure_loc): Use ffi_flush_icache. ++ ++ * Makefile.am (EXTRA_DIST): Add libtool-ldflags. ++ * Makefile.in: Rebuilt. ++ * libtool-ldflags: New file. ++ ++2013-02-07 Daniel Schepler ++ ++ * configure.ac: Correctly identify x32 systems as 64-bit. ++ * m4/libtool.m4: Remove libtool expr error. ++ * aclocal.m4, configure: Rebuilt. ++ ++2013-02-07 Anthony Green ++ ++ * configure.ac: Fix GCC usage test. ++ * configure: Rebuilt. ++ * README: Mention LLVM/GCC x86_64 issue. ++ * testsuite/Makefile.in: Rebuilt. ++ ++2013-02-07 Anthony Green ++ ++ * testsuite/libffi.call/cls_double_va.c (main): Replace // style ++ comments with /* */ for xlc compiler. ++ * testsuite/libffi.call/stret_large.c (main): Ditto. ++ * testsuite/libffi.call/stret_large2.c (main): Ditto. ++ * testsuite/libffi.call/nested_struct1.c (main): Ditto. ++ * testsuite/libffi.call/huge_struct.c (main): Ditto. ++ * testsuite/libffi.call/float_va.c (main): Ditto. ++ * testsuite/libffi.call/cls_struct_va1.c (main): Ditto. ++ * testsuite/libffi.call/cls_pointer_stack.c (main): Ditto. ++ * testsuite/libffi.call/cls_pointer.c (main): Ditto. ++ * testsuite/libffi.call/cls_longdouble_va.c (main): Ditto. ++ ++2013-02-06 Anthony Green ++ ++ * man/ffi_prep_cif.3: Clean up for debian lintian checker. ++ ++2013-02-06 Anthony Green ++ ++ * Makefile.am (pkgconfigdir): Add missing pkgconfig install bits. ++ * Makefile.in: Rebuild. ++ ++2013-02-02 Mark H Weaver ++ ++ * src/x86/ffi64.c (ffi_call): Sign-extend integer arguments passed ++ via general purpose registers. ++ ++2013-01-21 Nathan Rossi ++ ++ * README: Add MicroBlaze details. ++ * Makefile.am: Add MicroBlaze support. ++ * configure.ac: Likewise. ++ * src/microblaze/ffi.c: New. ++ * src/microblaze/ffitarget.h: Likewise. ++ * src/microblaze/sysv.S: Likewise. ++ ++2013-01-21 Nathan Rossi ++ * testsuite/libffi.call/return_uc.c: Fixed issue. ++ ++2013-01-21 Chris Zankel ++ ++ * README: Add Xtensa support. ++ * Makefile.am: Likewise. ++ * configure.ac: Likewise. ++ * Makefile.in Regenerate. ++ * configure: Likewise. ++ * src/prep_cif.c: Handle Xtensa. ++ * src/xtensa: New directory. ++ * src/xtensa/ffi.c: New file. ++ * src/xtensa/ffitarget.h: Ditto. ++ * src/xtensa/sysv.S: Ditto. ++ ++2013-01-11 Anthony Green ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Replace // style ++ comments with /* */ for xlc compiler. ++ * src/powerpc/aix.S (ffi_call_AIX): Ditto. ++ * testsuite/libffi.call/ffitest.h (allocate_mmap): Delete ++ deprecated inline function. ++ * testsuite/libffi.special/ffitestcxx.h: Ditto. ++ * README: Add update for AIX support. ++ ++2013-01-11 Anthony Green ++ ++ * configure.ac: Robustify pc relative reloc check. ++ * m4/ax_cc_maxopt.m4: Don't -malign-double. This is an ABI ++ changing option for 32-bit x86. ++ * aclocal.m4, configure: Rebuilt. ++ * README: Update supported target list. ++ ++2013-01-10 Anthony Green ++ ++ * README (tested): Add Compiler column to table. ++ ++2013-01-10 Anthony Green ++ ++ * src/x86/ffi64.c (struct register_args): Make sse array and array ++ of unions for sunpro compiler compatibility. ++ ++2013-01-10 Anthony Green ++ ++ * configure.ac: Test target platform size_t size. Handle both 32 ++ and 64-bit builds for x86_64-* and i?86-* targets (allowing for ++ CFLAG option to change default settings). ++ * configure, aclocal.m4: Rebuilt. ++ ++2013-01-10 Anthony Green ++ ++ * testsuite/libffi.special/special.exp: Only run exception ++ handling tests when using GNU compiler. ++ ++ * m4/ax_compiler_vendor.m4: New file. ++ * configure.ac: Test for compiler vendor and don't use ++ AX_CFLAGS_WARN_ALL with the sun compiler. ++ * aclocal.m4, configure: Rebuilt. ++ ++2013-01-10 Anthony Green ++ ++ * include/ffi_common.h: Don't use GCCisms to define types when ++ building with the SUNPRO compiler. ++ ++2013-01-10 Anthony Green ++ ++ * configure.ac: Put local.exp in the right place. ++ * configure: Rebuilt. ++ ++ * src/x86/ffi.c: Update comment about regparm function attributes. ++ * src/x86/sysv.S (ffi_closure_SYSV): The SUNPRO compiler requires ++ that all function arguments be passed on the stack (no regparm ++ support). ++ ++2013-01-08 Anthony Green ++ ++ * configure.ac: Generate local.exp. This sets CC_FOR_TARGET ++ when we are using the vendor compiler. ++ * testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): Point to ++ ../local.exp. ++ * configure, testsuite/Makefile.in: Rebuilt. ++ ++ * testsuite/libffi.call/call.exp: Run tests with different ++ options, depending on whether or not we are using gcc or the ++ vendor compiler. ++ * testsuite/lib/libffi.exp (libffi-init): Set using_gcc based on ++ whether or not we are building/testing with gcc. ++ ++2013-01-08 Anthony Green ++ ++ * configure.ac: Switch x86 solaris target to X86 by default. ++ * configure: Rebuilt. ++ ++2013-01-08 Anthony Green ++ ++ * configure.ac: Fix test for read-only eh_frame. ++ * configure: Rebuilt. ++ ++2013-01-08 Anthony Green ++ ++ * src/x86/sysv.S, src/x86/unix64.S: Only emit DWARF unwind info ++ when building with the GNU toolchain. ++ * testsuite/libffi.call/ffitest.h (CHECK): Fix for Solaris vendor ++ compiler. ++ ++2013-01-07 Thorsten Glaser ++ ++ * testsuite/libffi.call/cls_uchar_va.c, ++ testsuite/libffi.call/cls_ushort_va.c, ++ testsuite/libffi.call/va_1.c: Testsuite fixes. ++ ++2013-01-07 Thorsten Glaser ++ ++ * src/m68k/ffi.c (CIF_FLAGS_SINT8, CIF_FLAGS_SINT16): Define. ++ (ffi_prep_cif_machdep): Fix 8-bit and 16-bit signed calls. ++ * src/m68k/sysv.S (ffi_call_SYSV, ffi_closure_SYSV): Ditto. ++ ++2013-01-04 Anthony Green ++ ++ * Makefile.am (AM_CFLAGS): Don't automatically add -fexceptions ++ and -Wall. This is set in the configure script after testing for ++ GCC. ++ * Makefile.in: Rebuilt. ++ ++2013-01-02 rofl0r ++ ++ * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix build error on ppc ++ when long double == double. ++ ++2013-01-02 Reini Urban ++ ++ * Makefile.am (libffi_la_LDFLAGS): Add -no-undefined to LDFLAGS ++ (required for shared libs on cygwin/mingw). ++ * Makefile.in: Rebuilt. ++ ++2012-10-31 Alan Modra ++ ++ * src/powerpc/linux64_closure.S: Add new ABI support. ++ * src/powerpc/linux64.S: Likewise. ++ ++2012-10-30 Magnus Granberg ++ Pavel Labushev ++ ++ * configure.ac: New options pax_emutramp ++ * configure, fficonfig.h.in: Regenerated ++ * src/closures.c: New function emutramp_enabled_check() and ++ checks. ++ ++2012-10-30 Frederick Cheung ++ ++ * configure.ac: Enable FFI_MAP_EXEC_WRIT for Darwin 12 (mountain ++ lion) and future version. ++ * configure: Rebuild. ++ ++2012-10-30 James Greenhalgh ++ Marcus Shawcroft ++ ++ * README: Add details of aarch64 port. ++ * src/aarch64/ffi.c: New. ++ * src/aarch64/ffitarget.h: Likewise. ++ * src/aarch64/sysv.S: Likewise. ++ * Makefile.am: Support aarch64. ++ * configure.ac: Support aarch64. ++ * Makefile.in, configure: Rebuilt. ++ ++2012-10-30 James Greenhalgh ++ Marcus Shawcroft ++ ++ * testsuite/lib/libffi.exp: Add support for aarch64. ++ * testsuite/libffi.call/cls_struct_va1.c: New. ++ * testsuite/libffi.call/cls_uchar_va.c: Likewise. ++ * testsuite/libffi.call/cls_uint_va.c: Likewise. ++ * testsuite/libffi.call/cls_ulong_va.c: Likewise. ++ * testsuite/libffi.call/cls_ushort_va.c: Likewise. ++ * testsuite/libffi.call/nested_struct11.c: Likewise. ++ * testsuite/libffi.call/uninitialized.c: Likewise. ++ * testsuite/libffi.call/va_1.c: Likewise. ++ * testsuite/libffi.call/va_struct1.c: Likewise. ++ * testsuite/libffi.call/va_struct2.c: Likewise. ++ * testsuite/libffi.call/va_struct3.c: Likewise. ++ ++2012-10-12 Walter Lee ++ ++ * Makefile.am: Add TILE-Gx/TILEPro support. ++ * configure.ac: Likewise. ++ * Makefile.in: Regenerate. ++ * configure: Likewise. ++ * src/prep_cif.c (ffi_prep_cif_core): Handle TILE-Gx/TILEPro. ++ * src/tile: New directory. ++ * src/tile/ffi.c: New file. ++ * src/tile/ffitarget.h: Ditto. ++ * src/tile/tile.S: Ditto. ++ ++2012-10-12 Matthias Klose ++ ++ * generate-osx-source-and-headers.py: Normalize whitespace. ++ ++2012-09-14 David Edelsohn ++ ++ * configure: Regenerated. ++ ++2012-08-26 Andrew Pinski ++ ++ PR libffi/53014 ++ * src/mips/ffi.c (ffi_prep_closure_loc): Allow n32 with soft-float and n64 with ++ soft-float. ++ ++2012-08-08 Uros Bizjak ++ ++ * src/s390/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, ++ just return FFI_BAD_ABI when things are wrong. ++ ++2012-07-18 H.J. Lu ++ ++ PR libffi/53982 ++ PR libffi/53973 ++ * src/x86/ffitarget.h: Check __ILP32__ instead of __LP64__ for x32. ++ (FFI_SIZEOF_JAVA_RAW): Defined to 4 for x32. ++ ++2012-05-16 H.J. Lu ++ ++ * configure: Regenerated. ++ ++2012-05-05 Nicolas Lelong ++ ++ * libffi.xcodeproj/project.pbxproj: Fixes. ++ * README: Update for iOS builds. ++ ++2012-04-23 Alexandre Keunecke I. de Mendonca ++ ++ * configure.ac: Add Blackfin/sysv support ++ * Makefile.am: Add Blackfin/sysv support ++ * src/bfin/ffi.c: Add Blackfin/sysv support ++ * src/bfin/ffitarget.h: Add Blackfin/sysv support ++ ++2012-04-11 Anthony Green ++ ++ * Makefile.am (EXTRA_DIST): Add new script. ++ * Makefile.in: Rebuilt. ++ ++2012-04-11 Zachary Waldowski ++ ++ * generate-ios-source-and-headers.py, ++ libffi.xcodeproj/project.pbxproj: Support a Mac static library via ++ Xcode. Set iOS compatibility to 4.0. Move iOS trampoline ++ generation into an Xcode "run script" phase. Include both as ++ Xcode build scripts. Don't always regenerate config files. ++ ++2012-04-10 Anthony Green ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Add missing semicolon. ++ ++2012-04-06 Anthony Green ++ ++ * Makefile.am (EXTRA_DIST): Add new iOS/xcode files. ++ * Makefile.in: Rebuilt. ++ ++2012-04-06 Mike Lewis ++ ++ * generate-ios-source-and-headers.py: New file. ++ * libffi.xcodeproj/project.pbxproj: New file. ++ * README: Update instructions on building iOS binary. ++ * build-ios.sh: Delete. ++ ++2012-04-06 Anthony Green ++ ++ * src/x86/ffi64.c (UINT128): Define differently for Intel and GNU ++ compilers, then use it. ++ ++2012-04-06 H.J. Lu ++ ++ * m4/libtool.m4 (_LT_ENABLE_LOCK): Support x32. ++ ++2012-04-06 Anthony Green ++ ++ * testsuite/Makefile.am (EXTRA_DIST): Add missing test cases. ++ * testsuite/Makefile.in: Rebuilt. ++ ++2012-04-05 Zachary Waldowski ++ ++ * include/ffi.h.in: Add missing trampoline table fields. ++ * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references ++ in CNAME. ++ * src/x86/ffi.c: Wrap Windows specific code in ifdefs. ++ ++2012-04-02 Peter Bergner ++ ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp. ++ Silence casting pointer to integer of different size warning. ++ Delete goto to previously deleted label. ++ (ffi_call): Silence possibly undefined warning. ++ (ffi_closure_helper_SYSV): Declare variable type. ++ ++2012-04-02 Peter Rosin ++ ++ * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return ++ value in the Intel version as is already done for the AT&T version. ++ (ffi_closure_SYSV): Likewise. ++ (ffi_closure_raw_SYSV): Likewise. ++ (ffi_closure_STDCALL): Likewise. ++ ++2012-03-29 Peter Rosin ++ ++ * src/x86/win32.S (ffi_closure_raw_THISCALL): Unify the frame ++ generation, fix the ENDP label and remove the surplus third arg ++ from the 'lea' insn. ++ ++2012-03-29 Peter Rosin ++ ++ * src/x86/win32.S (ffi_closure_raw_SYSV): Make the 'stubraw' label ++ visible outside the PROC, so that ffi_closure_raw_THISCALL can see ++ it. Also instruct the assembler to add a frame to the function. ++ ++2012-03-23 Peter Rosin ++ ++ * Makefile.am (AM_CPPFLAGS): Add -DFFI_BUILDING. ++ * Makefile.in: Rebuilt. ++ * include/ffi.h.in [MSVC]: Add __declspec(dllimport) decorations ++ to all data exports, when compiling libffi clients using MSVC. ++ ++2012-03-29 Peter Rosin ++ ++ * src/x86/ffitarget.h (ffi_abi): Add new ABI FFI_MS_CDECL and ++ make it the default for MSVC. ++ (FFI_TYPE_MS_STRUCT): New structure return convention. ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Tweak the structure ++ return convention for FFI_MS_CDECL to be FFI_TYPE_MS_STRUCT ++ instead of an ordinary FFI_TYPE_STRUCT. ++ (ffi_prep_args): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. ++ (ffi_call): Likewise. ++ (ffi_prep_incoming_args_SYSV): Likewise. ++ (ffi_raw_call): Likewise. ++ (ffi_prep_closure_loc): Treat FFI_MS_CDECL as FFI_SYSV. ++ * src/x86/win32.S (ffi_closure_SYSV): For FFI_TYPE_MS_STRUCT, ++ return a pointer to the result structure in eax and don't pop ++ that pointer from the stack, the caller takes care of it. ++ (ffi_call_win32): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. ++ (ffi_closure_raw_SYSV): Likewise. ++ ++2012-03-22 Peter Rosin ++ ++ * testsuite/libffi.call/closure_stdcall.c [MSVC]: Add inline ++ assembly version with Intel syntax. ++ * testsuite/libffi.call/closure_thiscall.c [MSVC]: Likewise. ++ ++2012-03-23 Peter Rosin ++ ++ * testsuite/libffi.call/ffitest.h: Provide abstration of ++ __attribute__((fastcall)) in the form of a __FASTCALL__ ++ define. Define it to __fastcall for MSVC. ++ * testsuite/libffi.call/fastthis1_win32.c: Use the above. ++ * testsuite/libffi.call/fastthis2_win32.c: Likewise. ++ * testsuite/libffi.call/fastthis3_win32.c: Likewise. ++ * testsuite/libffi.call/strlen2_win32.c: Likewise. ++ * testsuite/libffi.call/struct1_win32.c: Likewise. ++ * testsuite/libffi.call/struct2_win32.c: Likewise. ++ ++2012-03-22 Peter Rosin ++ ++ * src/x86/win32.S [MSVC] (ffi_closure_THISCALL): Remove the manual ++ frame on function entry, MASM adds one automatically. ++ ++2012-03-22 Peter Rosin ++ ++ * testsuite/libffi.call/ffitest.h [MSVC]: Add kludge for missing ++ bits in the MSVC headers. ++ ++2012-03-22 Peter Rosin ++ ++ * testsuite/libffi.call/cls_12byte.c: Adjust to the C89 style ++ with no declarations after statements. ++ * testsuite/libffi.call/cls_16byte.c: Likewise. ++ * testsuite/libffi.call/cls_18byte.c: Likewise. ++ * testsuite/libffi.call/cls_19byte.c: Likewise. ++ * testsuite/libffi.call/cls_1_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte1.c: Likewise. ++ * testsuite/libffi.call/cls_24byte.c: Likewise. ++ * testsuite/libffi.call/cls_2byte.c: Likewise. ++ * testsuite/libffi.call/cls_3_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_3byte1.c: Likewise. ++ * testsuite/libffi.call/cls_3byte2.c: Likewise. ++ * testsuite/libffi.call/cls_4_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_4byte.c: Likewise. ++ * testsuite/libffi.call/cls_5_1_byte.c: Likewise. ++ * testsuite/libffi.call/cls_5byte.c: Likewise. ++ * testsuite/libffi.call/cls_64byte.c: Likewise. ++ * testsuite/libffi.call/cls_6_1_byte.c: Likewise. ++ * testsuite/libffi.call/cls_6byte.c: Likewise. ++ * testsuite/libffi.call/cls_7_1_byte.c: Likewise. ++ * testsuite/libffi.call/cls_7byte.c: Likewise. ++ * testsuite/libffi.call/cls_8byte.c: Likewise. ++ * testsuite/libffi.call/cls_9byte1.c: Likewise. ++ * testsuite/libffi.call/cls_9byte2.c: Likewise. ++ * testsuite/libffi.call/cls_align_double.c: Likewise. ++ * testsuite/libffi.call/cls_align_float.c: Likewise. ++ * testsuite/libffi.call/cls_align_longdouble.c: Likewise. ++ * testsuite/libffi.call/cls_align_longdouble_split.c: Likewise. ++ * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. ++ * testsuite/libffi.call/cls_align_pointer.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint16.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint32.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint64.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint16.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint32.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint64.c: Likewise. ++ * testsuite/libffi.call/cls_dbls_struct.c: Likewise. ++ * testsuite/libffi.call/cls_pointer_stack.c: Likewise. ++ * testsuite/libffi.call/err_bad_typedef.c: Likewise. ++ * testsuite/libffi.call/huge_struct.c: Likewise. ++ * testsuite/libffi.call/nested_struct.c: Likewise. ++ * testsuite/libffi.call/nested_struct1.c: Likewise. ++ * testsuite/libffi.call/nested_struct10.c: Likewise. ++ * testsuite/libffi.call/nested_struct2.c: Likewise. ++ * testsuite/libffi.call/nested_struct3.c: Likewise. ++ * testsuite/libffi.call/nested_struct4.c: Likewise. ++ * testsuite/libffi.call/nested_struct5.c: Likewise. ++ * testsuite/libffi.call/nested_struct6.c: Likewise. ++ * testsuite/libffi.call/nested_struct7.c: Likewise. ++ * testsuite/libffi.call/nested_struct8.c: Likewise. ++ * testsuite/libffi.call/nested_struct9.c: Likewise. ++ * testsuite/libffi.call/stret_large.c: Likewise. ++ * testsuite/libffi.call/stret_large2.c: Likewise. ++ * testsuite/libffi.call/stret_medium.c: Likewise. ++ * testsuite/libffi.call/stret_medium2.c: Likewise. ++ * testsuite/libffi.call/struct1.c: Likewise. ++ * testsuite/libffi.call/struct1_win32.c: Likewise. ++ * testsuite/libffi.call/struct2.c: Likewise. ++ * testsuite/libffi.call/struct2_win32.c: Likewise. ++ * testsuite/libffi.call/struct3.c: Likewise. ++ * testsuite/libffi.call/struct4.c: Likewise. ++ * testsuite/libffi.call/struct5.c: Likewise. ++ * testsuite/libffi.call/struct6.c: Likewise. ++ * testsuite/libffi.call/struct7.c: Likewise. ++ * testsuite/libffi.call/struct8.c: Likewise. ++ * testsuite/libffi.call/struct9.c: Likewise. ++ * testsuite/libffi.call/testclosure.c: Likewise. ++ ++2012-03-21 Peter Rosin ++ ++ * testsuite/libffi.call/float_va.c (float_va_fn): Use %f when ++ printing doubles (%lf is for long doubles). ++ (main): Likewise. ++ ++2012-03-21 Peter Rosin ++ ++ * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] ++ (set_ld_library_path_env_vars): Add the library search dir to PATH ++ (and save PATH for later). ++ (restore_ld_library_path_env_vars): Restore PATH. ++ ++2012-03-21 Peter Rosin ++ ++ * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] ++ (set_ld_library_path_env_vars): Add the library search dir to PATH ++ (and save PATH for later). ++ (restore_ld_library_path_env_vars): Restore PATH. ++ ++2012-03-20 Peter Rosin ++ ++ * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. ++ * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label ++ visible outside the PROC, so that ffi_closure_THISCALL can see it. ++ ++2012-03-20 Peter Rosin ++ ++ * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. ++ * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label ++ visible outside the PROC, so that ffi_closure_THISCALL can see it. ++ ++2012-03-19 Alan Hourihane ++ ++ * src/m68k/ffi.c: Add MINT support. ++ * src/m68k/sysv.S: Ditto. ++ ++2012-03-06 Chung-Lin Tang ++ ++ * src/arm/ffi.c (ffi_call): Add __ARM_EABI__ guard around call to ++ ffi_call_VFP(). ++ (ffi_prep_closure_loc): Add __ARM_EABI__ guard around use of ++ ffi_closure_VFP. ++ * src/arm/sysv.S: Add __ARM_EABI__ guard around VFP code. ++ ++2012-03-19 chennam ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure ++ support. ++ ++2012-03-13 Kaz Kojima ++ ++ * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, ++ just return FFI_BAD_ABI when things are wrong. ++ * src/sh64/ffi.c (ffi_prep_closure_loc): Ditto. ++ ++2012-03-09 David Edelsohn ++ ++ * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64 ++ change to return value of ffi_closure_helper_DARWIN and load type ++ from return type. ++ ++2012-03-03 H.J. Lu ++ ++ * src/x86/ffi64.c (ffi_call): Cast the return value to unsigned ++ long. ++ (ffi_prep_closure_loc): Cast to 64bit address in trampoline. ++ (ffi_closure_unix64_inner): Cast return pointer to unsigned long ++ first. ++ ++ * src/x86/ffitarget.h (FFI_SIZEOF_ARG): Defined to 8 for x32. ++ (ffi_arg): Set to unsigned long long for x32. ++ (ffi_sarg): Set to long long for x32. ++ ++2012-03-03 H.J. Lu ++ ++ * src/prep_cif.c (ffi_prep_cif_core): Properly check bad ABI. ++ ++2012-03-03 Andoni Morales Alastruey ++ ++ * configure.ac: Add -no-undefined for both 32- and 64-bit x86 ++ windows-like hosts. ++ * configure: Rebuilt. ++ ++2012-02-27 Mikael Pettersson ++ ++ PR libffi/52223 ++ * Makefile.am (FLAGS_TO_PASS): Define. ++ * Makefile.in: Regenerate. ++ ++2012-02-23 Anthony Green ++ ++ * src/*/ffitarget.h: Ensure that users never include ffitarget.h ++ directly. ++ ++2012-02-23 Kai Tietz ++ ++ PR libffi/52221 ++ * src/x86/ffi.c (ffi_closure_raw_THISCALL): New ++ prototype. ++ (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for ++ thiscall-convention. ++ (ffi_raw_call): Use ffi_prep_args_raw. ++ * src/x86/win32.S (ffi_closure_raw_THISCALL): Add ++ implementation for stub. ++ ++2012-02-10 Kai Tietz ++ ++ * configure.ac (AM_LTLDFLAGS): Add -no-undefine for x64 ++ windows target. ++ * configure: Regenerated. ++ ++2012-02-08 Kai Tietz ++ ++ * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32 ++ also FFI_THISCALL. ++ * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype. ++ (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code. ++ (ffi_prep_closure_loc): Add FFI_THISCALL support. ++ * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size. ++ * src/x86/win32.S (ffi_closure_THISCALL): New closure code ++ for thiscall-calling convention. ++ * testsuite/libffi.call/closure_thiscall.c: New test. ++ ++2012-01-28 Kai Tietz ++ ++ * src/libffi/src/x86/ffi.c (ffi_call_win32): Add new ++ argument to prototype for specify calling-convention. ++ (ffi_call): Add support for stdcall/thiscall convention. ++ (ffi_prep_args): Likewise. ++ (ffi_raw_call): Likewise. ++ * src/x86/ffitarget.h (ffi_abi): Add FFI_THISCALL and ++ FFI_FASTCALL. ++ * src/x86/win32.S (_ffi_call_win32): Add support for ++ fastcall/thiscall calling-convention calls. ++ * testsuite/libffi.call/fastthis1_win32.c: New test. ++ * testsuite/libffi.call/fastthis2_win32.c: New test. ++ * testsuite/libffi.call/fastthis3_win32.c: New test. ++ * testsuite/libffi.call/strlen2_win32.c: New test. ++ * testsuite/libffi.call/many2_win32.c: New test. ++ * testsuite/libffi.call/struct1_win32.c: New test. ++ * testsuite/libffi.call/struct2_win32.c: New test. ++ ++2012-01-23 Uros Bizjak ++ ++ * src/alpha/ffi.c (ffi_prep_closure_loc): Check for bad ABI. ++ ++2012-01-23 Anthony Green ++ Chris Young ++ ++ * configure.ac: Add Amiga support. ++ * configure: Rebuilt. ++ ++2012-01-23 Dmitry Nadezhin ++ ++ * include/ffi_common.h (LIKELY, UNLIKELY): Fix definitions. ++ ++2012-01-23 Andreas Schwab ++ ++ * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain ++ mc68000. Test for __HAVE_68881__ in addition to __MC68881__. ++ ++2012-01-19 Jakub Jelinek ++ ++ PR rtl-optimization/48496 ++ * src/ia64/ffi.c (ffi_call): Fix up aliasing violations. ++ ++2012-01-09 Rainer Orth ++ ++ * configure.ac (i?86-*-*): Set TARGET to X86_64. ++ * configure: Regenerate. ++ ++2011-12-07 Andrew Pinski ++ ++ PR libffi/50051 ++ * src/mips/n32.S: Add ".set mips4". ++ ++2011-11-21 Andreas Tobler ++ ++ * configure: Regenerate. ++ ++2011-11-12 David Gilbert ++ ++ * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h, ++ man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3, ++ man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h, ++ src/cris/ffi.c, src/prep_cif.c, ++ testsuite/libffi.call/cls_double_va.c, ++ testsuite/libffi.call/cls_longdouble_va.c, ++ testsuite/libffi.call/float_va.c: Many changes to support variadic ++ function calls. ++ ++2011-11-12 Kyle Moffett ++ ++ * src/powerpc/ffi.c, src/powerpc/ffitarget.h, ++ src/powerpc/ppc_closure.S, src/powerpc/sysv.S: Many changes for ++ softfloat powerpc variants. ++ ++2011-11-12 Petr Salinger ++ ++ * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Fix kfreebsd support. ++ * configure: Rebuilt. ++ ++2011-11-12 Timothy Wall ++ ++ * src/arm/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Max ++ alignment of 4 for wince on ARM. ++ ++2011-11-12 Kyle Moffett ++ Anthony Green ++ ++ * src/ppc/sysv.S, src/ppc/ffi.c: Remove use of ppc string ++ instructions (not available on some cores, like the PPC440). ++ ++2011-11-12 Kimura Wataru ++ ++ * m4/ax_enable_builddir: Change from string comparison to numeric ++ comparison for wc output. ++ * configure.ac: Enable FFI_MMAP_EXEC_WRIT for darwin11 aka Mac OS ++ X 10.7. ++ * configure: Rebuilt. ++ ++2011-11-12 Anthony Green ++ ++ * Makefile.am (AM_CCASFLAGS): Add -g option to build assembly ++ files with debug info. ++ * Makefile.in: Rebuilt. ++ ++2011-11-12 Jasper Lievisse Adriaanse ++ ++ * README: Update list of supported OpenBSD systems. ++ ++2011-11-12 Anthony Green ++ ++ * libtool-version: Update. ++ * Makefile.am (nodist_libffi_la_SOURCES): Add src/debug.c if ++ FFI_DEBUG. ++ (libffi_la_SOURCES): Remove src/debug.c ++ (EXTRA_DIST): Add src/debug.c ++ * Makefile.in: Rebuilt. ++ * README: Update for 3.0.11. ++ ++2011-11-10 Richard Henderson ++ ++ * configure.ac (GCC_AS_CFI_PSEUDO_OP): Use it instead of inline check. ++ * configure, aclocal.m4: Rebuild. ++ ++2011-09-04 Iain Sandoe ++ ++ PR libffi/49594 ++ * src/powerpc/darwin_closure.S (stubs): Make the stub binding ++ helper reference track the architecture pointer size. ++ ++2011-08-25 Andrew Haley ++ ++ * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Remove hard-coded assembly ++ instructions. ++ * src/arm/sysv.S (ffi_arm_trampoline): Put them here instead. ++ ++2011-07-11 Andrew Haley ++ ++ * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache. ++ ++2011-06-29 Rainer Orth ++ ++ * testsuite/libffi.call/cls_double_va.c: Move PR number to comment. ++ * testsuite/libffi.call/cls_longdouble_va.c: Likewise. ++ ++2011-06-29 Rainer Orth ++ ++ PR libffi/46660 ++ * testsuite/libffi.call/cls_double_va.c: xfail dg-output on ++ mips-sgi-irix6*. ++ * testsuite/libffi.call/cls_longdouble_va.c: Likewise. ++ ++2011-06-14 Rainer Orth ++ ++ * testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8, ++ PRId8 instead of %hhu, %hhd. ++ * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8, ++ PRIu8): Define. ++ [__sgi__] (PRId8, PRIu8): Define. ++ ++2011-04-29 Rainer Orth ++ ++ * src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE): ++ Define. ++ Use them to handle ELF vs. ECOFF differences. ++ [__osf__] (_GLOBAL__F_ffi_call_osf): Define. ++ ++2011-03-30 Timothy Wall ++ ++ * src/powerpc/darwin.S: Fix unknown FDE encoding. ++ * src/powerpc/darwin_closure.S: ditto. ++ ++2011-02-25 Anthony Green ++ ++ * src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more ++ 32-bit ABIs. ++ ++2011-02-15 Anthony Green ++ ++ * m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math. ++ * configure: Rebuilt. ++ ++2011-02-13 Ralf Wildenhues ++ ++ * configure: Regenerate. ++ ++2011-02-13 Anthony Green ++ ++ * include/ffi_common.h (UNLIKELY, LIKELY): Define. ++ * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition. ++ * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition. ++ ++ * src/prep_cif.c (initialize_aggregate): Convert assertion into ++ FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0. ++ ++ * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, ++ just return FFI_BAD_ABI when things are wrong. ++ * src/arm/ffi.c (ffi_prep_closure_loc): Ditto. ++ * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto. ++ * src/mips/ffi.c (ffi_prep_closure_loc): Ditto. ++ * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto. ++ * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto. ++ ++2011-02-11 Anthony Green ++ ++ * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, ++ just return FFI_BAD_ABI when things are wrong. ++ ++2012-02-11 Eric Botcazou ++ ++ * src/sparc/v9.S (STACKFRAME): Bump to 176. ++ ++2011-02-09 Stuart Shelton ++ ++ http://bugs.gentoo.org/show_bug.cgi?id=286911 ++ * src/mips/ffitarget.h: Clean up error messages. ++ * src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to ++ ffi_raw*. ++ * include/ffi.h.in: Add pragma for SGI compiler. ++ ++2011-02-09 Anthony Green ++ ++ * configure.ac: Add powerpc64-*-darwin* support. ++ ++2011-02-09 Anthony Green ++ ++ * README: Mention Interix. ++ ++2011-02-09 Jonathan Callen ++ ++ * configure.ac: Add Interix to win32/cygwin/mingw case. ++ * configure: Ditto. ++ * src/closures.c: Treat Interix like Cygwin, instead of as a ++ generic win32. ++ ++2011-02-09 Anthony Green ++ ++ * testsuite/libffi.call/err_bad_typedef.c: Remove xfail. ++ * testsuite/libffi.call/err_bad_abi.c: Remove xfail. ++ * src/x86/ffi64.c (UNLIKELY, LIKELY): Define. ++ (ffi_prep_closure_loc): Check for bad ABI. ++ * src/prep_cif.c (UNLIKELY, LIKELY): Define. ++ (initialize_aggregate): Check for bad types. ++ ++2011-02-09 Landon Fuller ++ ++ * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh, ++ src/arm/trampoline.S. ++ (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S. ++ * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define. ++ * src/arm/ffi.c (ffi_trampoline_table) ++ (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry) ++ (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) ++ (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables) ++ (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free): ++ Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS). ++ (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case ++ separately. ++ * src/arm/sysv.S: Handle Apple iOS host. ++ * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case. ++ * build-ios.sh: New file. ++ * fficonfig.h.in, configure, Makefile.in: Rebuilt. ++ * README: Mention ARM iOS. ++ ++2011-02-08 Oren Held ++ ++ * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid ++ redefinition of mallinfo on HP-UX. ++ ++2011-02-08 Ginn Chen ++ ++ * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio ++ aggregate return ABI. Flush cache. ++ (ffi_prep_closure_loc): Flush cache. ++ ++2011-02-11 Anthony Green ++ ++ From Tom Honermann : ++ * src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on ++ AIX. Declare .ffi_prep_args. Insert nops after branch ++ instructions so that the AIX linker can insert TOC reload ++ instructions. ++ * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN. ++ ++2011-02-08 Ed ++ ++ * src/powerpc/asm.h: Fix grammar nit in comment. ++ ++2011-02-08 Uli Link ++ ++ * include/ffi.h.in (FFI_64_BIT_MAX): Define and use. ++ ++2011-02-09 Rainer Orth ++ ++ PR libffi/46661 ++ * testsuite/libffi.call/cls_pointer.c (main): Cast void * to ++ uintptr_t first. ++ * testsuite/libffi.call/cls_pointer_stack.c (main): Likewise. ++ ++2011-02-08 Rafael Avila de Espindola ++ ++ * configure.ac: Fix x86 test for pc related relocs. ++ * configure: Rebuilt. ++ ++2011-02-07 Joel Sherrill ++ ++ * libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing. ++ Handle case when CPU variant does not have long double support. ++ * libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire, ++ and cores with soft floating point. ++ ++2011-02-07 Joel Sherrill ++ ++ * configure.ac: Add mips*-*-rtems* support. ++ * configure: Regenerate. ++ * src/mips/ffitarget.h: Ensure needed constants are available ++ for targets which do not have sgidefs.h. ++ ++2011-01-26 Dave Korn ++ ++ PR target/40125 ++ * configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs. ++ * configure: Regenerate. ++ ++2010-12-18 Iain Sandoe ++ ++ PR libffi/29152 ++ PR libffi/42378 ++ * src/powerpc/darwin_closure.S: Provide Darwin64 implementation, ++ update comments. ++ * src/powerpc/ffitarget.h (POWERPC_DARWIN64): New, ++ (FFI_TRAMPOLINE_SIZE): Update for Darwin64. ++ * src/powerpc/darwin.S: Provide Darwin64 implementation, ++ update comments. ++ * src/powerpc/ffi_darwin.c: Likewise. ++ ++2010-12-06 Rainer Orth ++ ++ * configure.ac (libffi_cv_as_ascii_pseudo_op): Use double ++ backslashes. ++ (libffi_cv_as_string_pseudo_op): Likewise. ++ * configure: Regenerate. ++ ++2010-12-03 Chung-Lin Tang ++ ++ * src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive. ++ (ffi_closure_VFP): Same. ++ (ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp' ++ directive. ++ ++2010-12-01 Rainer Orth ++ ++ * testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define. ++ (PRIuPTR): Define. ++ ++2010-11-29 Richard Henderson ++ Rainer Orth ++ ++ * src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define. ++ (.eh_frame): Use FDE_ENCODING. ++ (.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE. ++ ++2010-11-22 Jacek Caban ++ ++ * configure.ac: Check for symbol underscores on mingw-w64. ++ * configure: Rebuilt. ++ * src/x86/win64.S: Correctly access extern symbols in respect to ++ underscores. ++ ++2010-11-15 Rainer Orth ++ ++ * testsuite/lib/libffi-dg.exp: Rename ... ++ * testsuite/lib/libffi.exp: ... to this. ++ * libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp. ++ * libffi/testsuite/libffi.special/special.exp: Likewise. ++ ++2010-10-28 Chung-Lin Tang ++ ++ * src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling ++ code, new parameter, and return value. Update comments. ++ (ffi_prep_cif_machdep): Add case for VFP struct return values. Add ++ call to layout_vfp_args(). ++ (ffi_call_SYSV): Update declaration. ++ (ffi_call_VFP): New declaration. ++ (ffi_call): Add VFP struct return conditions. Call ffi_call_VFP() ++ when ABI is FFI_VFP. ++ (ffi_closure_VFP): New declaration. ++ (ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to ++ ffi_prep_incoming_args_SYSV(). ++ (ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument ++ case handling. ++ (ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline ++ construction under VFP hard-float. ++ (rec_vfp_type_p): New function. ++ (vfp_type_p): Same. ++ (place_vfp_arg): Same. ++ (layout_vfp_args): Same. ++ * src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI ++ based on __ARM_PCS_VFP. ++ (FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific ++ fields. ++ (FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code. ++ (FFI_TYPE_STRUCT_VFP_DOUBLE): Same. ++ * src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to ++ direct call. Move function pointer load upwards. ++ (ffi_call_VFP): New function. ++ (ffi_closure_VFP): Same. ++ ++ * testsuite/lib/libffi-dg.exp (check-flags): New function. ++ (dg-skip-if): New function. ++ * testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-* ++ and compiler options include -mfloat-abi=hard. ++ * testsuite/libffi.call/cls_longdouble_va.c: Same. ++ ++2010-10-01 Jakub Jelinek ++ ++ PR libffi/45677 ++ * src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is ++ a multiple of 8. ++ * testsuite/libffi.call/many2.c: New test. ++ ++2010-08-20 Mark Wielaard ++ ++ * src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r ++ returns NULL. ++ ++2010-08-09 Andreas Tobler ++ ++ * configure.ac: Add target powerpc64-*-freebsd*. ++ * configure: Regenerate. ++ * testsuite/libffi.call/cls_align_longdouble_split.c: Pass ++ -mlong-double-128 only to linux targets. ++ * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. ++ * testsuite/libffi.call/cls_longdouble.c: Likewise. ++ * testsuite/libffi.call/huge_struct.c: Likewise. ++ ++2010-08-05 Dan Witte ++ ++ * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the ++ debug CRT when --enable-debug is given. ++ * configure.ac: Define it. ++ * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately. ++ ++2010-08-04 Dan Witte ++ ++ * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64 ++ platforms. ++ * src/x86/ffi.c: Remove redundant ifdef checks. ++ * src/prep_cif.c: Push stack space computation into src/x86/ffi.c ++ for X86_ANY so return value space doesn't get added twice. ++ ++2010-08-03 Neil Rashbrooke ++ ++ * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy. ++ ++2010-07-22 Dan Witte ++ ++ * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI. ++ * src/prep_cif.c: Fix ABI assertion. ++ * src/cris/ffi.c: Ditto. ++ ++2010-07-10 Evan Phoenix ++ ++ * src/closures.c (selinux_enabled_check): Fix strncmp usage bug. ++ ++2010-07-07 Dan Horák ++ ++ * include/ffi.h.in: Protect #define with #ifndef. ++ * src/powerpc/ffitarget.h: Ditto. ++ * src/s390/ffitarget.h: Ditto. ++ * src/sparc/ffitarget.h: Ditto. ++ ++2010-07-07 Neil Roberts ++ ++ * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to ++ 16-bytes. ++ ++2010-07-02 Jakub Jelinek ++ ++ * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes. ++ * Makefile.in: Regenerated. ++ ++2010-05-19 Rainer Orth ++ ++ * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as ++ output, too. ++ (libffi_cv_as_ascii_pseudo_op): Check for .ascii. ++ (libffi_cv_as_string_pseudo_op): Check for .string. ++ * configure: Regenerate. ++ * fficonfig.h.in: Regenerate. ++ * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error. ++ ++2010-05-11 Dan Witte ++ ++ * doc/libffi.tex: Document previous change. ++ ++2010-05-11 Makoto Kato ++ ++ * src/x86/ffi.c (ffi_call): Don't copy structs passed by value. ++ ++2010-05-05 Michael Kohler ++ ++ * src/dlmalloc.c (dlfree): Fix spelling. ++ * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto. ++ * configure.ac: Ditto. ++ * configure: Rebuilt. ++ ++2010-04-13 Dan Witte ++ ++ * msvcc.sh: Build with -W3 instead of -Wall. ++ * src/powerpc/ffi_darwin.c: Remove build warnings. ++ * src/x86/ffi.c: Ditto. ++ * src/x86/ffitarget.h: Ditto. ++ ++2010-04-12 Dan Witte ++ Walter Meinl ++ ++ * configure.ac: Add OS/2 support. ++ * configure: Rebuilt. ++ * src/closures.c: Ditto. ++ * src/dlmalloc.c: Ditto. ++ * src/x86/win32.S: Ditto. ++ ++2010-04-07 Jakub Jelinek ++ ++ * testsuite/libffi.call/err_bad_abi.c: Remove unused args variable. ++ ++2010-04-02 Ralf Wildenhues ++ ++ * Makefile.in: Regenerate. ++ * aclocal.m4: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * man/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ ++2010-03-30 Dan Witte ++ ++ * msvcc.sh: Disable build warnings. ++ * README (tested): Clarify windows build procedure. ++ ++2010-03-15 Rainer Orth ++ ++ * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test. ++ * configure: Regenerate. ++ * fficonfig.h.in: Regenerate. ++ * libffi/src/x86/unix64.S (.eh_frame) ++ [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type. ++ ++2010-03-14 Matthias Klose ++ ++ * src/x86/ffi64.c: Fix typo in comment. ++ * src/x86/ffi.c: Use /* ... */ comment style. ++ ++2010-02-24 Rainer Orth ++ ++ * doc/libffi.texi (The Closure API): Fix typo. ++ * doc/libffi.info: Remove. ++ ++2010-02-15 Matthias Klose ++ ++ * src/arm/sysv.S (__ARM_ARCH__): Define for processor ++ __ARM_ARCH_7EM__. ++ ++2010-01-15 Anthony Green ++ ++ * README: Add notes on building with Microsoft Visual C++. ++ ++2010-01-15 Daniel Witte ++ ++ * msvcc.sh: New file. ++ ++ * src/x86/win32.S: Port assembly routines to MSVC and #ifdef. ++ * src/x86/ffi.c: Tweak function declaration and remove excess ++ parens. ++ * include/ffi.h.in: Add __declspec(align(8)) to typedef struct ++ ffi_closure. ++ ++ * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new ++ function ffi_call_win32 on X86_WIN32. ++ * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32. ++ (ffi_call_STDCALL): Remove. ++ ++ * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code ++ to ffi_prep_cif_machdep for x86. ++ * src/x86/ffi.c (ffi_prep_cif_machdep): To here. ++ ++2010-01-15 Oliver Kiddle ++ ++ * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for ++ Sun Studio compiler compatibility. ++ ++2010-01-12 Conrad Irwin ++ ++ * doc/libffi.texi: Add closure example. ++ ++2010-01-07 Rainer Orth ++ ++ PR libffi/40701 ++ * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL, ++ PRIuLL, PRId64, PRIu64, PRIuPTR): Define. ++ * testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on ++ alpha*-dec-osf*. ++ * testsuite/libffi.call/cls_align_uint64.c: Likewise. ++ * testsuite/libffi.call/cls_ulonglong.c: Likewise. ++ * testsuite/libffi.call/return_ll1.c: Likewise. ++ * testsuite/libffi.call/stret_medium2.c: Likewise. ++ * testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast ++ MAP_FAILED to char *. ++ ++2010-01-06 Rainer Orth ++ ++ * src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__. ++ ++2009-12-31 Anthony Green ++ ++ * README: Update for libffi 3.0.9. ++ ++2009-12-27 Matthias Klose ++ ++ * configure.ac (HAVE_LONG_DOUBLE): Define for mips when ++ appropriate. ++ * configure: Rebuilt. ++ ++2009-12-26 Anthony Green ++ ++ * testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for ++ avr32*-*-*. ++ * testsuite/libffi.call/cls_double_va.c: Ditto. ++ ++2009-12-26 Andreas Tobler ++ ++ * testsuite/libffi.call/ffitest.h: Conditionally include stdint.h ++ and inttypes.h. ++ * testsuite/libffi.special/unwindtest.cc: Ditto. ++ ++2009-12-26 Andreas Tobler ++ ++ * configure.ac: Add amd64-*-openbsd*. ++ * configure: Rebuilt. ++ * testsuite/lib/libffi-dg.exp (libffi_target_compile): Link ++ openbsd programs with -lpthread. ++ ++2009-12-26 Anthony Green ++ ++ * testsuite/libffi.call/cls_double_va.c, ++ testsuite/libffi.call/cls_longdouble.c, ++ testsuite/libffi.call/cls_longdouble_va.c, ++ testsuite/libffi.call/cls_pointer.c, ++ testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for ++ mips*-*-* and arm*-*-*. ++ * testsuite/libffi.call/cls_align_longdouble_split.c, ++ testsuite/libffi.call/cls_align_longdouble_split2.c, ++ testsuite/libffi.call/stret_medium2.c, ++ testsuite/libffi.call/stret_medium.c, ++ testsuite/libffi.call/stret_large.c, ++ testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*. ++ ++2009-12-31 Kay Tietz ++ ++ * testsuite/libffi.call/ffitest.h, ++ testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix ++ definitions. ++ ++2009-12-31 Carlo Bramini ++ ++ * configure.ac (AM_LTLDFLAGS): Define for windows hosts. ++ * Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS. ++ * configure: Rebuilt. ++ * Makefile.in: Rebuilt. ++ ++2009-12-31 Anthony Green ++ Blake Chaffin. ++ ++ * testsuite/libffi.call/huge_struct.c: New test case from Blake ++ Chaffin @ Apple. ++ ++2009-12-28 David Edelsohn ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to ++ local variables. ++ (aix_adjust_aggregate_sizes): New function. ++ (ffi_prep_cif_machdep): Call it. ++ ++2009-12-26 Andreas Tobler ++ ++ * configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets. ++ * configure: Regenerate. ++ * fficonfig.h.in: Likewise. ++ * src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for ++ Solaris/x86. ++ ++2009-12-26 Andreas Schwab ++ ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count ++ when a float arguments is passed in memory. ++ (ffi_closure_helper_SYSV): Mark general registers as used up when ++ a 64bit or soft-float long double argument is passed in memory. ++ ++2009-12-25 Matthias Klose ++ ++ * man/ffi_call.3: Fix #include in examples. ++ * doc/libffi.texi: Add dircategory. ++ ++2009-12-25 Frank Everdij ++ ++ * include/ffi.h.in: Placed '__GNUC__' ifdef around ++ '__attribute__((aligned(8)))' in ffi_closure, fixes compile for ++ IRIX MIPSPro c99. ++ * include/ffi_common.h: Added '__sgi' define to non ++ '__attribute__((__mode__()))' integer typedefs. ++ * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, ++ ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. ++ (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added ++ FFI_LONGDOUBLE support and alignment(N32 only). ++ * src/mips/ffitarget.h: Corrected '#include ' for IRIX and ++ fixed non '__attribute__((__mode__()))' integer typedefs. ++ * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' ++ since they are Linux/GNU Assembler specific. ++ ++2009-12-25 Bradley Smith ++ ++ * configure.ac, Makefile.am, src/avr32/ffi.c, ++ src/avr32/ffitarget.h, ++ src/avr32/sysv.S: Add AVR32 port. ++ * configure, Makefile.in: Rebuilt. ++ ++2009-12-21 Andreas Tobler ++ ++ * configure.ac: Make i?86 build on FreeBSD and OpenBSD. ++ * configure: Regenerate. ++ ++2009-12-15 John David Anglin ++ ++ * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. ++ ++2009-12-13 John David Anglin ++ ++ * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE ++ type on HP-UX. ++ ++2012-02-13 Kai Tietz ++ ++ PR libffi/52221 ++ * src/x86/ffi.c (ffi_prep_raw_closure_loc): Add thiscall ++ support for X86_WIN32. ++ (FFI_INIT_TRAMPOLINE_THISCALL): Fix displacement. ++ ++2009-12-11 Eric Botcazou ++ ++ * src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long ++ double' arguments. ++ ++2009-12-11 Eric Botcazou ++ ++ * testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10. ++ ++2009-12-10 Rainer Orth ++ ++ PR libffi/40700 ++ * src/closures.c [X86_64 && __sun__ && __svr4__] ++ (FFI_MMAP_EXEC_WRIT): Define. ++ ++2009-12-08 David Daney ++ ++ * testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-* ++ * testsuite/libffi.call/cls_align_longdouble_split2.c: Same. ++ * testsuite/libffi.call/stret_large.c: Same. ++ * testsuite/libffi.call/cls_align_longdouble_split.c: Same. ++ * testsuite/libffi.call/stret_large2.c: Same. ++ * testsuite/libffi.call/stret_medium2.c: Same. ++ ++2009-12-07 David Edelsohn ++ ++ * src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump ++ typo. ++ ++2009-12-05 David Edelsohn ++ ++ * src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64 ++ code. ++ * src/powerpc/aix_closure.S: Same. ++ ++2009-12-05 Ralf Wildenhues ++ ++ * Makefile.in: Regenerate. ++ * configure: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * man/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ ++2009-12-04 David Edelsohn ++ ++ * src/powerpc/aix_closure.S: Reorganize 64-bit code to match ++ linux64_closure.S. ++ ++2009-12-04 Uros Bizjak ++ ++ PR libffi/41908 ++ * src/x86/ffi64.c (classify_argument): Update from ++ gcc/config/i386/i386.c. ++ (ffi_closure_unix64_inner): Do not use the address of two consecutive ++ SSE registers directly. ++ * testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail ++ for x86_64 linux targets. ++ ++2009-12-04 David Edelsohn ++ ++ * src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment ++ pfr for long double split between fpr13 and stack. ++ ++2009-12-03 David Edelsohn ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and ++ fparg_count twice for long double. ++ ++2009-12-03 David Edelsohn ++ ++ PR libffi/42243 ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses. ++ ++2009-12-03 Uros Bizjak ++ ++ * testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string. ++ Remove xfails for x86 linux targets. ++ ++2009-12-02 David Edelsohn ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64 ++ case. ++ ++2009-12-01 David Edelsohn ++ ++ * src/powerpc/aix.S (ffi_call_AIX): Convert to more standard ++ register usage. Call ffi_prep_args directly. Add long double ++ return value support. ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment ++ applies to FFI_TYPE_DOUBLE. Correct fpr_base increment typo. ++ Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases. ++ (ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit ++ mode. ++ (ffi_closure_helper_DARWIN): Remove nf and ng counters. Move temp ++ into case. ++ * src/powerpc/aix_closure.S: Maintain 16 byte stack alignment. ++ Allocate result area between params and FPRs. ++ ++2009-11-30 David Edelsohn ++ ++ PR target/35484 ++ * src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and ++ AIX64. ++ * src/powerpc/aix.S: Implement AIX64 version. ++ * src/powerpc/aix_closure.S: Implement AIX64 version. ++ (ffi_closure_ASM): Use extsb, lha and displament addresses. ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64 ++ support. ++ (ffi_prep_cif_machdep): Same. ++ (ffi_call): Same. ++ (ffi_closure_helper_DARWIN): Same. ++ ++2009-11-02 Andreas Tobler ++ ++ PR libffi/41908 ++ * testsuite/libffi.call/testclosure.c: New test. ++ ++2009-09-28 Kai Tietz ++ ++ * src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu ++ assembly version use of ___chkstk. ++ ++2009-09-23 Matthias Klose ++ ++ PR libffi/40242, PR libffi/41443 ++ * src/arm/sysv.S (__ARM_ARCH__): Define for processors ++ __ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__, ++ __ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__. ++ Change the conditionals to __SOFTFP__ || __ARM_EABI__ ++ for -mfloat-abi=softfp to work. ++ ++2009-09-17 Loren J. Rittle ++ ++ PR testsuite/32843 (strikes again) ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to ++ enable proper extension on char and short. ++ ++2009-09-15 David Daney ++ ++ * src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special ++ handling for FFI_TYPE_POINTER. ++ * src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT, ++ FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT, ++ FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT, ++ FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines. ++ (FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations. ++ (enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float. ++ * src/mips/n32.S (ffi_call_N32): Add handling for soft-float ++ structure and pointer returns. ++ (ffi_closure_N32): Add handling for pointer returns. ++ * src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags, ++ calc_n32_return_struct_flags): Handle soft-float. ++ (ffi_prep_cif_machdep): Handle soft-float, fix pointer handling. ++ (ffi_call_N32): Declare proper argument types. ++ (ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle ++ soft-float. ++ ++2009-08-24 Ralf Wildenhues ++ ++ * configure.ac (AC_PREREQ): Bump to 2.64. ++ ++2009-08-22 Ralf Wildenhues ++ ++ * Makefile.am (install-html, install-pdf): Remove. ++ * Makefile.in: Regenerate. ++ ++ * Makefile.in: Regenerate. ++ * aclocal.m4: Regenerate. ++ * configure: Regenerate. ++ * fficonfig.h.in: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * man/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ ++2011-08-22 Jasper Lievisse Adriaanse ++ ++ * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support. ++ * configure: Rebuilt. ++ ++2009-07-30 Ralf Wildenhues ++ ++ * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. ++ ++2009-07-24 Dave Korn ++ ++ PR libffi/40807 ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending ++ return types for X86_WIN32. ++ * src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types. ++ (_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV, ++ _ffi_closure_STDCALL): Likewise. ++ ++ * src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin. ++ (dlmmap, dlmunmap): Also use these functions on Cygwin. ++ ++2009-07-11 Richard Sandiford ++ ++ PR testsuite/40699 ++ PR testsuite/40707 ++ PR testsuite/40709 ++ * testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and ++ 2009-06-30 commits. ++ ++2009-07-01 Richard Sandiford ++ ++ * testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path ++ to "" before adding paths. (This reinstates an assignment that ++ was removed by my 2009-06-30 commit, but changes the initial ++ value from "." to "".) ++ ++2009-07-01 H.J. Lu ++ ++ PR testsuite/40601 ++ * testsuite/lib/libffi-dg.exp (libffi-init): Properly set ++ gccdir. Adjust ld_library_path for gcc only if gccdir isn't ++ empty. ++ ++2009-06-30 Richard Sandiford ++ ++ * testsuite/lib/libffi-dg.exp (libffi-init): Don't add "." ++ to ld_library_path. Use add_path. Add just find_libgcc_s ++ to ld_library_path, not every libgcc multilib directory. ++ ++2009-06-16 Wim Lewis ++ ++ * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are ++ supposed to be callee-saved. ++ * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of ++ return buffer for odd-size structs. ++ ++2009-06-16 Andreas Tobler ++ ++ PR libffi/40444 ++ * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add ++ allow_stack_execute for Darwin. ++ ++2009-06-16 Andrew Haley ++ ++ * configure.ac (TARGETDIR): Add missing blank lines. ++ * configure: Regenerate. ++ ++2009-06-16 Andrew Haley ++ ++ * testsuite/libffi.call/cls_align_sint64.c, ++ testsuite/libffi.call/cls_align_uint64.c, ++ testsuite/libffi.call/cls_longdouble_va.c, ++ testsuite/libffi.call/cls_ulonglong.c, ++ testsuite/libffi.call/return_ll1.c, ++ testsuite/libffi.call/stret_medium2.c: Fix printf format ++ specifiers. ++ * testsuite/libffi.call/ffitest.h, ++ testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. ++ ++2009-06-15 Andrew Haley ++ ++ * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. ++ * testsuite/libffi.call/err_bad_abi.c: Likewise. ++ ++2009-06-12 Andrew Haley ++ ++ * Makefile.am: Remove info_TEXINFOS. ++ ++2009-06-12 Andrew Haley ++ ++ * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, ++ testsuite/libffi.call/cls_align_uint64.c, ++ testsuite/libffi.call/cls_ulonglong.c, ++ testsuite/libffi.call/return_ll1.c, ++ testsuite/libffi.call/stret_medium2.c: Fix printf format ++ specifiers. ++ testsuite/libffi.special/unwindtest.cc: include stdint.h. ++ ++2009-06-11 Timothy Wall ++ ++ * Makefile.am, ++ configure.ac, ++ include/ffi.h.in, ++ include/ffi_common.h, ++ src/closures.c, ++ src/dlmalloc.c, ++ src/x86/ffi.c, ++ src/x86/ffitarget.h, ++ src/x86/win64.S (new), ++ README: Added win64 support (mingw or MSVC) ++ * Makefile.in, ++ include/Makefile.in, ++ man/Makefile.in, ++ testsuite/Makefile.in, ++ configure, ++ aclocal.m4: Regenerated ++ * ltcf-c.sh: properly escape cygwin/w32 path ++ * man/ffi_call.3: Clarify size requirements for return value. ++ * src/x86/ffi64.c: Fix filename in comment. ++ * src/x86/win32.S: Remove unused extern. ++ ++ * testsuite/libffi.call/closure_fn0.c, ++ testsuite/libffi.call/closure_fn1.c, ++ testsuite/libffi.call/closure_fn2.c, ++ testsuite/libffi.call/closure_fn3.c, ++ testsuite/libffi.call/closure_fn4.c, ++ testsuite/libffi.call/closure_fn5.c, ++ testsuite/libffi.call/closure_fn6.c, ++ testsuite/libffi.call/closure_stdcall.c, ++ testsuite/libffi.call/cls_12byte.c, ++ testsuite/libffi.call/cls_16byte.c, ++ testsuite/libffi.call/cls_18byte.c, ++ testsuite/libffi.call/cls_19byte.c, ++ testsuite/libffi.call/cls_1_1byte.c, ++ testsuite/libffi.call/cls_20byte.c, ++ testsuite/libffi.call/cls_20byte1.c, ++ testsuite/libffi.call/cls_24byte.c, ++ testsuite/libffi.call/cls_2byte.c, ++ testsuite/libffi.call/cls_3_1byte.c, ++ testsuite/libffi.call/cls_3byte1.c, ++ testsuite/libffi.call/cls_3byte2.c, ++ testsuite/libffi.call/cls_4_1byte.c, ++ testsuite/libffi.call/cls_4byte.c, ++ testsuite/libffi.call/cls_5_1_byte.c, ++ testsuite/libffi.call/cls_5byte.c, ++ testsuite/libffi.call/cls_64byte.c, ++ testsuite/libffi.call/cls_6_1_byte.c, ++ testsuite/libffi.call/cls_6byte.c, ++ testsuite/libffi.call/cls_7_1_byte.c, ++ testsuite/libffi.call/cls_7byte.c, ++ testsuite/libffi.call/cls_8byte.c, ++ testsuite/libffi.call/cls_9byte1.c, ++ testsuite/libffi.call/cls_9byte2.c, ++ testsuite/libffi.call/cls_align_double.c, ++ testsuite/libffi.call/cls_align_float.c, ++ testsuite/libffi.call/cls_align_longdouble.c, ++ testsuite/libffi.call/cls_align_longdouble_split.c, ++ testsuite/libffi.call/cls_align_longdouble_split2.c, ++ testsuite/libffi.call/cls_align_pointer.c, ++ testsuite/libffi.call/cls_align_sint16.c, ++ testsuite/libffi.call/cls_align_sint32.c, ++ testsuite/libffi.call/cls_align_sint64.c, ++ testsuite/libffi.call/cls_align_uint16.c, ++ testsuite/libffi.call/cls_align_uint32.c, ++ testsuite/libffi.call/cls_align_uint64.c, ++ testsuite/libffi.call/cls_dbls_struct.c, ++ testsuite/libffi.call/cls_double.c, ++ testsuite/libffi.call/cls_double_va.c, ++ testsuite/libffi.call/cls_float.c, ++ testsuite/libffi.call/cls_longdouble.c, ++ testsuite/libffi.call/cls_longdouble_va.c, ++ testsuite/libffi.call/cls_multi_schar.c, ++ testsuite/libffi.call/cls_multi_sshort.c, ++ testsuite/libffi.call/cls_multi_sshortchar.c, ++ testsuite/libffi.call/cls_multi_uchar.c, ++ testsuite/libffi.call/cls_multi_ushort.c, ++ testsuite/libffi.call/cls_multi_ushortchar.c, ++ testsuite/libffi.call/cls_pointer.c, ++ testsuite/libffi.call/cls_pointer_stack.c, ++ testsuite/libffi.call/cls_schar.c, ++ testsuite/libffi.call/cls_sint.c, ++ testsuite/libffi.call/cls_sshort.c, ++ testsuite/libffi.call/cls_uchar.c, ++ testsuite/libffi.call/cls_uint.c, ++ testsuite/libffi.call/cls_ulonglong.c, ++ testsuite/libffi.call/cls_ushort.c, ++ testsuite/libffi.call/err_bad_abi.c, ++ testsuite/libffi.call/err_bad_typedef.c, ++ testsuite/libffi.call/float2.c, ++ testsuite/libffi.call/huge_struct.c, ++ testsuite/libffi.call/nested_struct.c, ++ testsuite/libffi.call/nested_struct1.c, ++ testsuite/libffi.call/nested_struct10.c, ++ testsuite/libffi.call/nested_struct2.c, ++ testsuite/libffi.call/nested_struct3.c, ++ testsuite/libffi.call/nested_struct4.c, ++ testsuite/libffi.call/nested_struct5.c, ++ testsuite/libffi.call/nested_struct6.c, ++ testsuite/libffi.call/nested_struct7.c, ++ testsuite/libffi.call/nested_struct8.c, ++ testsuite/libffi.call/nested_struct9.c, ++ testsuite/libffi.call/problem1.c, ++ testsuite/libffi.call/return_ldl.c, ++ testsuite/libffi.call/return_ll1.c, ++ testsuite/libffi.call/stret_large.c, ++ testsuite/libffi.call/stret_large2.c, ++ testsuite/libffi.call/stret_medium.c, ++ testsuite/libffi.call/stret_medium2.c, ++ testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead ++ of checking for MMAP. Use intptr_t instead of long casts. ++ ++2009-06-11 Kaz Kojima ++ ++ * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. ++ * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. ++ * testsuite/libffi.call/err_bad_typedef.c: Likewise. ++ ++2009-06-09 Andrew Haley ++ ++ * src/x86/freebsd.S: Add missing file. ++ ++2009-06-08 Andrew Haley ++ ++ Import from libffi 3.0.8: ++ ++ * doc/libffi.texi: New file. ++ * doc/libffi.info: Likewise. ++ * doc/stamp-vti: Likewise. ++ * man/Makefile.am: New file. ++ * man/ffi_call.3: New file. ++ ++ * Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S, ++ src/dlmalloc.c. ++ (nodist_libffi_la_SOURCES): Add X86_FREEBSD. ++ ++ * configure.ac: Bump version to 3.0.8. ++ parisc*-*-linux*: Add. ++ i386-*-freebsd* | i386-*-openbsd*: Add. ++ powerpc-*-beos*: Add. ++ AM_CONDITIONAL X86_FREEBSD: Add. ++ AC_CONFIG_FILES: Add man/Makefile. ++ ++ * include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void). ++ ++2009-06-08 Andrew Haley ++ ++ * README: Import from libffi 3.0.8. ++ ++2009-06-08 Andrew Haley ++ ++ * testsuite/libffi.call/err_bad_abi.c: Add xfails. ++ * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. ++ * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. ++ * testsuite/libffi.call/err_bad_typedef.c: Add xfails. ++ ++ * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. ++ * testsuite/libffi.call/stret_medium.c: Likewise. ++ * testsuite/libffi.call/stret_large2.c: Likewise. ++ * testsuite/libffi.call/stret_large.c: Likewise. ++ ++2008-12-26 Timothy Wall ++ ++ * testsuite/libffi.call/cls_longdouble.c, ++ testsuite/libffi.call/cls_longdouble_va.c, ++ testsuite/libffi.call/cls_align_longdouble.c, ++ testsuite/libffi.call/cls_align_longdouble_split.c, ++ testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected ++ failures on x86_64 cygwin/mingw. ++ ++2008-12-22 Timothy Wall ++ ++ * testsuite/libffi.call/closure_fn0.c, ++ testsuite/libffi.call/closure_fn1.c, ++ testsuite/libffi.call/closure_fn2.c, ++ testsuite/libffi.call/closure_fn3.c, ++ testsuite/libffi.call/closure_fn4.c, ++ testsuite/libffi.call/closure_fn5.c, ++ testsuite/libffi.call/closure_fn6.c, ++ testsuite/libffi.call/closure_loc_fn0.c, ++ testsuite/libffi.call/closure_stdcall.c, ++ testsuite/libffi.call/cls_align_pointer.c, ++ testsuite/libffi.call/cls_pointer.c, ++ testsuite/libffi.call/cls_pointer_stack.c: use portable cast from ++ pointer to integer (intptr_t). ++ * testsuite/libffi.call/cls_longdouble.c: disable for win64. ++ ++2008-07-24 Anthony Green ++ ++ * testsuite/libffi.call/cls_dbls_struct.c, ++ testsuite/libffi.call/cls_double_va.c, ++ testsuite/libffi.call/cls_longdouble.c, ++ testsuite/libffi.call/cls_longdouble_va.c, ++ testsuite/libffi.call/cls_pointer.c, ++ testsuite/libffi.call/cls_pointer_stack.c, ++ testsuite/libffi.call/err_bad_abi.c: Clean up failures from ++ compiler warnings. ++ ++2008-03-04 Anthony Green ++ Blake Chaffin ++ hos@tamanegi.org ++ ++ * testsuite/libffi.call/cls_align_longdouble_split2.c ++ testsuite/libffi.call/cls_align_longdouble_split.c ++ testsuite/libffi.call/cls_dbls_struct.c ++ testsuite/libffi.call/cls_double_va.c ++ testsuite/libffi.call/cls_longdouble.c ++ testsuite/libffi.call/cls_longdouble_va.c ++ testsuite/libffi.call/cls_pointer.c ++ testsuite/libffi.call/cls_pointer_stack.c ++ testsuite/libffi.call/err_bad_abi.c ++ testsuite/libffi.call/err_bad_typedef.c ++ testsuite/libffi.call/stret_large2.c ++ testsuite/libffi.call/stret_large.c ++ testsuite/libffi.call/stret_medium2.c ++ testsuite/libffi.call/stret_medium.c: New tests from Apple. ++ ++2009-06-05 Andrew Haley ++ ++ * src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from ++ libffi. ++ ++2009-06-04 Andrew Haley ++ ++ * src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out ++ stdcall changes. ++ ++2008-02-26 Anthony Green ++ Thomas Heller ++ ++ * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C ++ comment. ++ ++2008-02-03 Timothy Wall ++ ++ * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return ++ offset based on code pointer, not data pointer. ++ ++2008-01-31 Timothy Wall ++ ++ * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall ++ closures. ++ * src/x86/ffitarget.h: Increase size of trampoline for stdcall ++ closures. ++ * src/x86/win32.S: Add assembly for stdcall closure. ++ * src/x86/ffi.c: Initialize stdcall closure trampoline. ++ ++2009-06-04 Andrew Haley ++ ++ * include/ffi.h.in: Change void (*)() to void (*)(void). ++ * src/x86/ffi.c: Likewise. ++ ++2009-06-04 Andrew Haley ++ ++ * src/powerpc/ppc_closure.S: Insert licence header. ++ * src/powerpc/linux64_closure.S: Likewise. ++ * src/m68k/sysv.S: Likewise. ++ ++ * src/sh64/ffi.c: Change void (*)() to void (*)(void). ++ * src/powerpc/ffi.c: Likewise. ++ * src/powerpc/ffi_darwin.c: Likewise. ++ * src/m32r/ffi.c: Likewise. ++ * src/sh64/ffi.c: Likewise. ++ * src/x86/ffi64.c: Likewise. ++ * src/alpha/ffi.c: Likewise. ++ * src/alpha/osf.S: Likewise. ++ * src/frv/ffi.c: Likewise. ++ * src/s390/ffi.c: Likewise. ++ * src/pa/ffi.c: Likewise. ++ * src/pa/hpux32.S: Likewise. ++ * src/ia64/unix.S: Likewise. ++ * src/ia64/ffi.c: Likewise. ++ * src/sparc/ffi.c: Likewise. ++ * src/mips/ffi.c: Likewise. ++ * src/sh/ffi.c: Likewise. ++ ++2008-02-15 David Daney ++ ++ * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): ++ Define (conditionally), and use it to include cachectl.h. ++ (ffi_prep_closure_loc): Fix cache flushing. ++ * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. ++ ++2009-06-04 Andrew Haley ++ ++ include/ffi.h.in, ++ src/arm/ffitarget.h, ++ src/arm/ffi.c, ++ src/arm/sysv.S, ++ src/powerpc/ffitarget.h, ++ src/closures.c, ++ src/sh64/ffitarget.h, ++ src/sh64/ffi.c, ++ src/sh64/sysv.S, ++ src/types.c, ++ src/x86/ffi64.c, ++ src/x86/ffitarget.h, ++ src/x86/win32.S, ++ src/x86/darwin.S, ++ src/x86/ffi.c, ++ src/x86/sysv.S, ++ src/x86/unix64.S, ++ src/alpha/ffitarget.h, ++ src/alpha/ffi.c, ++ src/alpha/osf.S, ++ src/m68k/ffitarget.h, ++ src/frv/ffitarget.h, ++ src/frv/ffi.c, ++ src/s390/ffitarget.h, ++ src/s390/sysv.S, ++ src/cris/ffitarget.h, ++ src/pa/linux.S, ++ src/pa/ffitarget.h, ++ src/pa/ffi.c, ++ src/raw_api.c, ++ src/ia64/ffitarget.h, ++ src/ia64/unix.S, ++ src/ia64/ffi.c, ++ src/ia64/ia64_flags.h, ++ src/java_raw_api.c, ++ src/debug.c, ++ src/sparc/v9.S, ++ src/sparc/ffitarget.h, ++ src/sparc/ffi.c, ++ src/sparc/v8.S, ++ src/mips/ffitarget.h, ++ src/mips/n32.S, ++ src/mips/o32.S, ++ src/mips/ffi.c, ++ src/prep_cif.c, ++ src/sh/ffitarget.h, ++ src/sh/ffi.c, ++ src/sh/sysv.S: Update license text. ++ ++2009-05-22 Dave Korn ++ ++ * src/x86/win32.S (_ffi_closure_STDCALL): New function. ++ (.eh_frame): Add FDE for it. ++ ++2009-05-22 Dave Korn ++ ++ * configure.ac: Also check if assembler supports pc-relative ++ relocs on X86_WIN32 targets. ++ * configure: Regenerate. ++ * src/x86/win32.S (ffi_prep_args): Declare extern, not global. ++ (_ffi_call_SYSV): Add missing function type symbol .def and ++ add EH markup labels. ++ (_ffi_call_STDCALL): Likewise. ++ (_ffi_closure_SYSV): Likewise. ++ (_ffi_closure_raw_SYSV): Likewise. ++ (.eh_frame): Add hand-crafted EH data. ++ ++2009-04-09 Jakub Jelinek ++ ++ * testsuite/lib/libffi-dg.exp: Change copyright header to refer to ++ version 3 of the GNU General Public License and to point readers ++ at the COPYING3 file and the FSF's license web page. ++ * testsuite/libffi.call/call.exp: Likewise. ++ * testsuite/libffi.special/special.exp: Likewise. ++ ++2009-03-01 Ralf Wildenhues ++ ++ * configure: Regenerate. ++ ++2008-12-18 Rainer Orth ++ ++ PR libffi/26048 ++ * configure.ac (HAVE_AS_X86_PCREL): New test. ++ * configure: Regenerate. ++ * fficonfig.h.in: Regenerate. ++ * src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate ++ RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET, ++ RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler. ++ (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. ++ * src/x86/unix64.S (.Lstore_table): Move to .text section. ++ (.Lload_table): Likewise. ++ (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. ++ ++2008-12-18 Ralf Wildenhues ++ ++ * configure: Regenerate. ++ ++2008-11-21 Eric Botcazou ++ ++ * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for ++ signed/unsigned int8/16 return values. ++ * src/sparc/v8.S (ffi_call_v8): Likewise. ++ (ffi_closure_v8): Likewise. ++ ++2008-09-26 Peter O'Gorman ++ Steve Ellcey ++ ++ * configure: Regenerate for new libtool. ++ * Makefile.in: Ditto. ++ * include/Makefile.in: Ditto. ++ * aclocal.m4: Ditto. ++ ++2008-08-25 Andreas Tobler ++ ++ * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and ++ FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. ++ Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. ++ Adjust copyright notice. ++ * src/powerpc/ffi.c: Add two new flags to indicate if we have one ++ register or two register to use for FFI_SYSV structs. ++ (ffi_prep_cif_machdep): Pass the right register flag introduced above. ++ (ffi_closure_helper_SYSV): Fix the return type for ++ FFI_SYSV_TYPE_SMALL_STRUCT. Comment. ++ Adjust copyright notice. ++ ++2008-07-16 Kaz Kojima ++ ++ * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned ++ int. ++ ++2008-06-17 Ralf Wildenhues ++ ++ * configure: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ ++2008-06-07 Joseph Myers ++ ++ * configure.ac (parisc*-*-linux*, powerpc-*-sysv*, ++ powerpc-*-beos*): Remove. ++ * configure: Regenerate. ++ ++2008-05-09 Julian Brown ++ ++ * Makefile.am (LTLDFLAGS): New. ++ (libffi_la_LDFLAGS): Use above. ++ * Makefile.in: Regenerate. ++ ++2008-04-18 Paolo Bonzini ++ ++ PR bootstrap/35457 ++ * aclocal.m4: Regenerate. ++ * configure: Regenerate. ++ ++2008-03-26 Kaz Kojima ++ ++ * src/sh/sysv.S: Add .note.GNU-stack on Linux. ++ * src/sh64/sysv.S: Likewise. ++ ++2008-03-26 Daniel Jacobowitz ++ ++ * src/arm/sysv.S: Fix ARM comment marker. ++ ++2008-03-26 Jakub Jelinek ++ ++ * src/alpha/osf.S: Add .note.GNU-stack on Linux. ++ * src/s390/sysv.S: Likewise. ++ * src/powerpc/ppc_closure.S: Likewise. ++ * src/powerpc/sysv.S: Likewise. ++ * src/x86/unix64.S: Likewise. ++ * src/x86/sysv.S: Likewise. ++ * src/sparc/v8.S: Likewise. ++ * src/sparc/v9.S: Likewise. ++ * src/m68k/sysv.S: Likewise. ++ * src/arm/sysv.S: Likewise. ++ ++2008-03-16 Ralf Wildenhues ++ ++ * aclocal.m4: Regenerate. ++ * configure: Likewise. ++ * Makefile.in: Likewise. ++ * include/Makefile.in: Likewise. ++ * testsuite/Makefile.in: Likewise. ++ ++2008-02-12 Bjoern Koenig ++ Andreas Tobler ++ ++ * configure.ac: Add amd64-*-freebsd* target. ++ * configure: Regenerate. ++ ++2008-01-30 H.J. Lu ++ ++ PR libffi/34612 ++ * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when ++ returning struct. ++ ++ * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" ++ tests. ++ ++2008-01-24 David Edelsohn ++ ++ * configure: Regenerate. ++ ++2008-01-06 Andreas Tobler ++ ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko. ++ ++2008-01-05 Andreas Tobler ++ ++ PR testsuite/32843 ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Add code for ++ signed/unsigned int8/16 for X86_DARWIN. ++ Updated copyright info. ++ Handle one and two byte structs with special cif->flags. ++ * src/x86/ffitarget.h: Add special types for one and two byte structs. ++ Updated copyright info. ++ * src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like ++ sysv.S ++ Remove code to pop args from the stack after call. ++ Special-case signed/unsigned for int8/16, one and two byte structs. ++ (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, ++ FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, ++ FFI_TYPE_SINT32. ++ Updated copyright info. ++ ++2007-12-08 David Daney ++ ++ * src/mips/n32.S (ffi_call_N32): Replace dadd with ADDU, dsub with ++ SUBU, add with ADDU and use smaller code sequences. ++ ++2007-12-07 David Daney ++ ++ * src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return ++ type. ++ ++2007-12-06 David Daney ++ ++ * include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not already ++ defined. ++ (ffi_java_raw): New typedef. ++ (ffi_java_raw_call, ffi_java_ptrarray_to_raw, ++ ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to ++ ffi_java_raw. ++ (ffi_java_raw_closure) : Same. ++ (ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change ++ parameter types. ++ * src/java_raw_api.c (ffi_java_raw_size): Replace FFI_SIZEOF_ARG with ++ FFI_SIZEOF_JAVA_RAW. ++ (ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw. ++ Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use ++ sizeof(ffi_java_raw) for alignment calculations. ++ (ffi_java_ptrarray_to_raw): Same. ++ (ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER ++ if FFI_SIZEOF_JAVA_RAW == 4. ++ (ffi_java_raw_to_rvalue): Same. ++ (ffi_java_raw_call): Change type of raw to ffi_java_raw. ++ (ffi_java_translate_args): Same. ++ (ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change ++ parameter types. ++ * src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI. ++ ++2007-12-06 David Daney ++ ++ * src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on ++ pointer values. ++ ++2007-12-01 Andreas Tobler ++ ++ PR libffi/31937 ++ * src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT. ++ Add local FFI_TYPE_UINT128 to handle soft-float long-double-128. ++ * src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and ++ set the NUM_FPR_ARG_REGISTERS according to. ++ Add support for potential soft-float support under hard-float ++ architecture. ++ (ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of ++ FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according ++ to the FFI_LINUX_SOFT_FLOAT ABI. ++ (ffi_prep_cif_machdep): Likewise. ++ (ffi_closure_helper_SYSV): Likewise. ++ * src/powerpc/ppc_closure.S: Make sure not to store float/double ++ on archs where __NO_FPRS__ is true. ++ Add FFI_TYPE_UINT128 support. ++ * src/powerpc/sysv.S: Add support for soft-float long-double-128. ++ Adjust copyright notice. ++ ++2007-11-25 Andreas Tobler ++ ++ * src/closures.c: Move defintion of MAYBE_UNUSED from here to ... ++ * include/ffi_common.h: ... here. ++ Update copyright. ++ ++2007-11-17 Andreas Tobler ++ ++ * src/powerpc/sysv.S: Load correct cr to compare if we have long double. ++ * src/powerpc/linux64.S: Likewise. ++ * src/powerpc/ffi.c: Add a comment to show which part goes into cr6. ++ * testsuite/libffi.call/return_ldl.c: New test. ++ ++2007-09-04 ++ ++ * src/arm/sysv.S (UNWIND): New. ++ (Whole file): Conditionally compile unwinder directives. ++ * src/arm/sysv.S: Add unwinder directives. ++ ++ * src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes. ++ Only treat r0 as a struct address if we're actually returning a ++ struct by address. ++ Only copy the bytes that are actually within a struct. ++ (ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes ++ is returned in r0, not passed by address. ++ (ffi_call): Allocate a word-sized temporary for the case where ++ a composite is returned in r0. ++ (ffi_prep_incoming_args_SYSV): Align as necessary. ++ ++2007-08-05 Steven Newbury ++ ++ * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of ++ directly using the sys_cacheflush syscall. ++ ++2007-07-27 Andrew Haley ++ ++ * src/arm/sysv.S (ffi_closure_SYSV): Add soft-float. ++ ++2007-09-03 Maciej W. Rozycki ++ ++ * Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS. ++ * configure.ac: Likewise. ++ * Makefile.in: Regenerate. ++ * include/Makefile.in: Likewise. ++ * testsuite/Makefile.in: Likewise. ++ * configure: Likewise. ++ ++2007-08-24 David Daney ++ ++ * testsuite/libffi.call/return_sl.c: New test. ++ ++2007-08-10 David Daney ++ ++ * testsuite/libffi.call/cls_multi_ushort.c, ++ testsuite/libffi.call/cls_align_uint16.c, ++ testsuite/libffi.call/nested_struct1.c, ++ testsuite/libffi.call/nested_struct3.c, ++ testsuite/libffi.call/cls_7_1_byte.c, ++ testsuite/libffi.call/nested_struct5.c, ++ testsuite/libffi.call/cls_double.c, ++ testsuite/libffi.call/nested_struct7.c, ++ testsuite/libffi.call/cls_sint.c, ++ testsuite/libffi.call/nested_struct9.c, ++ testsuite/libffi.call/cls_20byte1.c, ++ testsuite/libffi.call/cls_multi_sshortchar.c, ++ testsuite/libffi.call/cls_align_sint64.c, ++ testsuite/libffi.call/cls_3byte2.c, ++ testsuite/libffi.call/cls_multi_schar.c, ++ testsuite/libffi.call/cls_multi_uchar.c, ++ testsuite/libffi.call/cls_19byte.c, ++ testsuite/libffi.call/cls_9byte1.c, ++ testsuite/libffi.call/cls_align_float.c, ++ testsuite/libffi.call/closure_fn1.c, ++ testsuite/libffi.call/problem1.c, ++ testsuite/libffi.call/closure_fn3.c, ++ testsuite/libffi.call/cls_sshort.c, ++ testsuite/libffi.call/closure_fn5.c, ++ testsuite/libffi.call/cls_align_double.c, ++ testsuite/libffi.call/nested_struct.c, ++ testsuite/libffi.call/cls_2byte.c, ++ testsuite/libffi.call/nested_struct10.c, ++ testsuite/libffi.call/cls_4byte.c, ++ testsuite/libffi.call/cls_6byte.c, ++ testsuite/libffi.call/cls_8byte.c, ++ testsuite/libffi.call/cls_multi_sshort.c, ++ testsuite/libffi.call/cls_align_sint16.c, ++ testsuite/libffi.call/cls_align_uint32.c, ++ testsuite/libffi.call/cls_20byte.c, ++ testsuite/libffi.call/cls_float.c, ++ testsuite/libffi.call/nested_struct2.c, ++ testsuite/libffi.call/cls_5_1_byte.c, ++ testsuite/libffi.call/nested_struct4.c, ++ testsuite/libffi.call/cls_24byte.c, ++ testsuite/libffi.call/nested_struct6.c, ++ testsuite/libffi.call/cls_64byte.c, ++ testsuite/libffi.call/nested_struct8.c, ++ testsuite/libffi.call/cls_uint.c, ++ testsuite/libffi.call/cls_multi_ushortchar.c, ++ testsuite/libffi.call/cls_schar.c, ++ testsuite/libffi.call/cls_uchar.c, ++ testsuite/libffi.call/cls_align_uint64.c, ++ testsuite/libffi.call/cls_ulonglong.c, ++ testsuite/libffi.call/cls_align_longdouble.c, ++ testsuite/libffi.call/cls_1_1byte.c, ++ testsuite/libffi.call/cls_12byte.c, ++ testsuite/libffi.call/cls_3_1byte.c, ++ testsuite/libffi.call/cls_3byte1.c, ++ testsuite/libffi.call/cls_4_1byte.c, ++ testsuite/libffi.call/cls_6_1_byte.c, ++ testsuite/libffi.call/cls_16byte.c, ++ testsuite/libffi.call/cls_18byte.c, ++ testsuite/libffi.call/closure_fn0.c, ++ testsuite/libffi.call/cls_9byte2.c, ++ testsuite/libffi.call/closure_fn2.c, ++ testsuite/libffi.call/closure_fn4.c, ++ testsuite/libffi.call/cls_ushort.c, ++ testsuite/libffi.call/closure_fn6.c, ++ testsuite/libffi.call/cls_5byte.c, ++ testsuite/libffi.call/cls_align_pointer.c, ++ testsuite/libffi.call/cls_7byte.c, ++ testsuite/libffi.call/cls_align_sint32.c, ++ testsuite/libffi.special/unwindtest_ffi_call.cc, ++ testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*. ++ ++2007-08-10 David Daney ++ ++ PR libffi/28313 ++ * configure.ac: Don't treat mips64 as a special case. ++ * Makefile.am (nodist_libffi_la_SOURCES): Add n32.S. ++ * configure: Regenerate ++ * Makefile.in: Ditto. ++ * fficonfig.h.in: Ditto. ++ * src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent. ++ (LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros. ++ (FFI_DEFAULT_ABI): Set for n64 case. ++ (FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases. ++ * src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE. ++ (ffi_closure_N32): New function. ++ (.eh_frame): New section ++ * src/mips/o32.S: Clean up comments. ++ (ffi_closure_O32): Pass ffi_closure parameter in $12. ++ * src/mips/ffi.c: Use FFI_MIPS_N32 instead of ++ _MIPS_SIM == _ABIN32 throughout. ++ (FFI_MIPS_STOP_HERE): New, use in place of ++ ffi_stop_here. ++ (ffi_prep_args): Use unsigned long to hold pointer values. Rewrite ++ to support n32/n64 ABIs. ++ (calc_n32_struct_flags): Rewrite. ++ (calc_n32_return_struct_flags): Remove unused variable. Reverse ++ position of flag bits. ++ (ffi_prep_cif_machdep): Rewrite n32 portion. ++ (ffi_call): Enable for n64. Add special handling for small structure ++ return values. ++ (ffi_prep_closure_loc): Add n32 and n64 support. ++ (ffi_closure_mips_inner_O32): Add cast to silence warning. ++ (copy_struct_N32, ffi_closure_mips_inner_N32): New functions. ++ ++2007-08-08 David Daney ++ ++ * testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition. ++ * testsuite/libffi.call/cls_align_uint16.c (main): Use correct type ++ specifiers. ++ * testsuite/libffi.call/nested_struct1.c (main): Ditto. ++ * testsuite/libffi.call/cls_sint.c (main): Ditto. ++ * testsuite/libffi.call/nested_struct9.c (main): Ditto. ++ * testsuite/libffi.call/cls_20byte1.c (main): Ditto. ++ * testsuite/libffi.call/cls_9byte1.c (main): Ditto. ++ * testsuite/libffi.call/closure_fn1.c (main): Ditto. ++ * testsuite/libffi.call/closure_fn3.c (main): Ditto. ++ * testsuite/libffi.call/return_dbl2.c (main): Ditto. ++ * testsuite/libffi.call/cls_sshort.c (main): Ditto. ++ * testsuite/libffi.call/return_fl3.c (main): Ditto. ++ * testsuite/libffi.call/closure_fn5.c (main): Ditto. ++ * testsuite/libffi.call/nested_struct.c (main): Ditto. ++ * testsuite/libffi.call/nested_struct10.c (main): Ditto. ++ * testsuite/libffi.call/return_ll1.c (main): Ditto. ++ * testsuite/libffi.call/cls_8byte.c (main): Ditto. ++ * testsuite/libffi.call/cls_align_uint32.c (main): Ditto. ++ * testsuite/libffi.call/cls_align_sint16.c (main): Ditto. ++ * testsuite/libffi.call/cls_20byte.c (main): Ditto. ++ * testsuite/libffi.call/nested_struct2.c (main): Ditto. ++ * testsuite/libffi.call/cls_24byte.c (main): Ditto. ++ * testsuite/libffi.call/nested_struct6.c (main): Ditto. ++ * testsuite/libffi.call/cls_uint.c (main): Ditto. ++ * testsuite/libffi.call/cls_12byte.c (main): Ditto. ++ * testsuite/libffi.call/cls_16byte.c (main): Ditto. ++ * testsuite/libffi.call/closure_fn0.c (main): Ditto. ++ * testsuite/libffi.call/cls_9byte2.c (main): Ditto. ++ * testsuite/libffi.call/closure_fn2.c (main): Ditto. ++ * testsuite/libffi.call/return_dbl1.c (main): Ditto. ++ * testsuite/libffi.call/closure_fn4.c (main): Ditto. ++ * testsuite/libffi.call/closure_fn6.c (main): Ditto. ++ * testsuite/libffi.call/cls_align_sint32.c (main): Ditto. ++ ++2007-08-07 Andrew Haley ++ ++ * src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous ++ checkin. ++ ++2007-08-06 Andrew Haley ++ ++ PR testsuite/32843 ++ * src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, ++ FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, ++ FFI_TYPE_SINT32. ++ ++2007-08-02 David Daney ++ ++ * testsuite/libffi.call/return_ul.c (main): Define return type as ++ ffi_arg. Use proper printf conversion specifier. ++ ++2007-07-30 Andrew Haley ++ ++ PR testsuite/32843 ++ * src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for ++ signed/unsigned int8/16. ++ * src/x86/sysv.S (ffi_call_SYSV): Rewrite to: ++ Use a jump table. ++ Remove code to pop args from the stack after call. ++ Special-case signed/unsigned int8/16. ++ * testsuite/libffi.call/return_sc.c (main): Revert. ++ ++2007-07-26 Richard Guenther ++ ++ PR testsuite/32843 ++ * testsuite/libffi.call/return_sc.c (main): Verify call ++ result as signed char, not ffi_arg. ++ ++2007-07-16 Rainer Orth ++ ++ * configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64. ++ * configure: Regenerate. ++ ++2007-07-11 David Daney ++ ++ * src/mips/ffi.c: Don't include sys/cachectl.h. ++ (ffi_prep_closure_loc): Use __builtin___clear_cache() instead of ++ cacheflush(). ++ ++2007-05-18 Aurelien Jarno ++ ++ * src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted ++ from (ffi_prep_closure): ... this. ++ (FFI_INIT_TRAMPOLINE): Adjust. ++ ++2005-12-31 Phil Blundell ++ ++ * src/arm/ffi.c (ffi_prep_incoming_args_SYSV, ++ ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support. ++ * src/arm/sysv.S(ffi_closure_SYSV): Likewise. ++ * src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. ++ (FFI_CLOSURES): Enable closure support. ++ ++2007-07-03 Andrew Haley ++ ++ * testsuite/libffi.call/cls_multi_ushort.c, ++ testsuite/libffi.call/cls_align_uint16.c, ++ testsuite/libffi.call/nested_struct1.c, ++ testsuite/libffi.call/nested_struct3.c, ++ testsuite/libffi.call/cls_7_1_byte.c, ++ testsuite/libffi.call/cls_double.c, ++ testsuite/libffi.call/nested_struct5.c, ++ testsuite/libffi.call/nested_struct7.c, ++ testsuite/libffi.call/cls_sint.c, ++ testsuite/libffi.call/nested_struct9.c, ++ testsuite/libffi.call/cls_20byte1.c, ++ testsuite/libffi.call/cls_multi_sshortchar.c, ++ testsuite/libffi.call/cls_align_sint64.c, ++ testsuite/libffi.call/cls_3byte2.c, ++ testsuite/libffi.call/cls_multi_schar.c, ++ testsuite/libffi.call/cls_multi_uchar.c, ++ testsuite/libffi.call/cls_19byte.c, ++ testsuite/libffi.call/cls_9byte1.c, ++ testsuite/libffi.call/cls_align_float.c, ++ testsuite/libffi.call/closure_fn1.c, ++ testsuite/libffi.call/problem1.c, ++ testsuite/libffi.call/closure_fn3.c, ++ testsuite/libffi.call/cls_sshort.c, ++ testsuite/libffi.call/closure_fn5.c, ++ testsuite/libffi.call/cls_align_double.c, ++ testsuite/libffi.call/cls_2byte.c, ++ testsuite/libffi.call/nested_struct.c, ++ testsuite/libffi.call/nested_struct10.c, ++ testsuite/libffi.call/cls_4byte.c, ++ testsuite/libffi.call/cls_6byte.c, ++ testsuite/libffi.call/cls_8byte.c, ++ testsuite/libffi.call/cls_multi_sshort.c, ++ testsuite/libffi.call/cls_align_uint32.c, ++ testsuite/libffi.call/cls_align_sint16.c, ++ testsuite/libffi.call/cls_float.c, ++ testsuite/libffi.call/cls_20byte.c, ++ testsuite/libffi.call/cls_5_1_byte.c, ++ testsuite/libffi.call/nested_struct2.c, ++ testsuite/libffi.call/cls_24byte.c, ++ testsuite/libffi.call/nested_struct4.c, ++ testsuite/libffi.call/nested_struct6.c, ++ testsuite/libffi.call/cls_64byte.c, ++ testsuite/libffi.call/nested_struct8.c, ++ testsuite/libffi.call/cls_uint.c, ++ testsuite/libffi.call/cls_multi_ushortchar.c, ++ testsuite/libffi.call/cls_schar.c, ++ testsuite/libffi.call/cls_uchar.c, ++ testsuite/libffi.call/cls_align_uint64.c, ++ testsuite/libffi.call/cls_ulonglong.c, ++ testsuite/libffi.call/cls_align_longdouble.c, ++ testsuite/libffi.call/cls_1_1byte.c, ++ testsuite/libffi.call/cls_12byte.c, ++ testsuite/libffi.call/cls_3_1byte.c, ++ testsuite/libffi.call/cls_3byte1.c, ++ testsuite/libffi.call/cls_4_1byte.c, ++ testsuite/libffi.call/cls_6_1_byte.c, ++ testsuite/libffi.call/cls_16byte.c, ++ testsuite/libffi.call/cls_18byte.c, ++ testsuite/libffi.call/closure_fn0.c, ++ testsuite/libffi.call/cls_9byte2.c, ++ testsuite/libffi.call/closure_fn2.c, ++ testsuite/libffi.call/closure_fn4.c, ++ testsuite/libffi.call/cls_ushort.c, ++ testsuite/libffi.call/closure_fn6.c, ++ testsuite/libffi.call/cls_5byte.c, ++ testsuite/libffi.call/cls_align_pointer.c, ++ testsuite/libffi.call/cls_7byte.c, ++ testsuite/libffi.call/cls_align_sint32.c, ++ testsuite/libffi.special/unwindtest_ffi_call.cc, ++ testsuite/libffi.special/unwindtest.cc: Enable for ARM. ++ ++2007-07-05 H.J. Lu ++ ++ * aclocal.m4: Regenerated. ++ ++2007-06-02 Paolo Bonzini ++ ++ * configure: Regenerate. ++ ++2007-05-23 Steve Ellcey ++ ++ * Makefile.in: Regenerate. ++ * configure: Regenerate. ++ * aclocal.m4: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ ++2007-05-10 Roman Zippel ++ ++ * src/m68k/ffi.c (ffi_prep_incoming_args_SYSV, ++ ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support. ++ * src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise. ++ * src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. ++ (FFI_CLOSURES): Enable closure support. ++ ++2007-05-10 Roman Zippel ++ ++ * configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test. ++ * configure: Regenerate. ++ * fficonfig.h.in: Regenerate. ++ * src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC, ++ CFI_OFFSET,CFI_DEF_CFA): New macros. ++ (ffi_call_SYSV): Add callframe annotation. ++ ++2007-05-10 Roman Zippel ++ ++ * src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix ++ numerous test suite failures. ++ * src/m68k/sysv.S (ffi_call_SYSV): Likewise. ++ ++2007-04-11 Paolo Bonzini ++ ++ * Makefile.am (EXTRA_DIST): Bring up to date. ++ * Makefile.in: Regenerate. ++ * src/frv/eabi.S: Remove RCS keyword. ++ ++2007-04-06 Richard Henderson ++ ++ * configure.ac: Tidy target case. ++ (HAVE_LONG_DOUBLE): Allow the target to override. ++ * configure: Regenerate. ++ * include/ffi.h.in: Don't define ffi_type_foo if ++ LIBFFI_HIDE_BASIC_TYPES is defined. ++ (ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define ++ to ffi_type_double. ++ * types.c (LIBFFI_HIDE_BASIC_TYPES): Define. ++ (FFI_TYPEDEF, ffi_type_void): Mark the data const. ++ (ffi_type_longdouble): Special case for Alpha. Don't define ++ if long double == double. ++ ++ * src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value. ++ (ffi_prep_cif_machdep): Handle it as the 128-bit type. ++ (ffi_call, ffi_closure_osf_inner): Likewise. ++ (ffi_closure_osf_inner): Likewise. Mark hidden. ++ (ffi_call_osf, ffi_closure_osf): Mark hidden. ++ * src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition. ++ * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden. ++ (load_table): Handle 128-bit long double. ++ ++ * testsuite/libffi.call/float4.c: Add -mieee for alpha. ++ ++2007-04-06 Tom Tromey ++ ++ PR libffi/31491: ++ * README: Fixed bug in example. ++ ++2007-04-03 Jakub Jelinek ++ ++ * src/closures.c: Include sys/statfs.h. ++ (_GNU_SOURCE): Define on Linux. ++ (FFI_MMAP_EXEC_SELINUX): Define. ++ (selinux_enabled): New variable. ++ (selinux_enabled_check): New function. ++ (is_selinux_enabled): Define. ++ (dlmmap): Use it. ++ ++2007-03-24 Uros Bizjak ++ ++ * testsuite/libffi.call/return_fl2.c (return_fl): Mark as static. ++ Use 'volatile float sum' to create sum of floats to avoid false ++ negative due to excess precision on ix86 targets. ++ (main): Ditto. ++ ++2007-03-08 Alexandre Oliva ++ ++ * src/powerpc/ffi.c (flush_icache): Fix left-over from previous ++ patch. ++ (ffi_prep_closure_loc): Remove unneeded casts. Add needed ones. ++ ++2007-03-07 Alexandre Oliva ++ ++ * include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New. ++ (ffi_prep_closure_loc): New. ++ (ffi_prep_raw_closure_loc): New. ++ (ffi_prep_java_raw_closure_loc): New. ++ * src/closures.c: New file. ++ * src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment): ++ Replace sflags with exec_offset. ++ [FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset, ++ sub_segment_exec_offset): New macros. ++ (get_segment_flags, set_segment_flags, check_segment_merge): New ++ macros. ++ (is_mmapped_segment, is_extern_segment): Use get_segment_flags. ++ (add_segment, sys_alloc, create_mspace, create_mspace_with_base, ++ destroy_mspace): Use new macros. ++ (sys_alloc): Silence warning. ++ * Makefile.am (libffi_la_SOURCES): Add src/closures.c. ++ * Makefile.in: Rebuilt. ++ * src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in ++ terms of ffi_prep_closure_loc. ++ * src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted ++ from... ++ (ffi_prep_raw_closure): ... this. Re-implement in terms of the ++ renamed version. ++ * src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and ++ adjusted from... ++ (ffi_prep_java_raw_closure): ... this. Re-implement in terms of ++ the renamed version. ++ * src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from ++ (ffi_prep_closure): ... this. ++ * src/pa/ffi.c: Likewise. ++ * src/cris/ffi.c: Likewise. Adjust. ++ * src/frv/ffi.c: Likewise. ++ * src/ia64/ffi.c: Likewise. ++ * src/mips/ffi.c: Likewise. ++ * src/powerpc/ffi_darwin.c: Likewise. ++ * src/s390/ffi.c: Likewise. ++ * src/sh/ffi.c: Likewise. ++ * src/sh64/ffi.c: Likewise. ++ * src/sparc/ffi.c: Likewise. ++ * src/x86/ffi64.c: Likewise. ++ * src/x86/ffi.c: Likewise. ++ (FFI_INIT_TRAMPOLINE): Adjust. ++ (ffi_prep_raw_closure_loc): Renamed and adjusted from... ++ (ffi_prep_raw_closure): ... this. ++ * src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from ++ (ffi_prep_closure): ... this. ++ (flush_icache): Adjust. ++ ++2007-03-07 Alexandre Oliva ++ ++ * src/dlmalloc.c: New file, imported version 2.8.3 of Doug ++ Lea's malloc. ++ ++2007-03-01 Brooks Moses ++ ++ * Makefile.am: Add dummy install-pdf target. ++ * Makefile.in: Regenerate ++ ++2007-02-13 Andreas Krebbel ++ ++ * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, ++ ffi_closure_helper_SYSV): Add long double handling. ++ ++2007-02-02 Jakub Jelinek ++ ++ * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 ++ immediately after bctrl instruction. ++ ++2007-01-18 Alexandre Oliva ++ ++ * Makefile.am (all-recursive, install-recursive, ++ mostlyclean-recursive, clean-recursive, distclean-recursive, ++ maintainer-clean-recursive): Add missing targets. ++ * Makefile.in: Rebuilt. ++ ++2006-12-14 Andreas Tobler ++ ++ * configure.ac: Add TARGET for x86_64-*-darwin*. ++ * Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources ++ for X86_DARWIN. ++ * src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*. ++ * src/x86/darwin64.S: New file for x86_64-*-darwin* support. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ * testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for ++ ffi_call only. ++ ++2006-12-13 Andreas Tobler ++ ++ * aclocal.m4: Regenerate with aclocal -I .. as written in the ++ Makefile.am. ++ ++2006-10-31 Geoffrey Keating ++ ++ * src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New. ++ (ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for ++ Darwin. ++ * testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL. ++ * testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL. ++ ++2006-10-10 Paolo Bonzini ++ Sandro Tolaini ++ ++ * configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and ++ conditional. ++ * configure: Regenerated. ++ * Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case. ++ (EXTRA_DIST): Add src/x86/darwin.S. ++ * Makefile.in: Regenerated. ++ * include/Makefile.in: Regenerated. ++ * testsuite/Makefile.in: Regenerated. ++ ++ * src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like ++ X86_WIN32, and additionally align stack to 16 bytes. ++ * src/x86/darwin.S: New, based on sysv.S. ++ * src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs. ++ ++2006-09-12 David Daney ++ ++ PR libffi/23935 ++ * include/Makefile.am: Install both ffi.h and ffitarget.h in ++ $(libdir)/gcc/$(target_alias)/$(gcc_version)/include. ++ * aclocal.m4: Regenerated for automake 1.9.6. ++ * Makefile.in: Regenerated. ++ * include/Makefile.in: Regenerated. ++ * testsuite/Makefile.in: Regenerated. ++ ++2006-08-17 Andreas Tobler ++ ++ * include/ffi_common.h (struct): Revert accidental commit. ++ ++2006-08-15 Andreas Tobler ++ ++ * include/ffi_common.h: Remove lint directives. ++ * include/ffi.h.in: Likewise. ++ ++2006-07-25 Torsten Schoenfeld ++ ++ * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly ++ for 32-bit architectures. ++ * testsuite/libffi.call/return_ul.c: New test case. ++ ++2006-07-19 David Daney ++ ++ * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips, ++ xfail remains for mips64. ++ ++2006-05-23 Carlos O'Donell ++ ++ * Makefile.am: Add install-html target. Add install-html to .PHONY ++ * Makefile.in: Regenerate. ++ * aclocal.m4: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ ++2006-05-18 John David Anglin ++ ++ * pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from ++ stack slot. ++ ++2006-04-22 Andreas Tobler ++ ++ * README: Remove notice about 'Crazy Comments'. ++ * src/debug.c: Remove lint directives. Cleanup white spaces. ++ * src/java_raw_api.c: Likewise. ++ * src/prep_cif.c: Likewise. ++ * src/raw_api.c: Likewise. ++ * src/ffitest.c: Delete. No longer needed, all test cases migrated ++ to the testsuite. ++ * src/arm/ffi.c: Remove lint directives. ++ * src/m32r/ffi.c: Likewise. ++ * src/pa/ffi.c: Likewise. ++ * src/powerpc/ffi.c: Likewise. ++ * src/powerpc/ffi_darwin.c: Likewise. ++ * src/sh/ffi.c: Likewise. ++ * src/sh64/ffi.c: Likewise. ++ * src/x86/ffi.c: Likewise. ++ * testsuite/libffi.call/float2.c: Likewise. ++ * testsuite/libffi.call/promotion.c: Likewise. ++ * testsuite/libffi.call/struct1.c: Likewise. ++ ++2006-04-13 Andreas Tobler ++ ++ * src/pa/hpux32.S: Correct unwind offset calculation for ++ ffi_closure_pa32. ++ * src/pa/linux.S: Likewise. ++ ++2006-04-12 James E Wilson ++ ++ PR libgcj/26483 ++ * src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros. ++ (hfa_type_load): Call stf_spill. ++ (hfa_type_store): Call ldf_fill. ++ (ffi_call): Adjust calls to above routines. Add local temps for ++ macro result. ++ ++2006-04-10 Matthias Klose ++ ++ * testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib ++ directory names containing underscores. ++ ++2006-04-07 James E Wilson ++ ++ * testsuite/libffi.call/float4.c: New testcase. ++ ++2006-04-05 John David Anglin ++ Andreas Tobler ++ ++ * Makefile.am: Add PA_HPUX port. ++ * Makefile.in: Regenerate. ++ * include/Makefile.in: Likewise. ++ * testsuite/Makefile.in: Likewise. ++ * configure.ac: Add PA_HPUX rules. ++ * configure: Regenerate. ++ * src/pa/ffitarget.h: Rename linux target to PA_LINUX. ++ Add PA_HPUX and PA64_HPUX. ++ Rename FFI_LINUX ABI to FFI_PA32 ABI. ++ (FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets. ++ (FFI_TYPE_SMALL_STRUCT2): Define. ++ (FFI_TYPE_SMALL_STRUCT4): Likewise. ++ (FFI_TYPE_SMALL_STRUCT8): Likewise. ++ (FFI_TYPE_SMALL_STRUCT3): Redefine. ++ (FFI_TYPE_SMALL_STRUCT5): Likewise. ++ (FFI_TYPE_SMALL_STRUCT6): Likewise. ++ (FFI_TYPE_SMALL_STRUCT7): Likewise. ++ * src/pa/ffi.c (ROUND_DOWN): Delete. ++ (fldw, fstw, fldd, fstd): Use '__asm__'. ++ (ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2, ++ FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. ++ (ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment. ++ Simplify incrementing of stack slot variable. Change type of local ++ 'n' to unsigned int. ++ (ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long ++ double on PA_HPUX. ++ (ffi_prep_cif_machdep): Likewise. ++ (ffi_call): Likewise. ++ (ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change ++ return type to ffi_status. Simplify incrementing of stack slot ++ variable. Only copy floating point argument registers when PA_LINUX ++ is true. Reformat debug statement. ++ Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and ++ FFI_TYPE_SMALL_STRUCT8. ++ (ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to ++ declaration. ++ (ffi_prep_closure): Make linux trampoline conditional on PA_LINUX. ++ Add nops to cache flush. Add trampoline for PA_HPUX. ++ * src/pa/hpux32.S: New file. ++ * src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename ++ ffi_prep_args_LINUX to ffi_prep_args_pa32. ++ Localize labels. Add support for 2, 4 and 8-byte small structs. Handle ++ unaligned destinations in 3, 5, 6 and 7-byte small structs. Order ++ argument type checks so that common argument types appear first. ++ (ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename ++ ffi_closure_inner_LINUX to ffi_closure_inner_pa32. ++ ++2006-03-24 Alan Modra ++ ++ * src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX. Default ++ for 32-bit using IBM extended double format. Fix FFI_LAST_ABI. ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of ++ FFI_TYPE_LONGDOUBLE. ++ (ffi_prep_args64): Assert using IBM extended double. ++ (ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type. ++ Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. ++ (ffi_call): Handle FFI_LINUX. ++ (ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs ++ gpr3 return pointer as for struct return. Handle FFI_LINUX ++ FFI_TYPE_LONGDOUBLE return and args. Don't increment "nf" ++ unnecessarily. ++ * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2 ++ for FFI_TYPE_LONGDOUBLE. Move epilogue insns into case table. ++ Don't use r6 as pointer to results, instead use sp offset. Don't ++ make a special call to load lr with case table address, instead ++ use offset from previous call. ++ * src/powerpc/sysv.S (ffi_call_SYSV): Save long double return. ++ * src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double ++ return. ++ ++2006-03-15 Kaz Kojima ++ ++ * src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments ++ passed with FP registers correctly. ++ (ffi_closure_helper_SYSV): Likewise. ++ * src/sh64/sysv.S: Likewise. ++ ++2006-03-01 Andreas Tobler ++ ++ * testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif, ++ args and userdata unused. ++ (closure_test_fn1): Mark cif and userdata unused. ++ (main): Remove unused res. ++ ++2006-02-28 Andreas Tobler ++ ++ * testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for ++ -O2, -O3, -Os and the warning flags -W -Wall. ++ * testsuite/libffi.special/special.exp: Likewise. ++ * testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark ++ unused parameter unused for gcc or else do nothing. ++ * testsuite/libffi.special/ffitestcxx.h: Likewise. ++ * testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif ++ and userdata unused. ++ * testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise. ++ * testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise. ++ * testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise. ++ * testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise. ++ * testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise. ++ * testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise. ++ * testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise. ++ * testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise. ++ * testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise. ++ * testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise. ++ * testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise. ++ * testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise. ++ * testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise. ++ * testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise. ++ * testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise. ++ * testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise. ++ * testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise. ++ * testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise. ++ * testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise. ++ * testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise. ++ * testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise. ++ * testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise. ++ * testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise. ++ * testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast ++ void* to avoid compiler warning. ++ (main): Likewise. ++ (cls_struct_align_gn): Mark cif and userdata unused. ++ * testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn): ++ Likewise. ++ * testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise. ++ * testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise. ++ * testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and ++ data unused. ++ (main): Cast res_call to silence gcc. ++ * testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and ++ data unused. ++ (main): Cast res_call to silence gcc. ++ * testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif ++ and data unused. ++ (main): Cast res_call to silence gcc. ++ * testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and ++ data unused. ++ (main): Cast res_call to silence gcc. ++ * testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and ++ data unused. ++ (main): Cast res_call to silence gcc. ++ * testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif ++ and data unused. ++ (main): Cast res_call to silence gcc. ++ * testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and ++ userdata unused. ++ (cls_ret_schar_fn): Cast printf parameter to silence gcc. ++ * testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and ++ userdata unused. ++ (cls_ret_sint_fn): Cast printf parameter to silence gcc. ++ * testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and ++ userdata unused. ++ (cls_ret_sshort_fn): Cast printf parameter to silence gcc. ++ * testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn): Mark cif and ++ userdata unused. ++ (cls_ret_uchar_fn): Cast printf parameter to silence gcc. ++ * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and ++ userdata unused. ++ (cls_ret_uint_fn): Cast printf parameter to silence gcc. ++ * testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif ++ and userdata unused. ++ * testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and ++ userdata unused. ++ (cls_ret_ushort_fn): Cast printf parameter to silence gcc. ++ * testsuite/libffi.call/float.c (floating): Remove unused parameter e. ++ * testsuite/libffi.call/float1.c (main): Remove unused variable i. ++ Cleanup white spaces. ++ * testsuite/libffi.call/negint.c (checking): Remove unused variable i. ++ * testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark ++ cif and userdata unused. ++ * testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn): ++ Likewise. ++ * testsuite/libffi.call/nested_struct10.c (B_gn): Likewise. ++ * testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf ++ formatters to silence gcc. ++ (B_gn): Mark cif and userdata unused. ++ * testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata ++ unused. ++ * testsuite/libffi.call/nested_struct4.c: Mention related PR. ++ (B_gn): Mark cif and userdata unused. ++ * testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata ++ unused. ++ * testsuite/libffi.call/nested_struct6.c: Mention related PR. ++ (B_gn): Mark cif and userdata unused. ++ * testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata ++ unused. ++ * testsuite/libffi.call/nested_struct8.c (B_gn): Likewise. ++ * testsuite/libffi.call/nested_struct9.c (B_gn): Likewise. ++ * testsuite/libffi.call/problem1.c (stub): Likewise. ++ * testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence ++ gcc. ++ * testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned ++ in the last commit for this test case in the test case itself. ++ * testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as ++ unused. ++ * testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise. ++ * testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise. ++ * testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise. ++ * testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise. ++ * testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise. ++ * testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise. ++ ++2006-02-22 Kaz Kojima ++ ++ * src/sh/sysv.S: Fix register numbers in the FDE for ++ ffi_closure_SYSV. ++ ++2006-02-20 Andreas Tobler ++ ++ * testsuite/libffi.call/return_fl2.c (return_fl): Remove static ++ declaration to avoid a false negative on ix86. See PR323. ++ ++2006-02-18 Kaz Kojima ++ ++ * src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable ++ and cast integer to void * if needed. Update the pointer to ++ the FP register saved area correctly. ++ ++2006-02-17 Andreas Tobler ++ ++ * testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630 ++ is fixed. ++ * testsuite/libffi.call/nested_struct4.c: Likewise. ++ ++2006-02-16 Andreas Tobler ++ ++ * testsuite/libffi.call/return_dbl.c: New test case. ++ * testsuite/libffi.call/return_dbl1.c: Likewise. ++ * testsuite/libffi.call/return_dbl2.c: Likewise. ++ * testsuite/libffi.call/return_fl.c: Likewise. ++ * testsuite/libffi.call/return_fl1.c: Likewise. ++ * testsuite/libffi.call/return_fl2.c: Likewise. ++ * testsuite/libffi.call/return_fl3.c: Likewise. ++ * testsuite/libffi.call/closure_fn6.c: Likewise. ++ ++ * testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong ++ definition. ++ * testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition ++ here to be used by other test cases too. ++ ++ * testsuite/libffi.call/nested_struct10.c: New test case. ++ * testsuite/libffi.call/nested_struct9.c: Likewise. ++ * testsuite/libffi.call/nested_struct8.c: Likewise. ++ * testsuite/libffi.call/nested_struct7.c: Likewise. ++ * testsuite/libffi.call/nested_struct6.c: Likewise. ++ * testsuite/libffi.call/nested_struct5.c: Likewise. ++ * testsuite/libffi.call/nested_struct4.c: Likewise. ++ ++2006-01-21 Andreas Tobler ++ ++ * configure.ac: Enable libffi for sparc64-*-freebsd*. ++ * configure: Rebuilt. ++ ++2006-01-18 Jakub Jelinek ++ ++ * src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3, ++ instead do the shifting inline. ++ * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5 ++ shift count unconditionally. Simplify load sequences for 1, 2, 3, 4 ++ and 8 byte structs, for the remaining struct sizes don't call ++ __lshrdi3, instead do the shifting inline. ++ ++2005-12-07 Thiemo Seufer ++ ++ * src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add ++ missing parentheses. ++ * src/mips/o32.S (ffi_call_O32): Code formatting. Define ++ and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations. ++ (ffi_closure_O32): Likewise, but with newly defined A3_OFF2, ++ A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2, ++ V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2, ++ FA_0_0_OFF2. ++ * src/mips/ffi.c (ffi_prep_args): Code formatting. Fix ++ endianness bugs. ++ (ffi_prep_closure): Improve trampoline instruction scheduling. ++ (ffi_closure_mips_inner_O32): Fix endianness bugs. ++ ++2005-12-03 Alan Modra ++ ++ * src/powerpc/ffi.c: Formatting. ++ (ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions. ++ (ffi_prep_args64): Likewise. ++ ++2005-09-30 Geoffrey Keating ++ ++ * testsuite/lib/libffi-dg.exp (libffi_target_compile): For ++ darwin, use -shared-libgcc not -lgcc_s, and explain why. ++ ++2005-09-26 Tom Tromey ++ ++ * testsuite/libffi.call/float1.c (value_type): New typedef. ++ (CANARY): New define. ++ (main): Check for result buffer overflow. ++ * src/powerpc/linux64.S: Handle linux64 long double returns. ++ * src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant. ++ (ffi_prep_cif_machdep): Handle linux64 long double returns. ++ ++2005-08-25 Alan Modra ++ ++ PR target/23404 ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack ++ homed fp args. ++ (ffi_status ffi_prep_cif_machdep): Correct stack sizing for same. ++ ++2005-08-11 Jakub Jelinek ++ ++ * configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test. ++ (AH_BOTTOM): Add FFI_HIDDEN definition. ++ * configure: Rebuilt. ++ * fficonfig.h.in: Rebuilt. ++ * src/powerpc/ffi.c (hidden): Remove. ++ (ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64, ++ ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden. ++ * src/powerpc/linux64_closure.S (ffi_closure_LINUX64, ++ .ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden. ++ * src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove, ++ add FFI_HIDDEN to its prototype. ++ (ffi_closure_SYSV_inner): New. ++ * src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. ++ * src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. ++ ++2005-08-10 Alfred M. Szmidt ++ ++ PR libffi/21819: ++ * configure: Rebuilt. ++ * configure.ac: Handle i*86-*-gnu*. ++ ++2005-08-09 Jakub Jelinek ++ ++ * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use ++ DW_CFA_offset_extended_sf rather than ++ DW_CFA_GNU_negative_offset_extended. ++ * src/powerpc/sysv.S (ffi_call_SYSV): Likewise. ++ ++2005-07-22 SUGIOKA Toshinobu ++ ++ * src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly ++ on sh3. ++ (ffi_closure_SYSV): Change the stack layout for sh3 struct argument. ++ * src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is ++ partially on register. ++ (ffi_closure_helper_SYSV): Likewise. ++ (ffi_prep_cif_machdep): Don't set too many cif->flags. ++ ++2005-07-20 Kaz Kojima ++ ++ * src/sh/ffi.c (ffi_call): Handle small structures correctly. ++ Remove empty line. ++ * src/sh64/ffi.c (simple_type): Remove. ++ (return_type): Handle small structures correctly. ++ (ffi_prep_args): Likewise. ++ (ffi_call): Likewise. ++ (ffi_closure_helper_SYSV): Likewise. ++ * src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return. ++ Emit position independent code if PIC and remove wrong datalabel ++ prefixes from EH data. ++ ++2005-07-19 Andreas Tobler ++ ++ * Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD. ++ * Makefile.in: Regenerate. ++ * include/Makefile.in: Likewise. ++ * testsuite/Makefile.in: Likewise. ++ * configure.ac: Add POWERPC_FREEBSD rules. ++ * configure: Regenerate. ++ * src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules. ++ (FFI_SYSV_TYPE_SMALL_STRUCT): Define. ++ * src/powerpc/ffi.c: Add flags to handle small structure returns ++ in ffi_call_SYSV. ++ (ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI. ++ Aka FFI_SYSV. ++ (ffi_closure_helper_SYSV): Likewise. ++ * src/powerpc/ppc_closure.S: Add return types for small structures. ++ * src/powerpc/sysv.S: Add bits to handle small structures for ++ final SYSV 4 ABI. ++ ++2005-07-10 Andreas Tobler ++ ++ * testsuite/libffi.call/cls_5_1_byte.c: New test file. ++ * testsuite/libffi.call/cls_6_1_byte.c: Likewise. ++ * testsuite/libffi.call/cls_7_1_byte.c: Likewise. ++ ++2005-07-05 Randolph Chung ++ ++ * src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1 ++ as FFI_TYPE_SMALL_STRUCT3. Break out handling for 5-7 byte ++ structures. Kill compilation warnings. ++ (ffi_closure_inner_LINUX): Print return values as hex in debug ++ message. Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. ++ Properly handle 5-7 byte structure returns. ++ * src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1) ++ (FFI_TYPE_SMALL_STRUCT2): Remove. ++ (FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5) ++ (FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define. ++ * src/pa/linux.S: Mark source file as using PA1.1 assembly. ++ (checksmst1, checksmst2): Remove. ++ (checksmst3): Optimize handling of 3-byte struct returns. ++ (checksmst567): Properly handle 5-7 byte struct returns. ++ ++2005-06-15 Rainer Orth ++ ++ PR libgcj/21943 ++ * src/mips/n32.S: Enforce PIC code. ++ * src/mips/o32.S: Likewise. ++ ++2005-06-15 Rainer Orth ++ ++ * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64. ++ * configure: Regenerate. ++ ++2005-06-01 Alan Modra ++ ++ * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET ++ to call ffi_closure_helper_SYSV. Append @local instead. ++ * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV. ++ ++2005-05-17 Kelley Cook ++ ++ * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. ++ Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. ++ * Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config. ++ * aclocal.m4, configure, fficonfig.h.in, Makefile.in, ++ include/Makefile.in, testsuite/Makefile.in: Regenerate. ++ ++2005-05-09 Mike Stump ++ ++ * configure: Regenerate. ++ ++2005-05-08 Richard Henderson ++ ++ PR libffi/21285 ++ * src/alpha/osf.S: Update unwind into to match code. ++ ++2005-05-04 Andreas Degert ++ Richard Henderson ++ ++ * src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in ++ bit 11 of flags. ++ (ffi_call): Mask return type field. Pass ssecount to ffi_call_unix64. ++ (ffi_prep_closure): Set carry bit if sse-used flag set. ++ * src/x86/unix64.S (ffi_call_unix64): Add ssecount argument. ++ Only load sse registers if ssecount non-zero. ++ (ffi_closure_unix64): Only save sse registers if carry set on entry. ++ ++2005-04-29 Ralf Corsepius ++ ++ * configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*, ++ powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*. ++ * configure: Regenerate. ++ ++2005-04-20 Hans-Peter Nilsson ++ ++ * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use, ++ have Tcl8.3-compatible intermediate variable. ++ ++2005-04-18 Simon Posnjak ++ Hans-Peter Nilsson ++ ++ * Makefile.am: Add CRIS support. ++ * configure.ac: Likewise. ++ * Makefile.in, configure, testsuite/Makefile.in, ++ include/Makefile.in: Regenerate. ++ * src/cris: New directory. ++ * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files. ++ * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__. ++ ++ * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with ++ \r?\n in output tests. ++ ++2005-04-12 Mike Stump ++ ++ * configure: Regenerate. ++ ++2005-03-30 Hans Boehm ++ ++ * src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI. ++ ++2005-03-30 Steve Ellcey ++ ++ * src/ia64/ffitarget.h (ffi_arg) ADD DI attribute. ++ (ffi_sarg) Ditto. ++ * src/ia64/unix.S (ffi_closure_unix): Extend gp ++ to 64 bits in ILP32 mode. ++ Load 64 bits even for short data. ++ ++2005-03-23 Mike Stump ++ ++ * src/powerpc/darwin.S: Update for -m64 multilib. ++ * src/powerpc/darwin_closure.S: Likewise. ++ ++2005-03-21 Zack Weinberg ++ ++ * configure.ac: Do not invoke TL_AC_GCC_VERSION. ++ Do not set tool_include_dir. ++ * aclocal.m4, configure, Makefile.in, testsuite/Makefile.in: ++ Regenerate. ++ * include/Makefile.am: Set gcc_version and toollibffidir. ++ * include/Makefile.in: Regenerate. ++ ++2005-02-22 Andrew Haley ++ ++ * src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to ++ odd-numbered register pairs for 64-bit integer types. ++ ++2005-02-23 Andreas Tobler ++ ++ PR libffi/20104 ++ * testsuite/libffi.call/return_ll1.c: New test case. ++ ++2005-02-11 Janis Johnson ++ ++ * testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options. ++ * testsuite/libffi.call/float.c: Ditto. ++ * testsuite/libffi.call/float2.c: Ditto. ++ * testsuite/libffi.call/float3.c: Ditto. ++ ++2005-02-08 Andreas Tobler ++ ++ * src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv. ++ ++2005-01-12 Eric Botcazou ++ ++ * testsuite/libffi.special/special.exp (cxx_options): Add ++ -shared-libgcc. ++ ++2004-12-31 Richard Henderson ++ ++ * src/types.c (FFI_AGGREGATE_TYPEDEF): Remove. ++ (FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF. Replace size and ++ offset parameters with a type parameter; deduce size and structure ++ alignment. Update all users. ++ ++2004-12-31 Richard Henderson ++ ++ * src/types.c (FFI_TYPE_POINTER): Define with sizeof. ++ (FFI_TYPE_LONGDOUBLE): Fix for ia64. ++ * src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move ++ into ffi_prep_closure. ++ * src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite ++ from scratch. ++ ++2004-12-27 Richard Henderson ++ ++ * src/x86/unix64.S: Fix typo in unwind info. ++ ++2004-12-25 Richard Henderson ++ ++ * src/x86/ffi64.c (struct register_args): Rename from stackLayout. ++ (enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS. ++ (merge_classes): Check for it. ++ (SSE_CLASS_P): New. ++ (classify_argument): Pass byte_offset by value; perform all updates ++ inside struct case. ++ (examine_argument): Add classes argument; handle ++ X86_64_COMPLEX_X87_CLASS. ++ (ffi_prep_args): Merge into ... ++ (ffi_call): ... here. Share stack frame with ffi_call_unix64. ++ (ffi_prep_cif_machdep): Setup cif->flags for proper structure return. ++ (ffi_fill_return_value): Remove. ++ (ffi_prep_closure): Remove dead assert. ++ (ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner. ++ Rewrite to use struct register_args instead of va_list. Create ++ flags for handling structure returns. ++ * src/x86/unix64.S: Remove dead strings. ++ (ffi_call_unix64): Rename from ffi_call_UNIX64. Rewrite to share ++ stack frame with ffi_call. Handle structure returns properly. ++ (float2sse, floatfloat2sse, double2sse): Remove. ++ (sse2float, sse2double, sse2floatfloat): Remove. ++ (ffi_closure_unix64): Rename from ffi_closure_UNIX64. Rewrite ++ to handle structure returns properly. ++ ++2004-12-08 David Edelsohn ++ ++ * Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and ++ PICFLAG. ++ * Makefile.in: Regenerated. ++ ++2004-12-02 Richard Sandiford ++ ++ * configure.ac: Use TL_AC_GCC_VERSION to set gcc_version. ++ * configure, aclocal.m4, Makefile.in: Regenerate. ++ * include/Makefile.in, testsuite/Makefile.in: Regenerate. ++ ++2004-11-29 Kelley Cook ++ ++ * configure: Regenerate for libtool change. ++ ++2004-11-25 Kelley Cook ++ ++ * configure: Regenerate for libtool reversion. ++ ++2004-11-24 Kelley Cook ++ ++ * configure: Regenerate for libtool change. ++ ++2004-11-23 John David Anglin ++ ++ * testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp. ++ ++2004-11-23 Richard Sandiford ++ ++ * src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead ++ of jal. Use an absolute encoding for the frame information. ++ ++2004-11-23 Kelley Cook ++ ++ * Makefile.am: Remove no-dependencies. Add ACLOCAL_AMFLAGS. ++ * acinclude.m4: Delete logic for sincludes. ++ * aclocal.m4, Makefile.in, configure: Regenerate. ++ * include/Makefile: Likewise. ++ * testsuite/Makefile: Likewise. ++ ++2004-11-22 Eric Botcazou ++ ++ * src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers ++ on a 8-byte boundary. ++ * src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments. ++ ++2004-10-27 Richard Earnshaw ++ ++ * src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return ++ long long values. Round stack allocation to a multiple of 8 bytes ++ for ATPCS compatibility. ++ * src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register ++ names. Handle returning long long types. Add Thumb and interworking ++ support. Improve soft-float code. ++ ++2004-10-27 Richard Earnshaw ++ ++ * testsuite/lib/libffi-db.exp (load_gcc_lib): New function. ++ (libffi_exit): New function. ++ (libffi_init): Build the testglue wrapper if needed. ++ ++2004-10-25 Eric Botcazou ++ ++ PR other/18138 ++ * testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc. ++ ++2004-10-25 Kazuhiro Inaoka ++ ++ * src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0. ++ ++2004-10-20 Kaz Kojima ++ ++ * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data. ++ * testsuite/libffi.call/float3.c: New test case. ++ ++2004-10-18 Kaz Kojima ++ ++ * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for ++ the function returning a structure pointed with R2. ++ * src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to ++ the structure return value if T bit set. Emit position ++ independent code and EH data if PIC. ++ ++2004-10-13 Kazuhiro Inaoka ++ ++ * Makefile.am: Add m32r support. ++ * configure.ac: Likewise. ++ * Makefile.in: Regenerate. ++ * confiugre: Regenerate. ++ * src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF ++ (uint64, sint64, double, longdouble) ++ * src/m32r: New directory. ++ * src/m32r/ffi.c: New file. ++ * src/m32r/sysv.S: Likewise. ++ * src/m32r/ffitarget.h: Likewise. ++ ++2004-10-02 Kaz Kojima ++ ++ * testsuite/libffi.call/negint.c: New test case. ++ ++2004-09-14 H.J. Lu ++ ++ PR libgcj/17465 ++ * testsuite/lib/libffi-dg.exp: Don't use global ld_library_path. ++ Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, ++ LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and ++ DYLD_LIBRARY_PATH. ++ ++2004-09-05 Andreas Tobler ++ ++ * testsuite/libffi.call/many_win32.c: Remove whitespaces. ++ * testsuite/libffi.call/promotion.c: Likewise. ++ * testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup ++ whitespaces. ++ * testsuite/libffi.call/return_sc.c: Likewise. ++ * testsuite/libffi.call/return_uc.c: Likewise. ++ ++2004-09-05 Andreas Tobler ++ ++ * src/powerpc/darwin.S: Fix comments and identation. ++ * src/powerpc/darwin_closure.S: Likewise. ++ ++2004-09-02 Andreas Tobler ++ ++ * src/powerpc/ffi_darwin.c: Add flag for longdouble return values. ++ (ffi_prep_args): Handle longdouble arguments. ++ (ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for ++ longdouble. ++ (ffi_closure_helper_DARWIN): Add closure handling for longdouble. ++ * src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble ++ values. ++ * src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise. ++ * src/types.c: Defined longdouble size and alignment for darwin. ++ ++2004-09-02 Andreas Tobler ++ ++ * src/powerpc/aix.S: Remove whitespaces. ++ * src/powerpc/aix_closure.S: Likewise. ++ * src/powerpc/asm.h: Likewise. ++ * src/powerpc/ffi.c: Likewise. ++ * src/powerpc/ffitarget.h: Likewise. ++ * src/powerpc/linux64.S: Likewise. ++ * src/powerpc/linux64_closure.S: Likewise. ++ * src/powerpc/ppc_closure.S: Likewise. ++ * src/powerpc/sysv.S: Likewise. ++ ++2004-08-30 Anthony Green ++ ++ * Makefile.am: Add frv support. ++ * Makefile.in, testsuite/Makefile.in: Rebuilt. ++ * configure.ac: Read configure.host. ++ * configure.in: Read configure.host. ++ * configure.host: New file. frv-elf needs libgloss. ++ * include/ffi.h.in: Force ffi_closure to have a nice big (8) ++ alignment. This is needed to frv and shouldn't harm the others. ++ * include/ffi_common.h (ALIGN_DOWN): New macro. ++ * src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files. ++ ++2004-08-24 David Daney ++ ++ * testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*. ++ * testsuite/libffi.call/closure_fn1.c: Likewise. ++ * testsuite/libffi.call/closure_fn2.c Likewise. ++ * testsuite/libffi.call/closure_fn3.c: Likewise. ++ * testsuite/libffi.call/closure_fn4.c: Likewise. ++ * testsuite/libffi.call/closure_fn5.c: Likewise. ++ * testsuite/libffi.call/cls_18byte.c: Likewise. ++ * testsuite/libffi.call/cls_19byte.c: Likewise. ++ * testsuite/libffi.call/cls_1_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte1.c: Likewise. ++ * testsuite/libffi.call/cls_24byte.c: Likewise. ++ * testsuite/libffi.call/cls_2byte.c: Likewise. ++ * testsuite/libffi.call/cls_3_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_3byte1.c: Likewise. ++ * testsuite/libffi.call/cls_3byte2.c: Likewise. ++ * testsuite/libffi.call/cls_4_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_4byte.c: Likewise. ++ * testsuite/libffi.call/cls_64byte.c: Likewise. ++ * testsuite/libffi.call/cls_6byte.c: Likewise. ++ * testsuite/libffi.call/cls_7byte.c: Likewise. ++ * testsuite/libffi.call/cls_8byte.c: Likewise. ++ * testsuite/libffi.call/cls_9byte1.c: Likewise. ++ * testsuite/libffi.call/cls_9byte2.c: Likewise. ++ * testsuite/libffi.call/cls_align_double.c: Likewise. ++ * testsuite/libffi.call/cls_align_float.c: Likewise. ++ * testsuite/libffi.call/cls_align_longdouble.c: Likewise. ++ * testsuite/libffi.call/cls_align_pointer.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint16.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint32.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint64.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint16.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint32.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint64.c: Likewise. ++ * testsuite/libffi.call/cls_double.c: Likewise. ++ * testsuite/libffi.call/cls_float.c: Likewise. ++ * testsuite/libffi.call/cls_multi_schar.c: Likewise. ++ * testsuite/libffi.call/cls_multi_sshort.c: Likewise. ++ * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. ++ * testsuite/libffi.call/cls_multi_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_multi_ushort.c: Likewise. ++ * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. ++ * testsuite/libffi.call/cls_schar.c: Likewise. ++ * testsuite/libffi.call/cls_sint.c: Likewise. ++ * testsuite/libffi.call/cls_sshort.c: Likewise. ++ * testsuite/libffi.call/cls_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_uint.c: Likewise. ++ * testsuite/libffi.call/cls_ulonglong.c: Likewise. ++ * testsuite/libffi.call/cls_ushort.c: Likewise. ++ * testsuite/libffi.call/nested_struct.c: Likewise. ++ * testsuite/libffi.call/nested_struct1.c: Likewise. ++ * testsuite/libffi.call/nested_struct2.c: Likewise. ++ * testsuite/libffi.call/nested_struct3.c: Likewise. ++ * testsuite/libffi.call/problem1.c: Likewise. ++ * testsuite/libffi.special/unwindtest.cc: Likewise. ++ * testsuite/libffi.call/cls_12byte.c: Likewise and set return value ++ to zero. ++ * testsuite/libffi.call/cls_16byte.c: Likewise. ++ * testsuite/libffi.call/cls_5byte.c: Likewise. ++ ++2004-08-23 David Daney ++ ++ PR libgcj/13141 ++ * src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI. ++ * src/mips/ffi.c (ffi_prep_args): Fix alignment calculation. ++ (ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point ++ parameters and return types. ++ (ffi_call): Handle FFI_O32_SOFT_FLOAT ABI. ++ (ffi_prep_closure): Ditto. ++ (ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix ++ alignment calculations. ++ * src/mips/o32.S (ffi_closure_O32): Don't use floating point ++ instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant. ++ ++2004-08-14 Casey Marshall ++ ++ * src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to ++ contain `FFI_TYPE_UINT64' as return type for any 64-bit ++ integer (O32 ABI only). ++ (ffi_prep_closure): new function. ++ (ffi_closure_mips_inner_O32): new function. ++ * src/mips/ffitarget.h: Define `FFI_CLOSURES' and ++ `FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32. ++ * src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return ++ 64 bit integers correctly. ++ (ffi_closure_O32): new function. ++ Added DWARF-2 unwind info for both functions. ++ ++2004-08-10 Andrew Haley ++ ++ * src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments. ++ ++2004-08-01 Robert Millan ++ ++ * configure.ac: Detect knetbsd-gnu and kfreebsd-gnu. ++ * configure: Regenerate. ++ ++2004-07-30 Maciej W. Rozycki ++ ++ * acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for ++ and mmap() explicitly instead of relying on preset autoconf cache ++ variables. ++ * aclocal.m4: Regenerate. ++ * configure: Regenerate. ++ ++2004-07-11 Ulrich Weigand ++ ++ * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. ++ (ffi_check_float_struct): Remove unused prototype. ++ ++2004-06-30 Geoffrey Keating ++ ++ * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment ++ character on Darwin, use '\n\t' instead. ++ ++2004-06-26 Matthias Klose ++ ++ * libtool-version: Fix typo in revision/age. ++ ++2004-06-17 Matthias Klose ++ ++ * libtool-version: New. ++ * Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname. ++ * Makefile.in: Regenerate. ++ ++2004-06-15 Paolo Bonzini ++ ++ * Makefile.am: Remove useless multilib rules. ++ * Makefile.in: Regenerate. ++ * aclocal.m4: Regenerate with automake 1.8.5. ++ * configure.ac: Remove useless multilib configury. ++ * configure: Regenerate. ++ ++2004-06-15 Paolo Bonzini ++ ++ * .cvsignore: New file. ++ ++2004-06-10 Jakub Jelinek ++ ++ * src/ia64/unix.S (ffi_call_unix): Insert group barrier break ++ fp_done. ++ (ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever ++ changed from 8. ++ ++2004-06-06 Sean McNeil ++ ++ * configure.ac: Add x86_64-*-freebsd* support. ++ * configure: Regenerate. ++ ++2004-04-26 Joe Buck ++ ++ Bug 15093 ++ * configure.ac: Test for existence of mmap and sys/mman.h before ++ checking blacklist. Fix suggested by Jim Wilson. ++ * configure: Regenerate. ++ ++2004-04-26 Matt Austern ++ ++ * src/powerpc/darwin.S: Go through a non-lazy pointer for initial ++ FDE location. ++ * src/powerpc/darwin_closure.S: Likewise. ++ ++2004-04-24 Andreas Tobler ++ ++ * testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization ++ error. Reported by Thomas Heller . ++ * testsuite/libffi.call/cls_multi_sshort.c (main): Likewise. ++ * testsuite/libffi.call/cls_multi_ushort.c (main): Likewise. ++ ++2004-03-20 Matthias Klose ++ ++ * src/pa/linux.S: Fix typo. ++ ++2004-03-19 Matthias Klose ++ ++ * Makefile.am: Update. ++ * Makefile.in: Regenerate. ++ * src/pa/ffi.h.in: Remove. ++ * src/pa/ffitarget.h: New file. ++ ++2004-02-10 Randolph Chung ++ ++ * Makefile.am: Add PA support. ++ * Makefile.in: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * configure.ac: Add PA target. ++ * configure: Regenerate. ++ * src/pa/ffi.c: New file. ++ * src/pa/ffi.h.in: Add PA support. ++ * src/pa/linux.S: New file. ++ * prep_cif.c: Add PA support. ++ ++2004-03-16 Hosaka Yuji ++ ++ * src/types.c: Fix alignment size of X86_WIN32 case int64 and ++ double. ++ * src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type ++ with ecif->cif->flags. ++ (ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type ++ with cif->flags. ++ (ffi_prep_cif_machdep): Add X86_WIN32 struct case. ++ (ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32. ++ * src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b, ++ sc_retstruct2b): Add for 1 or 2-bytes struct case. ++ ++2004-03-15 Kelley Cook ++ ++ * configure.in: Rename file to ... ++ * configure.ac: ... this. ++ * fficonfig.h.in: Regenerate. ++ * Makefile.in: Regenerate. ++ * include/Makefile.in: Regenerate. ++ * testsuite/Makefile.in: Regenerate. ++ ++2004-03-12 Matt Austern ++ ++ * src/powerpc/darwin.S: Fix EH information so it corresponds to ++ changes in EH format resulting from addition of linkonce support. ++ * src/powerpc/darwin_closure.S: Likewise. ++ ++2004-03-11 Andreas Tobler ++ Paolo Bonzini ++ ++ * Makefile.am (AUTOMAKE_OPTIONS): Set them. ++ Remove VPATH. Remove rules for object files. Remove multilib support. ++ (AM_CCASFLAGS): Add. ++ * configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER. ++ (AC_PREREQ): Bump version to 2.59. ++ (AC_INIT): Fill with version info and bug address. ++ (ORIGINAL_LD_FOR_MULTILIBS): Remove. ++ (AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE. ++ De-precious CC so that the right flags are passed down to multilibs. ++ (AC_MSG_ERROR): Replace obsolete macro AC_ERROR. ++ (AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES. ++ (AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS. ++ * configure: Rebuilt. ++ * aclocal.m4: Likewise. ++ * Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise. ++ * fficonfig.h.in: Likewise. ++ ++2004-03-11 Andreas Schwab ++ ++ * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point ++ arguments from fp registers only for the first 8 parameter slots. ++ Don't convert a float parameter when passed in memory. ++ ++2004-03-09 Hans-Peter Nilsson ++ ++ * configure: Regenerate for config/accross.m4 correction. ++ ++2004-02-25 Matt Kraai ++ ++ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Change ++ ecif->cif->bytes to bytes. ++ (ffi_prep_cif_machdep): Add braces around nested if statement. ++ ++2004-02-09 Alan Modra ++ ++ * src/types.c (pointer): POWERPC64 has 8 byte pointers. ++ ++ * src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling. ++ (ffi_closure_helper_LINUX64): Fix typo. ++ * testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128 ++ for powerpc64-*-*. ++ * testsuite/libffi.call/float.c: Likewise. ++ * testsuite/libffi.call/float2.c: Likewise. ++ ++2004-02-08 Alan Modra ++ ++ * src/powerpc/ffi.c (ffi_prep_cif_machdep ): Correct ++ long double function return and long double arg handling. ++ (ffi_closure_helper_LINUX64): Formatting. Delete unused "ng" var. ++ Use "end_pfr" instead of "nf". Correct long double handling. ++ Localise "temp". ++ * src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double ++ return value. ++ * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate ++ space for long double return value. Adjust stack frame and offsets. ++ Load f2 long double return. ++ ++2004-02-07 Alan Modra ++ ++ * src/types.c: Use 16 byte long double for POWERPC64. ++ ++2004-01-25 Eric Botcazou ++ ++ * src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array ++ when the structure return address is passed in %o0. ++ (ffi_V9_return_struct): Rename into ffi_v9_layout_struct. ++ (ffi_v9_layout_struct): Align the field following a nested structure ++ on a word boundary. Use memmove instead of memcpy. ++ (ffi_call): Update call to ffi_V9_return_struct. ++ (ffi_prep_closure): Define 'ctx' only for V8. ++ (ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8 ++ and ffi_closure_sparc_inner_v9. ++ (ffi_closure_sparc_inner_v8): Return long doubles by reference. ++ Always skip the structure return address. For structures and long ++ doubles, copy the argument directly. ++ (ffi_closure_sparc_inner_v9): Skip the structure return address only ++ if required. Shift the maximum floating-point slot accordingly. For ++ big structures, copy the argument directly; otherwise, left-justify the ++ argument and call ffi_v9_layout_struct to lay out the structure on ++ the stack. ++ * src/sparc/v8.S: Undef STACKFRAME before defining it. ++ (ffi_closure_v8): Pass the structure return address. Update call to ++ ffi_closure_sparc_inner_v8. Short-circuit FFI_TYPE_INT handling. ++ Skip the 'unimp' insn when returning long doubles and structures. ++ * src/sparc/v9.S: Undef STACKFRAME before defining it. ++ (ffi_closure_v9): Increase the frame size by 2 words. Short-circuit ++ FFI_TYPE_INT handling. Load structures both in integers and ++ floating-point registers on return. ++ * README: Update status of the SPARC port. ++ ++2004-01-24 Andreas Tobler ++ ++ * testsuite/libffi.call/pyobjc-tc.c (main): Treat result value ++ as of type ffi_arg. ++ * testsuite/libffi.call/struct3.c (main): Fix CHECK. ++ ++2004-01-22 Ulrich Weigand ++ ++ * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result ++ value as of type ffi_arg, not unsigned int. ++ ++2004-01-21 Michael Ritzert ++ ++ * ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead ++ of the LHS. ++ ++2004-01-12 Andreas Tobler ++ ++ * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for ++ Solaris. ++ ++2004-01-08 Rainer Orth ++ ++ * testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED ++ to void *. ++ ++2003-12-10 Richard Henderson ++ ++ * testsuite/libffi.call/cls_align_pointer.c: Cast pointers to ++ size_t instead of int. ++ ++2003-12-04 Hosaka Yuji ++ ++ * testsuite/libffi.call/many_win32.c: Include . ++ * testsuite/libffi.call/many_win32.c (main): Replace variable ++ int i with unsigned long ul. ++ ++ * testsuite/libffi.call/cls_align_uint64.c: New test case. ++ * testsuite/libffi.call/cls_align_sint64.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint32.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint32.c: Likewise. ++ * testsuite/libffi.call/cls_align_uint16.c: Likewise. ++ * testsuite/libffi.call/cls_align_sint16.c: Likewise. ++ * testsuite/libffi.call/cls_align_float.c: Likewise. ++ * testsuite/libffi.call/cls_align_double.c: Likewise. ++ * testsuite/libffi.call/cls_align_longdouble.c: Likewise. ++ * testsuite/libffi.call/cls_align_pointer.c: Likewise. ++ ++2003-12-02 Hosaka Yuji ++ ++ PR other/13221 ++ * src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): ++ Align arguments to 32 bits. ++ ++2003-12-01 Andreas Tobler ++ ++ PR other/13221 ++ * testsuite/libffi.call/cls_multi_sshort.c: New test case. ++ * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. ++ * testsuite/libffi.call/cls_multi_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_multi_schar.c: Likewise. ++ * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. ++ * testsuite/libffi.call/cls_multi_ushort.c: Likewise. ++ ++ * testsuite/libffi.special/unwindtest.cc: Cosmetics. ++ ++2003-11-26 Kaveh R. Ghazi ++ ++ * testsuite/libffi.call/ffitest.h: Include . ++ * testsuite/libffi.special/ffitestcxx.h: Likewise. ++ ++2003-11-22 Andreas Tobler ++ ++ * Makefile.in: Rebuilt. ++ * configure: Likewise. ++ * testsuite/libffi.special/unwindtest.cc: Convert the mmap to ++ the right type. ++ ++2003-11-21 Andreas Jaeger ++ Andreas Tobler ++ ++ * acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST. ++ * configure.in: Call AC_FUNC_MMAP_BLACKLIST. ++ * Makefile.in: Rebuilt. ++ * aclocal.m4: Likewise. ++ * configure: Likewise. ++ * fficonfig.h.in: Likewise. ++ * testsuite/lib/libffi-dg.exp: Add include dir. ++ * testsuite/libffi.call/ffitest.h: Add MMAP definitions. ++ * testsuite/libffi.special/ffitestcxx.h: Likewise. ++ * testsuite/libffi.call/closure_fn0.c: Use MMAP functionality ++ for ffi_closure if available. ++ * testsuite/libffi.call/closure_fn1.c: Likewise. ++ * testsuite/libffi.call/closure_fn2.c: Likewise. ++ * testsuite/libffi.call/closure_fn3.c: Likewise. ++ * testsuite/libffi.call/closure_fn4.c: Likewise. ++ * testsuite/libffi.call/closure_fn5.c: Likewise. ++ * testsuite/libffi.call/cls_12byte.c: Likewise. ++ * testsuite/libffi.call/cls_16byte.c: Likewise. ++ * testsuite/libffi.call/cls_18byte.c: Likewise. ++ * testsuite/libffi.call/cls_19byte.c: Likewise. ++ * testsuite/libffi.call/cls_1_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte1.c: Likewise. ++ * testsuite/libffi.call/cls_24byte.c: Likewise. ++ * testsuite/libffi.call/cls_2byte.c: Likewise. ++ * testsuite/libffi.call/cls_3_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_3byte1.c: Likewise. ++ * testsuite/libffi.call/cls_3byte2.c: Likewise. ++ * testsuite/libffi.call/cls_4_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_4byte.c: Likewise. ++ * testsuite/libffi.call/cls_5byte.c: Likewise. ++ * testsuite/libffi.call/cls_64byte.c: Likewise. ++ * testsuite/libffi.call/cls_6byte.c: Likewise. ++ * testsuite/libffi.call/cls_7byte.c: Likewise. ++ * testsuite/libffi.call/cls_8byte.c: Likewise. ++ * testsuite/libffi.call/cls_9byte1.c: Likewise. ++ * testsuite/libffi.call/cls_9byte2.c: Likewise. ++ * testsuite/libffi.call/cls_double.c: Likewise. ++ * testsuite/libffi.call/cls_float.c: Likewise. ++ * testsuite/libffi.call/cls_schar.c: Likewise. ++ * testsuite/libffi.call/cls_sint.c: Likewise. ++ * testsuite/libffi.call/cls_sshort.c: Likewise. ++ * testsuite/libffi.call/cls_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_uint.c: Likewise. ++ * testsuite/libffi.call/cls_ulonglong.c: Likewise. ++ * testsuite/libffi.call/cls_ushort.c: Likewise. ++ * testsuite/libffi.call/nested_struct.c: Likewise. ++ * testsuite/libffi.call/nested_struct1.c: Likewise. ++ * testsuite/libffi.call/nested_struct2.c: Likewise. ++ * testsuite/libffi.call/nested_struct3.c: Likewise. ++ * testsuite/libffi.call/problem1.c: Likewise. ++ * testsuite/libffi.special/unwindtest.cc: Likewise. ++ ++2003-11-20 Andreas Tobler ++ ++ * testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional. ++ ++2003-11-19 Andreas Tobler ++ ++ * testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin. ++ Add -lgcc_s to additional flags. ++ ++2003-11-12 Andreas Tobler ++ ++ * configure.in, include/Makefile.am: PR libgcj/11147, install ++ the ffitarget.h header file in a gcc versioned and target ++ dependent place. ++ * configure: Regenerated. ++ * Makefile.in, include/Makefile.in: Likewise. ++ * testsuite/Makefile.in: Likewise. ++ ++2003-11-09 Andreas Tobler ++ ++ * testsuite/libffi.call/closure_fn0.c: Print result and check ++ with dg-output to make debugging easier. ++ * testsuite/libffi.call/closure_fn1.c: Likewise. ++ * testsuite/libffi.call/closure_fn2.c: Likewise. ++ * testsuite/libffi.call/closure_fn3.c: Likewise. ++ * testsuite/libffi.call/closure_fn4.c: Likewise. ++ * testsuite/libffi.call/closure_fn5.c: Likewise. ++ * testsuite/libffi.call/cls_12byte.c: Likewise. ++ * testsuite/libffi.call/cls_16byte.c: Likewise. ++ * testsuite/libffi.call/cls_18byte.c: Likewise. ++ * testsuite/libffi.call/cls_19byte.c: Likewise. ++ * testsuite/libffi.call/cls_1_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte1.c: Likewise. ++ * testsuite/libffi.call/cls_24byte.c: Likewise. ++ * testsuite/libffi.call/cls_2byte.c: Likewise. ++ * testsuite/libffi.call/cls_3_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_3byte1.c: Likewise. ++ * testsuite/libffi.call/cls_3byte2.c: Likewise. ++ * testsuite/libffi.call/cls_4_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_4byte.c: Likewise. ++ * testsuite/libffi.call/cls_5byte.c: Likewise. ++ * testsuite/libffi.call/cls_64byte.c: Likewise. ++ * testsuite/libffi.call/cls_6byte.c: Likewise. ++ * testsuite/libffi.call/cls_7byte.c: Likewise. ++ * testsuite/libffi.call/cls_8byte.c: Likewise. ++ * testsuite/libffi.call/cls_9byte1.c: Likewise. ++ * testsuite/libffi.call/cls_9byte2.c: Likewise. ++ * testsuite/libffi.call/cls_double.c: Likewise. ++ * testsuite/libffi.call/cls_float.c: Likewise. ++ * testsuite/libffi.call/cls_schar.c: Likewise. ++ * testsuite/libffi.call/cls_sint.c: Likewise. ++ * testsuite/libffi.call/cls_sshort.c: Likewise. ++ * testsuite/libffi.call/cls_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_uint.c: Likewise. ++ * testsuite/libffi.call/cls_ulonglong.c: Likewise. ++ * testsuite/libffi.call/cls_ushort.c: Likewise. ++ * testsuite/libffi.call/problem1.c: Likewise. ++ ++ * testsuite/libffi.special/unwindtest.cc: Make ffi_closure ++ static. ++ ++2003-11-08 Andreas Tobler ++ ++ * testsuite/libffi.call/cls_9byte2.c: New test case. ++ * testsuite/libffi.call/cls_9byte1.c: Likewise. ++ * testsuite/libffi.call/cls_64byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte1.c: Likewise. ++ * testsuite/libffi.call/cls_19byte.c: Likewise. ++ * testsuite/libffi.call/cls_18byte.c: Likewise. ++ * testsuite/libffi.call/closure_fn4.c: Likewise. ++ * testsuite/libffi.call/closure_fn5.c: Likewise. ++ * testsuite/libffi.call/cls_schar.c: Likewise. ++ * testsuite/libffi.call/cls_sint.c: Likewise. ++ * testsuite/libffi.call/cls_sshort.c: Likewise. ++ * testsuite/libffi.call/nested_struct2.c: Likewise. ++ * testsuite/libffi.call/nested_struct3.c: Likewise. ++ ++2003-11-08 Andreas Tobler ++ ++ * testsuite/libffi.call/cls_double.c: Do a check on the result. ++ * testsuite/libffi.call/cls_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_uint.c: Likewise. ++ * testsuite/libffi.call/cls_ulonglong.c: Likewise. ++ * testsuite/libffi.call/cls_ushort.c: Likewise. ++ * testsuite/libffi.call/return_sc.c: Cleanup whitespaces. ++ ++2003-11-06 Andreas Tobler ++ ++ * src/prep_cif.c (ffi_prep_cif): Move the validity check after ++ the initialization. ++ ++2003-10-23 Andreas Tobler ++ ++ * src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace ++ FFI_ASSERT(FALSE) with FFI_ASSERT(0). ++ ++2003-10-22 David Daney ++ ++ * src/mips/ffitarget.h: Replace undefined UINT32 and friends with ++ __attribute__((__mode__(__SI__))) and friends. ++ ++2003-10-22 Andreas Schwab ++ ++ * src/ia64/ffi.c: Replace FALSE/TRUE with false/true. ++ ++2003-10-21 Andreas Tobler ++ ++ * configure.in: AC_LINK_FILES(ffitarget.h). ++ * configure: Regenerate. ++ * Makefile.in: Likewise. ++ * include/Makefile.in: Likewise. ++ * testsuite/Makefile.in: Likewise. ++ * fficonfig.h.in: Likewise. ++ ++2003-10-21 Paolo Bonzini ++ Richard Henderson ++ ++ Avoid that ffi.h includes fficonfig.h. ++ ++ * Makefile.am (EXTRA_DIST): Include ffitarget.h files ++ (TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. ++ (TARGET_SRC_MIPS_SGI): Removed. ++ (MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. ++ (MIPS_SGI): Removed. ++ (CLEANFILES): Removed. ++ (mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New ++ targets. ++ * acconfig.h: Removed. ++ * configure.in: Compute sizeofs only for double and long double. ++ Use them to define and subst HAVE_LONG_DOUBLE. Include comments ++ into AC_DEFINE instead of using acconfig.h. Create ++ include/ffitarget.h instead of include/fficonfig.h. Rename ++ MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree. ++ AC_DEFINE EH_FRAME_FLAGS. ++ * include/Makefile.am (DISTCLEANFILES): New automake macro. ++ (hack_DATA): Add ffitarget.h. ++ * include/ffi.h.in: Remove all system specific definitions. ++ Declare raw API even if it is not installed, why bother? ++ Use limits.h instead of SIZEOF_* to define ffi_type_*. Do ++ not define EH_FRAME_FLAGS, it is in fficonfig.h now. Include ++ ffitarget.h instead of fficonfig.h. Remove ALIGN macro. ++ (UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead. ++ * include/ffi_common.h (bool): Do not define. ++ (ffi_assert): Accept failed assertion. ++ (ffi_type_test): Return void and accept file/line. ++ (FFI_ASSERT): Pass stringized failed assertion. ++ (FFI_ASSERT_AT): New macro. ++ (FFI_ASSERT_VALID_TYPE): New macro. ++ (UINT8, SINT8, UINT16, SINT16, UINT32, SINT32, ++ UINT64, SINT64): Define here with gcc's __attribute__ macro ++ instead of in ffi.h ++ (FLOAT32, ALIGN): Define here instead of in ffi.h ++ * include/ffi-mips.h: Removed. Its content moved to ++ src/mips/ffitarget.h after separating assembly and C sections. ++ * src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c ++ src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c, ++ src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S, ++ src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c: ++ SIZEOF_ARG -> FFI_SIZEOF_ARG. ++ * src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+). ++ * src/debug.c (ffi_assert): Accept stringized failed assertion. ++ (ffi_type_test): Rewritten. ++ * src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call ++ FFI_ASSERT_VALID_TYPE. ++ * src/alpha/ffitarget.h, src/arm/ffitarget.h, ++ src/ia64/ffitarget.h, src/m68k/ffitarget.h, ++ src/mips/ffitarget.h, src/powerpc/ffitarget.h, ++ src/s390/ffitarget.h, src/sh/ffitarget.h, ++ src/sh64/ffitarget.h, src/sparc/ffitarget.h, ++ src/x86/ffitarget.h: New files. ++ * src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S, ++ src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S, ++ src/powerpc/aix.S, src/powerpc/darwin.S, ++ src/powerpc/ffi_darwin.c, src/powerpc/linux64.S, ++ src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S, ++ src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S, ++ src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S, ++ src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S: ++ include fficonfig.h ++ ++2003-10-20 Rainer Orth ++ ++ * src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external ++ _MIPS_SIM_NABI32, _MIPS_SIM_ABI32. ++ ++2003-10-19 Andreas Tobler ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again. ++ Used when FFI_DEBUG = 1. ++ ++2003-10-14 Alan Modra ++ ++ * src/types.c (double, longdouble): Default POWERPC64 to 8 byte size ++ and align. ++ ++2003-10-06 Rainer Orth ++ ++ * include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs, ++ FFI_MIPS_O32 for O32 ABI. ++ ++2003-10-01 Andreas Tobler ++ ++ * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for ++ SPARC64. Cleanup whitespaces. ++ ++2003-09-19 Andreas Tobler ++ ++ * testsuite/libffi.call/closure_fn0.c: Xfail mips, arm, ++ strongarm, xscale. Cleanup whitespaces. ++ * testsuite/libffi.call/closure_fn1.c: Likewise. ++ * testsuite/libffi.call/closure_fn2.c: Likewise. ++ * testsuite/libffi.call/closure_fn3.c: Likewise. ++ * testsuite/libffi.call/cls_12byte.c: Likewise. ++ * testsuite/libffi.call/cls_16byte.c: Likewise. ++ * testsuite/libffi.call/cls_1_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte.c: Likewise. ++ * testsuite/libffi.call/cls_24byte.c: Likewise. ++ * testsuite/libffi.call/cls_2byte.c: Likewise. ++ * testsuite/libffi.call/cls_3_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_3byte1.c: Likewise. ++ * testsuite/libffi.call/cls_3byte2.c: Likewise. ++ * testsuite/libffi.call/cls_4_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_4byte.c: Likewise. ++ * testsuite/libffi.call/cls_5byte.c: Likewise. ++ * testsuite/libffi.call/cls_6byte.c: Likewise. ++ * testsuite/libffi.call/cls_7byte.c: Likewise. ++ * testsuite/libffi.call/cls_8byte.c: Likewise. ++ * testsuite/libffi.call/cls_double.c: Likewise. ++ * testsuite/libffi.call/cls_float.c: Likewise. ++ * testsuite/libffi.call/cls_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_uint.c: Likewise. ++ * testsuite/libffi.call/cls_ulonglong.c: Likewise. ++ * testsuite/libffi.call/cls_ushort.c: Likewise. ++ * testsuite/libffi.call/nested_struct.c: Likewise. ++ * testsuite/libffi.call/nested_struct1.c: Likewise. ++ * testsuite/libffi.call/problem1.c: Likewise. ++ * testsuite/libffi.special/unwindtest.cc: Likewise. ++ * testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces. ++ ++2003-09-18 David Edelsohn ++ ++ * src/powerpc/aix.S: Cleanup whitespaces. ++ * src/powerpc/aix_closure.S: Likewise. ++ ++2003-09-18 Andreas Tobler ++ ++ * src/powerpc/darwin.S: Cleanup whitespaces, comment formatting. ++ * src/powerpc/darwin_closure.S: Likewise. ++ * src/powerpc/ffi_darwin.c: Likewise. ++ ++2003-09-18 Andreas Tobler ++ David Edelsohn ++ ++ * src/types.c (double): Add AIX and Darwin to the right TYPEDEF. ++ * src/powerpc/aix_closure.S: Remove the pointer to the outgoing ++ parameter stack. ++ * src/powerpc/darwin_closure.S: Likewise. ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures ++ according to the Darwin/AIX ABI. ++ (ffi_prep_cif_machdep): Likewise. ++ (ffi_closure_helper_DARWIN): Likewise. ++ Remove the outgoing parameter stack logic. Simplify the evaluation ++ of the different CASE types. ++ (ffi_prep_clousure): Avoid the casts on lvalues. Change the branch ++ statement in the trampoline code. ++ ++2003-09-18 Kaz Kojima ++ ++ * src/sh/ffi.c (ffi_prep_args): Take account into the alignement ++ for the register size. ++ (ffi_closure_helper_SYSV): Handle the structure return value ++ address correctly. ++ (ffi_closure_helper_SYSV): Return the appropriate type when ++ the registers are used for the structure return value. ++ * src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for ++ the 64-bit return value. Update copyright years. ++ ++2003-09-17 Rainer Orth ++ ++ * testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in ++ srcdir for ffi_mips.h. ++ ++2003-09-12 Alan Modra ++ ++ * src/prep_cif.c (initialize_aggregate): Include tail padding in ++ structure size. ++ * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct ++ placement of float result. ++ * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct ++ cast of "resp" for big-endian 64 bit machines. ++ ++2003-09-11 Alan Modra ++ ++ * src/types.c (double, longdouble): Merge identical SH and ARM ++ typedefs, and add POWERPC64. ++ * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for ++ struct split over gpr and rest. ++ (ffi_prep_cif_machdep): Correct intarg_count for structures. ++ * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets. ++ ++2003-09-09 Andreas Tobler ++ ++ * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct ++ passing correctly. ++ ++2003-09-09 Alan Modra ++ ++ * configure: Regenerate. ++ ++2003-09-04 Andreas Tobler ++ ++ * Makefile.am: Remove build rules for ffitest. ++ * Makefile.in: Rebuilt. ++ ++2003-09-04 Andreas Tobler ++ ++ * src/java_raw_api.c: Include to fix compiler warning ++ about implicit declaration of abort(). ++ ++2003-09-04 Andreas Tobler ++ ++ * Makefile.am: Add dejagnu test framework. Fixes PR other/11411. ++ * Makefile.in: Rebuilt. ++ * configure.in: Add dejagnu test framework. ++ * configure: Rebuilt. ++ ++ * testsuite/Makefile.am: New file. ++ * testsuite/Makefile.in: Built ++ * testsuite/lib/libffi-dg.exp: New file. ++ * testsuite/config/default.exp: Likewise. ++ * testsuite/libffi.call/call.exp: Likewise. ++ * testsuite/libffi.call/ffitest.h: Likewise. ++ * testsuite/libffi.call/closure_fn0.c: Likewise. ++ * testsuite/libffi.call/closure_fn1.c: Likewise. ++ * testsuite/libffi.call/closure_fn2.c: Likewise. ++ * testsuite/libffi.call/closure_fn3.c: Likewise. ++ * testsuite/libffi.call/cls_1_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_3_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_4_1byte.c: Likewise. ++ * testsuite/libffi.call/cls_2byte.c: Likewise. ++ * testsuite/libffi.call/cls_3byte1.c: Likewise. ++ * testsuite/libffi.call/cls_3byte2.c: Likewise. ++ * testsuite/libffi.call/cls_4byte.c: Likewise. ++ * testsuite/libffi.call/cls_5byte.c: Likewise. ++ * testsuite/libffi.call/cls_6byte.c: Likewise. ++ * testsuite/libffi.call/cls_7byte.c: Likewise. ++ * testsuite/libffi.call/cls_8byte.c: Likewise. ++ * testsuite/libffi.call/cls_12byte.c: Likewise. ++ * testsuite/libffi.call/cls_16byte.c: Likewise. ++ * testsuite/libffi.call/cls_20byte.c: Likewise. ++ * testsuite/libffi.call/cls_24byte.c: Likewise. ++ * testsuite/libffi.call/cls_double.c: Likewise. ++ * testsuite/libffi.call/cls_float.c: Likewise. ++ * testsuite/libffi.call/cls_uchar.c: Likewise. ++ * testsuite/libffi.call/cls_uint.c: Likewise. ++ * testsuite/libffi.call/cls_ulonglong.c: Likewise. ++ * testsuite/libffi.call/cls_ushort.c: Likewise. ++ * testsuite/libffi.call/float.c: Likewise. ++ * testsuite/libffi.call/float1.c: Likewise. ++ * testsuite/libffi.call/float2.c: Likewise. ++ * testsuite/libffi.call/many.c: Likewise. ++ * testsuite/libffi.call/many_win32.c: Likewise. ++ * testsuite/libffi.call/nested_struct.c: Likewise. ++ * testsuite/libffi.call/nested_struct1.c: Likewise. ++ * testsuite/libffi.call/pyobjc-tc.c: Likewise. ++ * testsuite/libffi.call/problem1.c: Likewise. ++ * testsuite/libffi.call/promotion.c: Likewise. ++ * testsuite/libffi.call/return_ll.c: Likewise. ++ * testsuite/libffi.call/return_sc.c: Likewise. ++ * testsuite/libffi.call/return_uc.c: Likewise. ++ * testsuite/libffi.call/strlen.c: Likewise. ++ * testsuite/libffi.call/strlen_win32.c: Likewise. ++ * testsuite/libffi.call/struct1.c: Likewise. ++ * testsuite/libffi.call/struct2.c: Likewise. ++ * testsuite/libffi.call/struct3.c: Likewise. ++ * testsuite/libffi.call/struct4.c: Likewise. ++ * testsuite/libffi.call/struct5.c: Likewise. ++ * testsuite/libffi.call/struct6.c: Likewise. ++ * testsuite/libffi.call/struct7.c: Likewise. ++ * testsuite/libffi.call/struct8.c: Likewise. ++ * testsuite/libffi.call/struct9.c: Likewise. ++ * testsuite/libffi.special/special.exp: New file. ++ * testsuite/libffi.special/ffitestcxx.h: Likewise. ++ * testsuite/libffi.special/unwindtest.cc: Likewise. ++ ++ ++2003-08-13 Kaz Kojima ++ ++ * src/sh/ffi.c (OFS_INT16): Set 0 for little endian case. Update ++ copyright years. ++ ++2003-08-02 Alan Modra ++ ++ * src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc ++ structure passing. ++ (ffi_closure_helper_LINUX64): Likewise. ++ * src/powerpc/linux64.S: Remove code writing to parm save area. ++ * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return ++ address in lr from ffi_closure_helper_LINUX64 call to calculate ++ table address. Optimize function tail. ++ ++2003-07-28 Andreas Tobler ++ ++ * src/sparc/ffi.c: Handle all floating point registers. ++ * src/sparc/v9.S: Likewise. Fixes second part of PR target/11410. ++ ++2003-07-11 Gerald Pfeifer ++ ++ * README: Note that libffi is not part of GCC. Update the project ++ URL and status. ++ ++2003-06-19 Franz Sirl ++ ++ * src/powerpc/ppc_closure.S: Include ffi.h. ++ ++2003-06-13 Rainer Orth ++ ++ * src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives. ++ Use C style comments. ++ ++2003-06-13 Kaz Kojima ++ ++ * Makefile.am: Add SHmedia support. Fix a typo of SH support. ++ * Makefile.in: Regenerate. ++ * configure.in (sh64-*-linux*, sh5*-*-linux*): Add target. ++ * configure: Regenerate. ++ * include/ffi.h.in: Add SHmedia support. ++ * src/sh64/ffi.c: New file. ++ * src/sh64/sysv.S: New file. ++ ++2003-05-16 Jakub Jelinek ++ ++ * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section ++ should be read-only. ++ * configure: Rebuilt. ++ * fficonfig.h.in: Rebuilt. ++ * include/ffi.h.in (EH_FRAME_FLAGS): Define. ++ * src/alpha/osf.S: Use EH_FRAME_FLAGS. ++ * src/powerpc/linux64.S: Likewise. ++ * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. ++ * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding ++ if -fpic/-fPIC/-mrelocatable. ++ * src/powerpc/powerpc_closure.S: Likewise. ++ * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include ++ #write in .eh_frame flags. ++ * src/sparc/v9.S: Likewise. ++ * src/x86/unix64.S: Use EH_FRAME_FLAGS. ++ * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. ++ * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. ++ ++2003-05-07 Jeff Sturm ++ ++ Fixes PR bootstrap/10656 ++ * configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler ++ support for .register pseudo-op. ++ * src/sparc/v8.S: Use it. ++ * fficonfig.h.in: Rebuilt. ++ * configure: Rebuilt. ++ ++2003-04-18 Jakub Jelinek ++ ++ * include/ffi.h.in (POWERPC64): Define if 64-bit. ++ (enum ffi_abi): Add FFI_LINUX64 on POWERPC. ++ Make it the default on POWERPC64. ++ (FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64. ++ * configure.in: Change powerpc-*-linux* into powerpc*-*-linux*. ++ * configure: Rebuilt. ++ * src/powerpc/ffi.c (hidden): Define. ++ (ffi_prep_args_SYSV): Renamed from ++ ffi_prep_args. Cast pointers to unsigned long to shut up warnings. ++ (NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64, ++ ASM_NEEDS_REGISTERS64): New. ++ (ffi_prep_args64): New function. ++ (ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI. ++ (ffi_call): Likewise. ++ (ffi_prep_closure): Likewise. ++ (flush_icache): Surround by #ifndef POWERPC64. ++ (ffi_dblfl): New union type. ++ (ffi_closure_helper_SYSV): Use it to avoid aliasing problems. ++ (ffi_closure_helper_LINUX64): New function. ++ * src/powerpc/ppc_closure.S: Surround whole file by #ifndef ++ __powerpc64__. ++ * src/powerpc/sysv.S: Likewise. ++ (ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV. ++ * src/powerpc/linux64.S: New file. ++ * src/powerpc/linux64_closure.S: New file. ++ * Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and ++ src/powerpc/linux64_closure.S. ++ (TARGET_SRC_POWERPC): Likewise. ++ ++ * src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2, ++ closure_test_fn3): Fix result printing on big-endian 64-bit ++ machines. ++ (main): Print tst2_arg instead of uninitialized tst2_result. ++ ++ * src/ffitest.c (main): Hide what closure pointer really points to ++ from the compiler. ++ ++2003-04-16 Richard Earnshaw ++ ++ * configure.in (arm-*-netbsdelf*): Add configuration. ++ (configure): Regenerated. ++ ++2003-04-04 Loren J. Rittle ++ ++ * include/Makefile.in: Regenerate. ++ ++2003-03-21 Zdenek Dvorak ++ ++ * libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32 ++ bit mode. ++ * libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): ++ Receive closure pointer through parameter, read args using ++ __builtin_dwarf_cfa. ++ (FFI_INIT_TRAMPOLINE): Send closure reference through eax. ++ ++2003-03-12 Andreas Schwab ++ ++ * configure.in: Avoid trailing /. in toolexeclibdir. ++ * configure: Rebuilt. ++ ++2003-03-03 Andreas Tobler ++ ++ * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. ++ ++2003-02-06 Andreas Tobler ++ ++ * libffi/src/powerpc/darwin_closure.S: ++ Fix alignement bug, allocate 8 bytes for the result. ++ * libffi/src/powerpc/aix_closure.S: ++ Likewise. ++ * libffi/src/powerpc/ffi_darwin.c: ++ Update stackframe description for aix/darwin_closure.S. ++ ++2003-02-06 Jakub Jelinek ++ ++ * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility ++ attribute. ++ ++2003-01-31 Christian Cornelssen , ++ Andreas Schwab ++ ++ * configure.in: Adjust command to source config-ml.in to account ++ for changes to the libffi_basedir definition. ++ (libffi_basedir): Remove ${srcdir} from value and include trailing ++ slash if nonempty. ++ ++ * configure: Regenerate. ++ ++2003-01-29 Franz Sirl ++ ++ * src/powerpc/ppc_closure.S: Recode to fit shared libs. ++ ++2003-01-28 Andrew Haley ++ ++ * include/ffi.h.in: Enable FFI_CLOSURES for x86_64. ++ * src/x86/ffi64.c (ffi_prep_closure): New. ++ (ffi_closure_UNIX64_inner): New. ++ * src/x86/unix64.S (ffi_closure_UNIX64): New. ++ ++2003-01-27 Alexandre Oliva ++ ++ * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. ++ Remove USE_LIBDIR conditional. ++ * Makefile.am (toolexecdir, toolexeclibdir): Don't override. ++ * Makefile.in, configure: Rebuilt. ++ ++2003-01027 David Edelsohn ++ ++ * Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo. ++ * Makefile.in: Regenerate. ++ ++2003-01-22 Andrew Haley ++ ++ * src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to ++ unwind info. ++ ++2003-01-21 Andreas Tobler ++ ++ * src/powerpc/darwin.S: Add unwind info. ++ * src/powerpc/darwin_closure.S: Likewise. ++ ++2003-01-14 Andrew Haley ++ ++ * src/x86/ffi64.c (ffi_prep_args): Check for void retval. ++ (ffi_prep_cif_machdep): Likewise. ++ * src/x86/unix64.S: Add unwind info. ++ ++2003-01-14 Andreas Jaeger ++ ++ * src/ffitest.c (main): Only use ffi_closures if those are ++ supported. ++ ++2003-01-13 Andreas Tobler ++ ++ * libffi/src/ffitest.c ++ add closure testcases ++ ++2003-01-13 Kevin B. Hendricks ++ ++ * libffi/src/powerpc/ffi.c ++ fix alignment bug for float (4 byte aligned iso 8 byte) ++ ++2003-01-09 Geoffrey Keating ++ ++ * src/powerpc/ffi_darwin.c: Remove RCS version string. ++ * src/powerpc/darwin.S: Remove RCS version string. ++ ++2003-01-03 Jeff Sturm ++ ++ * include/ffi.h.in: Add closure defines for SPARC, SPARC64. ++ * src/ffitest.c (main): Use static storage for closure. ++ * src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New. ++ * src/sparc/v8.S (ffi_closure_v8): New. ++ * src/sparc/v9.S (ffi_closure_v9): New. ++ ++2002-11-10 Ranjit Mathew ++ ++ * include/ffi.h.in: Added FFI_STDCALL ffi_type ++ enumeration for X86_WIN32. ++ * src/x86/win32.S: Added ffi_call_STDCALL function ++ definition. ++ * src/x86/ffi.c (ffi_call/ffi_raw_call): Added ++ switch cases for recognising FFI_STDCALL and ++ calling ffi_call_STDCALL if target is X86_WIN32. ++ * src/ffitest.c (my_stdcall_strlen/stdcall_many): ++ stdcall versions of the "my_strlen" and "many" ++ test functions (for X86_WIN32). ++ Added test cases to test stdcall invocation using ++ these functions. ++ ++2002-12-02 Kaz Kojima ++ ++ * src/sh/sysv.S: Add DWARF2 unwind info. ++ ++2002-11-27 Ulrich Weigand ++ ++ * src/s390/sysv.S (.eh_frame section): Make section read-only. ++ ++2002-11-26 Jim Wilson ++ ++ * src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64. ++ ++2002-11-23 H.J. Lu ++ ++ * acinclude.m4: Add dummy AM_PROG_LIBTOOL. ++ Include ../config/accross.m4. ++ * aclocal.m4; Rebuild. ++ * configure: Likewise. ++ ++2002-11-15 Ulrich Weigand ++ ++ * src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding. ++ ++2002-11-11 DJ Delorie ++ ++ * configure.in: Look for common files in the right place. ++ ++2002-10-08 Ulrich Weigand ++ ++ * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret ++ raw data as _Jv_word values, not ffi_raw. ++ (ffi_java_ptrarray_to_raw): Likewise. ++ (ffi_java_rvalue_to_raw): New function. ++ (ffi_java_raw_call): Call it. ++ (ffi_java_raw_to_rvalue): New function. ++ (ffi_java_translate_args): Call it. ++ * src/ffitest.c (closure_test_fn): Interpret return value ++ as ffi_arg, not int. ++ * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing ++ FFI_TYPE_POINTER case. ++ (ffi_closure_helper_SYSV): Likewise. Also, assume return ++ values extended to word size. ++ ++2002-10-02 Andreas Jaeger ++ ++ * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output. ++ ++2002-10-01 Bo Thorsen ++ ++ * include/ffi.h.in: Fix i386 win32 compilation. ++ ++2002-09-30 Ulrich Weigand ++ ++ * configure.in: Add s390x-*-linux-* target. ++ * configure: Regenerate. ++ * include/ffi.h.in: Define S390X for s390x targets. ++ (FFI_CLOSURES): Define for s390/s390x. ++ (FFI_TRAMPOLINE_SIZE): Likewise. ++ (FFI_NATIVE_RAW_API): Likewise. ++ * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390. ++ * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x. ++ * src/s390/ffi.c: Major rework of existing code. Add support for ++ s390x targets. Add closure support. ++ * src/s390/sysv.S: Likewise. ++ ++2002-09-29 Richard Earnshaw ++ ++ * src/arm/sysv.S: Fix typo. ++ ++2002-09-28 Richard Earnshaw ++ ++ * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor ++ has defined __USER_LABEL_PREFIX__, then use it in CNAME. ++ (ffi_call_SYSV): Handle soft-float. ++ ++2002-09-27 Bo Thorsen ++ ++ * include/ffi.h.in: Fix multilib x86-64 support. ++ ++2002-09-22 Kaveh R. Ghazi ++ ++ * Makefile.am (all-multi): Fix multilib parallel build. ++ ++2002-07-19 Kaz Kojima ++ ++ * configure.in (sh[34]*-*-linux*): Add brackets. ++ * configure: Regenerate. ++ ++2002-07-18 Kaz Kojima ++ ++ * Makefile.am: Add SH support. ++ * Makefile.in: Regenerate. ++ * configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target. ++ * configure: Regenerate. ++ * include/ffi.h.in: Add SH support. ++ * src/sh/ffi.c: New file. ++ * src/sh/sysv.S: New file. ++ * src/types.c: Add SH support. ++ ++2002-07-16 Bo Thorsen ++ ++ * src/x86/ffi64.c: New file that adds x86-64 support. ++ * src/x86/unix64.S: New file that handles argument setup for ++ x86-64. ++ * src/x86/sysv.S: Don't use this on x86-64. ++ * src/x86/ffi.c: Don't use this on x86-64. ++ Remove unused vars. ++ * src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation ++ for x86-64. ++ * src/ffitest.c (struct6): New test that tests a special case in ++ the x86-64 ABI. ++ (struct7): Likewise. ++ (struct8): Likewise. ++ (struct9): Likewise. ++ (closure_test_fn): Silence warning about this when it's not used. ++ (main): Add the new tests. ++ (main): Fix a couple of wrong casts and silence some compiler warnings. ++ * include/ffi.h.in: Add x86-64 ABI definition. ++ * fficonfig.h.in: Regenerate. ++ * Makefile.am: Add x86-64 support. ++ * configure.in: Likewise. ++ * Makefile.in: Regenerate. ++ * configure: Likewise. ++ ++2002-06-24 Bo Thorsen ++ ++ * src/types.c: Merge settings for similar architectures. ++ Add x86-64 sizes and alignments. ++ ++2002-06-23 Bo Thorsen ++ ++ * src/arm/ffi.c (ffi_prep_args): Remove unused vars. ++ * src/sparc/ffi.c (ffi_prep_args_v8): Likewise. ++ * src/mips/ffi.c (ffi_prep_args): Likewise. ++ * src/m68k/ffi.c (ffi_prep_args): Likewise. ++ ++2002-07-18 H.J. Lu (hjl@gnu.org) ++ ++ * Makefile.am (TARGET_SRC_MIPS_LINUX): New. ++ (libffi_la_SOURCES): Support MIPS_LINUX. ++ (libffi_convenience_la_SOURCES): Likewise. ++ * Makefile.in: Regenerated. ++ ++ * configure.in (mips64*-*): Skip. ++ (mips*-*-linux*): New. ++ * configure: Regenerated. ++ ++ * src/mips/ffi.c: Include . ++ ++2002-06-06 Ulrich Weigand ++ ++ * src/s390/sysv.S: Save/restore %r6. Add DWARF-2 unwind info. ++ ++2002-05-27 Roger Sayle ++ ++ * src/x86/ffi.c (ffi_prep_args): Remove reference to avn. ++ ++2002-05-27 Bo Thorsen ++ ++ * src/x86/ffi.c (ffi_prep_args): Remove unused variable and ++ fix formatting. ++ ++2002-05-13 Andreas Tobler ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at ++ beginning of function (for older apple cc). ++ ++2002-05-08 Alexandre Oliva ++ ++ * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at ++ script entry, and set LD to it when configuring multilibs. ++ * configure: Rebuilt. ++ ++2002-05-05 Jason Thorpe ++ ++ * configure.in (sparc64-*-netbsd*): Add target. ++ (sparc-*-netbsdelf*): Likewise. ++ * configure: Regenerate. ++ ++2002-04-28 David S. Miller ++ ++ * configure.in, configure: Fix SPARC test in previous change. ++ ++2002-04-29 Gerhard Tonn ++ ++ * Makefile.am: Add Linux for S/390 support. ++ * Makefile.in: Regenerate. ++ * configure.in: Add Linux for S/390 support. ++ * configure: Regenerate. ++ * include/ffi.h.in: Add Linux for S/390 support. ++ * src/s390/ffi.c: New file from libffi CVS tree. ++ * src/s390/sysv.S: New file from libffi CVS tree. ++ ++2002-04-28 Jakub Jelinek ++ ++ * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working ++ %r_disp32(). ++ * src/sparc/v8.S: Use it. ++ * src/sparc/v9.S: Likewise. ++ * fficonfig.h.in: Rebuilt. ++ * configure: Rebuilt. ++ ++2002-04-08 Hans Boehm ++ ++ * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE ++ correctly. ++ * src/ia64/unix.S: Add unwind information. Fix comments. ++ Save sp in a way that's compatible with unwind info. ++ (ffi_call_unix): Correctly restore sp in all cases. ++ * src/ia64/ffi.c: Add, fix comments. ++ ++2002-04-08 Jakub Jelinek ++ ++ * src/sparc/v8.S: Make .eh_frame dependent on target word size. ++ ++2002-04-06 Jason Thorpe ++ ++ * configure.in (alpha*-*-netbsd*): Add target. ++ * configure: Regenerate. ++ ++2002-04-04 Jeff Sturm ++ ++ * src/sparc/v8.S: Add unwind info. ++ * src/sparc/v9.S: Likewise. ++ ++2002-03-30 Krister Walfridsson ++ ++ * configure.in: Enable i*86-*-netbsdelf*. ++ * configure: Rebuilt. ++ ++2002-03-29 David Billinghurst ++ ++ PR other/2620 ++ * src/mips/n32.s: Delete ++ * src/mips/o32.s: Delete ++ ++2002-03-21 Loren J. Rittle ++ ++ * configure.in: Enable alpha*-*-freebsd*. ++ * configure: Rebuilt. ++ ++2002-03-17 Bryce McKinlay ++ ++ * Makefile.am: libfficonvenience -> libffi_convenience. ++ * Makefile.in: Rebuilt. ++ ++ * Makefile.am: Define ffitest_OBJECTS. ++ * Makefile.in: Rebuilt. ++ ++2002-03-07 Andreas Tobler ++ David Edelsohn ++ ++ * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. ++ (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. ++ (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. ++ * Makefile.in: Regenerate. ++ * include/ffi.h.in: Add AIX and Darwin closure definitions. ++ * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. ++ (flush_icache, flush_range): New functions. ++ (ffi_closure_helper_DARWIN): New function. ++ * src/powerpc/aix_closure.S: New file. ++ * src/powerpc/darwin_closure.S: New file. ++ ++2002-02-24 Jeff Sturm ++ ++ * include/ffi.h.in: Add typedef for ffi_arg. ++ * src/ffitest.c (main): Declare rint with ffi_arg. ++ ++2002-02-21 Andreas Tobler ++ ++ * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate ++ number of GPRs for floating-point arguments. ++ ++2002-01-31 Anthony Green ++ ++ * configure: Rebuilt. ++ * configure.in: Replace CHECK_SIZEOF and endian tests with ++ cross-compiler friendly macros. ++ * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New ++ macros. ++ ++2002-01-18 David Edelsohn ++ ++ * src/powerpc/darwin.S (_ffi_call_AIX): New. ++ * src/powerpc/aix.S (ffi_call_DARWIN): New. ++ ++2002-01-17 David Edelsohn ++ ++ * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. ++ (TARGET_SRC_POWERPC_AIX): New. ++ (POWERPC_AIX): New stanza. ++ * Makefile.in: Regenerate. ++ * configure.in: Add AIX case. ++ * configure: Regenerate. ++ * include/ffi.h.in (ffi_abi): Add FFI_AIX. ++ * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame ++ size. Fix "long double" support. ++ (ffi_call): Add FFI_AIX case. ++ * src/powerpc/aix.S: New. ++ ++2001-10-09 John Hornkvist ++ ++ Implement Darwin PowerPC ABI. ++ * configure.in: Handle powerpc-*-darwin*. ++ * Makefile.am: Set source files for POWERPC_DARWIN. ++ * configure: Rebuilt. ++ * Makefile.in: Rebuilt. ++ * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for ++ POWERPC_DARWIN. ++ * src/powerpc/darwin.S: New file. ++ * src/powerpc/ffi_darwin.c: New file. ++ ++2001-10-07 Joseph S. Myers ++ ++ * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". ++ ++2001-07-16 Rainer Orth ++ ++ * src/x86/sysv.S: Avoid gas-only .balign directive. ++ Use C style comments. ++ ++2001-07-16 Rainer Orth ++ ++ * src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic. ++ Fixes PR bootstrap/3563. ++ ++2001-06-26 Rainer Orth ++ ++ * src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF. ++ ++2001-06-25 Rainer Orth ++ ++ * configure.in: Recognize sparc*-sun-* host. ++ * configure: Regenerate. ++ ++2001-06-06 Andrew Haley ++ ++ * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. ++ ++2001-06-03 Andrew Haley ++ ++ * src/alpha/osf.S: Add unwind info. ++ * src/powerpc/sysv.S: Add unwind info. ++ * src/powerpc/ppc_closure.S: Likewise. ++ ++2000-05-31 Jeff Sturm ++ ++ * configure.in: Fix AC_ARG_ENABLE usage. ++ * configure: Rebuilt. ++ ++2001-05-06 Bryce McKinlay ++ ++ * configure.in: Remove warning about beta code. ++ * configure: Rebuilt. ++ ++2001-04-25 Hans Boehm ++ ++ * src/ia64/unix.S: Restore stack pointer when returning from ++ ffi_closure_UNIX. ++ * src/ia64/ffi.c: Fix typo in comment. ++ ++2001-04-18 Jim Wilson ++ ++ * src/ia64/unix.S: Delete unnecessary increment and decrement of loc2 ++ to eliminate RAW DV. ++ ++2001-04-12 Bryce McKinlay ++ ++ * Makefile.am: Make a libtool convenience library. ++ * Makefile.in: Rebuilt. ++ ++2001-03-29 Bryce McKinlay ++ ++ * configure.in: Use different syntax for subdirectory creation. ++ * configure: Rebuilt. ++ ++2001-03-27 Jon Beniston ++ ++ * configure.in: Added X86_WIN32 target (Win32, CygWin, MingW). ++ * configure: Rebuilt. ++ * Makefile.am: Added X86_WIN32 target support. ++ * Makefile.in: Rebuilt. ++ ++ * include/ffi.h.in: Added X86_WIN32 target support. ++ ++ * src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets. ++ * src/types.c: Added X86_WIN32 target support. ++ ++ * src/x86/win32.S: New file. Based on sysv.S, but with EH ++ stuff removed and made to work with CygWin's gas. ++ ++2001-03-26 Bryce McKinlay ++ ++ * configure.in: Make target subdirectory in build dir. ++ * Makefile.am: Override suffix based rules to specify correct output ++ subdirectory. ++ * Makefile.in: Rebuilt. ++ * configure: Rebuilt. ++ ++2001-03-23 Kevin B Hendricks ++ ++ * src/powerpc/ppc_closure.S: New file. ++ * src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug ++ involving long long and register pairs. ++ (ffi_prep_closure): New function. ++ (flush_icache): Likewise. ++ (ffi_closure_helper_SYSV): Likewise. ++ * include/ffi.h.in (FFI_CLOSURES): Define on PPC. ++ (FFI_TRAMPOLINE_SIZE): Likewise. ++ (FFI_NATIVE_RAW_API): Likewise. ++ * Makefile.in: Rebuilt. ++ * Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S. ++ (TARGET_SRC_POWERPC): Likewise. ++ ++2001-03-19 Tom Tromey ++ ++ * Makefile.in: Rebuilt. ++ * Makefile.am (ffitest_LDFLAGS): New macro. ++ ++2001-03-02 Nick Clifton ++ ++ * include/ffi.h.in: Remove RCS ident string. ++ * include/ffi_mips.h: Remove RCS ident string. ++ * src/debug.c: Remove RCS ident string. ++ * src/ffitest.c: Remove RCS ident string. ++ * src/prep_cif.c: Remove RCS ident string. ++ * src/types.c: Remove RCS ident string. ++ * src/alpha/ffi.c: Remove RCS ident string. ++ * src/alpha/osf.S: Remove RCS ident string. ++ * src/arm/ffi.c: Remove RCS ident string. ++ * src/arm/sysv.S: Remove RCS ident string. ++ * src/mips/ffi.c: Remove RCS ident string. ++ * src/mips/n32.S: Remove RCS ident string. ++ * src/mips/o32.S: Remove RCS ident string. ++ * src/sparc/ffi.c: Remove RCS ident string. ++ * src/sparc/v8.S: Remove RCS ident string. ++ * src/sparc/v9.S: Remove RCS ident string. ++ * src/x86/ffi.c: Remove RCS ident string. ++ * src/x86/sysv.S: Remove RCS ident string. ++ ++2001-02-08 Joseph S. Myers ++ ++ * include/ffi.h.in: Change sourceware.cygnus.com references to ++ gcc.gnu.org. ++ ++2000-12-09 Richard Henderson ++ ++ * src/alpha/ffi.c (ffi_call): Simplify struct return test. ++ (ffi_closure_osf_inner): Index rather than increment avalue ++ and arg_types. Give ffi_closure_osf the raw return value type. ++ * src/alpha/osf.S (ffi_closure_osf): Handle return value type ++ promotion. ++ ++2000-12-07 Richard Henderson ++ ++ * src/raw_api.c (ffi_translate_args): Fix typo. ++ (ffi_prep_closure): Likewise. ++ ++ * include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and ++ FFI_TRAMPOLINE_SIZE. ++ * src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal ++ cif->bytes for new ffi_call_osf implementation. ++ (ffi_prep_args): Absorb into ... ++ (ffi_call): ... here. Do all stack allocation here and ++ avoid a callback function. ++ (ffi_prep_closure, ffi_closure_osf_inner): New. ++ * src/alpha/osf.S (ffi_call_osf): Reimplement with no callback. ++ (ffi_closure_osf): New. ++ ++2000-09-10 Alexandre Oliva ++ ++ * config.guess, config.sub, install-sh: Removed. ++ * ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise. ++ * Makefile.in: Rebuilt. ++ ++ * acinclude.m4: Include libtool macros from the top level. ++ * aclocal.m4, configure: Rebuilt. ++ ++2000-08-22 Alexandre Oliva ++ ++ * configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set. ++ * configure: Rebuilt. ++ ++2000-05-11 Scott Bambrough ++ ++ * libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to ++ memory correctly. Use conditional instructions, not branches where ++ possible. ++ ++2000-05-04 Tom Tromey ++ ++ * configure: Rebuilt. ++ * configure.in: Match `arm*-*-linux-*'. ++ From Chris Dornan . ++ ++2000-04-28 Jakub Jelinek ++ ++ * Makefile.am (SUBDIRS): Define. ++ (AM_MAKEFLAGS): Likewise. ++ (Multilib support.): Add section. ++ * Makefile.in: Rebuilt. ++ * ltconfig (extra_compiler_flags, extra_compiler_flags_value): ++ New variables. Set for gcc using -print-multi-lib. Export them ++ to libtool. ++ (sparc64-*-linux-gnu*): Use libsuff 64 for search paths. ++ * ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options ++ for -shared links. ++ (extra_compiler_flags_value, extra_compiler_flags): Check these ++ for extra compiler options which need to be passed down in ++ compiler_flags. ++ ++2000-04-16 Anthony Green ++ ++ * configure: Rebuilt. ++ * configure.in: Change i*86-pc-linux* to i*86-*-linux*. ++ ++2000-04-14 Jakub Jelinek ++ ++ * include/ffi.h.in (SPARC64): Define for 64bit SPARC builds. ++ Set SPARC FFI_DEFAULT_ABI based on SPARC64 define. ++ * src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args. ++ Replace all void * sizeofs with sizeof(int). ++ Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is ++ different than DOUBLE. ++ Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere). ++ (ffi_prep_args_v9): New function. ++ (ffi_prep_cif_machdep): Handle V9 ABI and long long on V8. ++ (ffi_V9_return_struct): New function. ++ (ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from ++ 32bit code (not yet cross-arch calls). ++ * src/sparc/v8.S: Add struct return delay nop. ++ Handle long long. ++ * src/sparc/v9.S: New file. ++ * src/prep_cif.c (ffi_prep_cif): Return structure pointer ++ is used on sparc64 only for structures larger than 32 bytes. ++ Pass by reference for structures is done for structure arguments ++ larger than 16 bytes. ++ * src/ffitest.c (main): Use 64bit rint on sparc64. ++ Run long long tests on sparc. ++ * src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and ++ sparc64. ++ (FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits ++ on sparc64. ++ * configure.in (sparc-*-linux*): New supported target. ++ (sparc64-*-linux*): Likewise. ++ * configure: Rebuilt. ++ * Makefile.am: Add v9.S to SPARC files. ++ * Makefile.in: Likewise. ++ (LINK): Surround $(CCLD) into double quotes, so that multilib ++ compiles work correctly. ++ ++2000-04-04 Alexandre Petit-Bianco ++ ++ * configure: Rebuilt. ++ * configure.in: (i*86-*-solaris*): New libffi target. Patch ++ proposed by Bryce McKinlay. ++ ++2000-03-20 Tom Tromey ++ ++ * Makefile.in: Hand edit for java_raw_api.lo. ++ ++2000-03-08 Bryce McKinlay ++ ++ * config.guess, config.sub: Update from the gcc tree. ++ Fix for PR libgcj/168. ++ ++2000-03-03 Tom Tromey ++ ++ * Makefile.in: Fixed ia64 by hand. ++ ++ * configure: Rebuilt. ++ * configure.in (--enable-multilib): New option. ++ (libffi_basedir): New subst. ++ (AC_OUTPUT): Added multilib code. ++ ++2000-03-02 Tom Tromey ++ ++ * Makefile.in: Rebuilt. ++ * Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as ++ directory name. ++ ++2000-02-25 Hans Boehm ++ ++ * src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New ++ files. ++ * src/raw_api.c (ffi_translate_args): Fixed typo in argument ++ list. ++ (ffi_prep_raw_closure): Use ffi_translate_args, not ++ ffi_closure_translate. ++ * src/java_raw_api.c: New file. ++ * src/ffitest.c (closure_test_fn): New function. ++ (main): Define `rint' as long long on IA64. Added new test when ++ FFI_CLOSURES is defined. ++ * include/ffi.h.in (ALIGN): Use size_t, not unsigned. ++ (ffi_abi): Recognize IA64. ++ (ffi_raw): Added `flt' field. ++ Added "Java raw API" code. ++ * configure.in: Recognize ia64. ++ * Makefile.am (TARGET_SRC_IA64): New macro. ++ (libffi_la_common_SOURCES): Added java_raw_api.c. ++ (libffi_la_SOURCES): Define in IA64 case. ++ ++2000-01-04 Tom Tromey ++ ++ * Makefile.in: Rebuilt with newer automake. ++ ++1999-12-31 Tom Tromey ++ ++ * Makefile.am (INCLUDES): Added -I$(top_srcdir)/src. ++ ++1999-09-01 Tom Tromey ++ ++ * include/ffi.h.in: Removed PACKAGE and VERSION defines and ++ undefs. ++ * fficonfig.h.in: Rebuilt. ++ * configure: Rebuilt. ++ * configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE. ++ Use AM_PROG_LIBTOOL (automake 1.4 compatibility). ++ * acconfig.h: Don't #undef PACKAGE or VERSION. ++ ++1999-08-09 Anthony Green ++ ++ * include/ffi.h.in: Try to work around messy header problem ++ with PACKAGE and VERSION. ++ ++ * configure: Rebuilt. ++ * configure.in: Change version to 2.00-beta. ++ ++ * fficonfig.h.in: Rebuilt. ++ * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. ++ ++ * src/x86/ffi.c (ffi_raw_call): Rename. ++ ++1999-08-02 Kresten Krab Thorup ++ ++ * src/x86/ffi.c (ffi_closure_SYSV): New function. ++ (ffi_prep_incoming_args_SYSV): Ditto. ++ (ffi_prep_closure): Ditto. ++ (ffi_closure_raw_SYSV): Ditto. ++ (ffi_prep_raw_closure): More ditto. ++ (ffi_call_raw): Final ditto. ++ ++ * include/ffi.h.in: Add definitions for closure and raw API. ++ ++ * src/x86/ffi.c (ffi_prep_cif_machdep): Added case for ++ FFI_TYPE_UINT64. ++ ++ * Makefile.am (libffi_la_common_SOURCES): Added raw_api.c ++ ++ * src/raw_api.c: New file. ++ ++ * include/ffi.h.in (ffi_raw): New type. ++ (UINT_ARG, SINT_ARG): New defines. ++ (ffi_closure, ffi_raw_closure): New types. ++ (ffi_prep_closure, ffi_prep_raw_closure): New declarations. ++ ++ * configure.in: Add check for endianness and sizeof void*. ++ ++ * src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument, ++ instead of directly. ++ ++ * configure: Rebuilt. ++ ++Thu Jul 8 14:28:42 1999 Anthony Green ++ ++ * configure.in: Add x86 and powerpc BeOS configurations. ++ From Makoto Kato . ++ ++1999-05-09 Anthony Green ++ ++ * configure.in: Add warning about this being beta code. ++ Remove src/Makefile.am from the picture. ++ * configure: Rebuilt. ++ ++ * Makefile.am: Move logic from src/Makefile.am. Add changes ++ to support libffi as a target library. ++ * Makefile.in: Rebuilt. ++ ++ * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: ++ Upgraded to new autoconf, automake, libtool. ++ ++ * README: Tweaks. ++ ++ * LICENSE: Update copyright date. ++ ++ * src/Makefile.am, src/Makefile.in: Removed. ++ ++1998-11-29 Anthony Green ++ ++ * include/ChangeLog: Removed. ++ * src/ChangeLog: Removed. ++ * src/mips/ChangeLog: Removed. ++ * src/sparc/ChangeLog: Remboved. ++ * src/x86/ChangeLog: Removed. ++ ++ * ChangeLog.v1: Created. +diff --git a/js/src/ctypes/libffi/ChangeLog.v1 b/js/src/ctypes/libffi/ChangeLog.v1 +--- a/js/src/ctypes/libffi/ChangeLog.v1 ++++ b/js/src/ctypes/libffi/ChangeLog.v1 +@@ -1,13 +1,13 @@ + The libffi version 1 ChangeLog archive. + + Version 1 of libffi had per-directory ChangeLogs. Current and future + versions have a single ChangeLog file in the root directory. The +-version 1 ChangeLogs have all been concatonated into this file for ++version 1 ChangeLogs have all been concatenated into this file for + future reference only. + + --- libffi ---------------------------------------------------------------- + + Mon Oct 5 02:17:50 1998 Anthony Green + + * configure.in: Boosted rev. + * configure, Makefile.in, aclocal.m4: Rebuilt. +diff --git a/js/src/ctypes/libffi/LICENSE b/js/src/ctypes/libffi/LICENSE +--- a/js/src/ctypes/libffi/LICENSE ++++ b/js/src/ctypes/libffi/LICENSE +@@ -1,21 +1,21 @@ +-libffi - Copyright (c) 1996-2009 Anthony Green, Red Hat, Inc and others. ++libffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others. + See source files for details. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + +-The above copyright notice and this permission notice shall be included +-in all copies or substantial portions of the Software. ++The above copyright notice and this permission notice shall be ++included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +diff --git a/js/src/ctypes/libffi/Makefile.am b/js/src/ctypes/libffi/Makefile.am +--- a/js/src/ctypes/libffi/Makefile.am ++++ b/js/src/ctypes/libffi/Makefile.am +@@ -1,165 +1,212 @@ + ## Process this with automake to create Makefile.in + + AUTOMAKE_OPTIONS = foreign subdir-objects + ++ACLOCAL_AMFLAGS = -I m4 ++ + SUBDIRS = include testsuite man + +-EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ +- src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ +- src/arm/ffi.c src/arm/sysv.S src/arm/ffitarget.h \ +- src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \ +- src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \ +- src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \ +- src/ia64/unix.S \ +- src/mips/ffi.c src/mips/n32.S src/mips/o32.S \ +- src/mips/ffitarget.h \ +- src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ +- src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ +- src/powerpc/ffi.c src/powerpc/sysv.S \ +- src/powerpc/linux64.S src/powerpc/linux64_closure.S \ +- src/powerpc/ppc_closure.S src/powerpc/asm.h \ +- src/powerpc/aix.S src/powerpc/darwin.S \ +- src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ +- src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ +- src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ +- src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h \ +- src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h \ +- src/sparc/v8.S src/sparc/v9.S src/sparc/ffitarget.h \ +- src/sparc/ffi.c src/x86/darwin64.S \ +- src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/win64.S \ +- src/x86/darwin.S src/x86/freebsd.S \ +- src/x86/ffi64.c src/x86/unix64.S src/x86/ffitarget.h \ +- src/pa/ffitarget.h src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ +- src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \ +- libtool-version ChangeLog.libffi m4/libtool.m4 \ +- m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 ++EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ ++ src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \ ++ src/alpha/ffi.c src/alpha/osf.S \ ++ src/alpha/ffitarget.h src/arc/ffi.c src/arc/arcompact.S \ ++ src/arc/ffitarget.h src/arm/ffi.c src/arm/sysv.S \ ++ src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ ++ src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ ++ src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ ++ src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ ++ src/mips/n32.S src/mips/o32.S src/metag/ffi.c \ ++ src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \ ++ src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \ ++ src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ ++ src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ ++ src/m88k/ffi.c src/m88k/obsd.S src/m88k/ffitarget.h \ ++ src/microblaze/ffi.c src/microblaze/sysv.S \ ++ src/microblaze/ffitarget.h \ ++ src/nios2/ffi.c src/nios2/ffitarget.h src/nios2/sysv.S \ ++ src/powerpc/ffi.c src/powerpc/ffi_powerpc.h \ ++ src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \ ++ src/powerpc/sysv.S src/powerpc/linux64.S \ ++ src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ ++ src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ ++ src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ ++ src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ ++ src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ ++ src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ ++ src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ ++ src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ ++ src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ ++ src/x86/win32.S src/x86/darwin.S src/x86/win64.S \ ++ src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ ++ src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ ++ src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/bfin/ffi.c \ ++ src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S \ ++ src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c \ ++ src/tile/ffitarget.h src/tile/tile.S libtool-version \ ++ src/vax/ffi.c src/vax/ffitarget.h src/vax/elfbsd.S \ ++ src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S \ ++ ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ ++ m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ ++ m4/ltversion.m4 src/arm/gentramp.sh src/debug.c msvcc.sh \ ++ generate-darwin-source-and-headers.py \ ++ libffi.xcodeproj/project.pbxproj src/arm/trampoline.S \ ++ libtool-ldflags ChangeLog.libffi-3.1 + + info_TEXINFOS = doc/libffi.texi + + ## ################################################################ + + ## + ## This section is for make and multilib madness. + ## + + # Work around what appears to be a GNU make bug handling MAKEFLAGS + # values defined in terms of make variables, as is the case for CC and + # friends when we are called from the top level Makefile. + AM_MAKEFLAGS = \ +- "AR_FLAGS=$(AR_FLAGS)" \ +- "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ +- "CFLAGS=$(CFLAGS)" \ +- "CXXFLAGS=$(CXXFLAGS)" \ +- "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ +- "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ +- "INSTALL=$(INSTALL)" \ +- "INSTALL_DATA=$(INSTALL_DATA)" \ +- "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ +- "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ +- "JC1FLAGS=$(JC1FLAGS)" \ +- "LDFLAGS=$(LDFLAGS)" \ +- "LIBCFLAGS=$(LIBCFLAGS)" \ +- "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ +- "MAKE=$(MAKE)" \ +- "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ +- "PICFLAG=$(PICFLAG)" \ +- "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ +- "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ +- "SHELL=$(SHELL)" \ +- "exec_prefix=$(exec_prefix)" \ +- "infodir=$(infodir)" \ +- "libdir=$(libdir)" \ +- "mandir=$(mandir)" \ +- "prefix=$(prefix)" \ +- "AR=$(AR)" \ +- "AS=$(AS)" \ +- "CC=$(CC)" \ +- "CXX=$(CXX)" \ +- "LD=$(LD)" \ +- "NM=$(NM)" \ +- "RANLIB=$(RANLIB)" \ +- "DESTDIR=$(DESTDIR)" ++ 'AR_FLAGS=$(AR_FLAGS)' \ ++ 'CC_FOR_BUILD=$(CC_FOR_BUILD)' \ ++ 'CFLAGS=$(CFLAGS)' \ ++ 'CXXFLAGS=$(CXXFLAGS)' \ ++ 'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \ ++ 'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \ ++ 'INSTALL=$(INSTALL)' \ ++ 'INSTALL_DATA=$(INSTALL_DATA)' \ ++ 'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \ ++ 'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \ ++ 'JC1FLAGS=$(JC1FLAGS)' \ ++ 'LDFLAGS=$(LDFLAGS)' \ ++ 'LIBCFLAGS=$(LIBCFLAGS)' \ ++ 'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \ ++ 'MAKE=$(MAKE)' \ ++ 'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \ ++ 'PICFLAG=$(PICFLAG)' \ ++ 'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \ ++ 'RUNTESTFLAGS=$(RUNTESTFLAGS)' \ ++ 'SHELL=$(SHELL)' \ ++ 'exec_prefix=$(exec_prefix)' \ ++ 'infodir=$(infodir)' \ ++ 'libdir=$(libdir)' \ ++ 'mandir=$(mandir)' \ ++ 'prefix=$(prefix)' \ ++ 'AR=$(AR)' \ ++ 'AS=$(AS)' \ ++ 'CC=$(CC)' \ ++ 'CXX=$(CXX)' \ ++ 'LD=$(LD)' \ ++ 'NM=$(NM)' \ ++ 'RANLIB=$(RANLIB)' \ ++ 'DESTDIR=$(DESTDIR)' ++ ++# Subdir rules rely on $(FLAGS_TO_PASS) ++FLAGS_TO_PASS = $(AM_MAKEFLAGS) + + MAKEOVERRIDES= + +-ACLOCAL_AMFLAGS=$(ACLOCAL_AMFLAGS) -I m4 +- +-lib_LTLIBRARIES = libffi.la ++toolexeclib_LTLIBRARIES = libffi.la + noinst_LTLIBRARIES = libffi_convenience.la + +-libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \ ++libffi_la_SOURCES = src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c + + pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = libffi.pc + + nodist_libffi_la_SOURCES = + ++if FFI_DEBUG ++nodist_libffi_la_SOURCES += src/debug.c ++endif ++ + if MIPS + nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S + endif ++if BFIN ++nodist_libffi_la_SOURCES += src/bfin/ffi.c src/bfin/sysv.S ++endif + if X86 +-nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S ++nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S src/x86/win32.S + endif + if X86_FREEBSD +-nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/freebsd.S ++nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/freebsd.S src/x86/win32.S + endif + if X86_WIN32 + nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win32.S + endif + if X86_WIN64 + nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win64.S + endif + if X86_DARWIN + nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S ++if X86_DARWIN32 ++nodist_libffi_la_SOURCES += src/x86/win32.S ++endif + endif + if SPARC + nodist_libffi_la_SOURCES += src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S + endif + if ALPHA + nodist_libffi_la_SOURCES += src/alpha/ffi.c src/alpha/osf.S + endif + if IA64 + nodist_libffi_la_SOURCES += src/ia64/ffi.c src/ia64/unix.S + endif + if M32R + nodist_libffi_la_SOURCES += src/m32r/sysv.S src/m32r/ffi.c + endif + if M68K + nodist_libffi_la_SOURCES += src/m68k/ffi.c src/m68k/sysv.S + endif ++if M88K ++nodist_libffi_la_SOURCES += src/m88k/ffi.c src/m88k/obsd.S ++endif ++if MOXIE ++nodist_libffi_la_SOURCES += src/moxie/ffi.c src/moxie/eabi.S ++endif ++if MICROBLAZE ++nodist_libffi_la_SOURCES += src/microblaze/ffi.c src/microblaze/sysv.S ++endif ++if NIOS2 ++nodist_libffi_la_SOURCES += src/nios2/sysv.S src/nios2/ffi.c ++endif + if POWERPC +-nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S ++nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S + endif + if POWERPC_AIX + nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S + endif + if POWERPC_DARWIN + nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S + endif + if POWERPC_FREEBSD +-nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S ++nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/sysv.S src/powerpc/ppc_closure.S ++endif ++if AARCH64 ++nodist_libffi_la_SOURCES += src/aarch64/sysv.S src/aarch64/ffi.c ++endif ++if ARC ++nodist_libffi_la_SOURCES += src/arc/arcompact.S src/arc/ffi.c + endif + if ARM + nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c ++if FFI_EXEC_TRAMPOLINE_TABLE ++nodist_libffi_la_SOURCES += src/arm/trampoline.S ++endif + endif + if AVR32 + nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c + endif + if LIBFFI_CRIS + nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c + endif + if FRV + nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c + endif +-if MOXIE +-nodist_libffi_la_SOURCES += src/moxie/eabi.S src/moxie/ffi.c +-endif + if S390 + nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c + endif + if X86_64 + nodist_libffi_la_SOURCES += src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S + endif + if SH + nodist_libffi_la_SOURCES += src/sh/sysv.S src/sh/ffi.c +@@ -168,31 +215,40 @@ if SH64 + nodist_libffi_la_SOURCES += src/sh64/sysv.S src/sh64/ffi.c + endif + if PA_LINUX + nodist_libffi_la_SOURCES += src/pa/linux.S src/pa/ffi.c + endif + if PA_HPUX + nodist_libffi_la_SOURCES += src/pa/hpux32.S src/pa/ffi.c + endif ++if TILE ++nodist_libffi_la_SOURCES += src/tile/tile.S src/tile/ffi.c ++endif ++if XTENSA ++nodist_libffi_la_SOURCES += src/xtensa/sysv.S src/xtensa/ffi.c ++endif ++if METAG ++nodist_libffi_la_SOURCES += src/metag/sysv.S src/metag/ffi.c ++endif ++if VAX ++nodist_libffi_la_SOURCES += src/vax/elfbsd.S src/vax/ffi.c ++endif + + libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) + nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) + +-AM_CFLAGS = -Wall -g -fexceptions ++LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) ++ ++AM_CFLAGS = + if FFI_DEBUG + # Build debug. Define FFI_DEBUG on the commandline so that, when building with + # MSVC, it can link against the debug CRT. + AM_CFLAGS += -DFFI_DEBUG +-else +-# Build opt. +-AM_CFLAGS += -O2 + endif + +-libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) ++libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) + + AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + AM_CCASFLAGS = $(AM_CPPFLAGS) + +-# No install-html or install-pdf support in automake yet +-.PHONY: install-html install-pdf +-install-html: +-install-pdf: ++dist-hook: ++ if [ -d $(top_srcdir)/.git ] ; then git -C $(top_srcdir) log --no-decorate ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog +diff --git a/js/src/ctypes/libffi/Makefile.in b/js/src/ctypes/libffi/Makefile.in +--- a/js/src/ctypes/libffi/Makefile.in ++++ b/js/src/ctypes/libffi/Makefile.in +@@ -1,27 +1,71 @@ +-# Makefile.in generated by automake 1.11.1 from Makefile.am. ++# Makefile.in generated by automake 1.13.4 from Makefile.am. + # @configure_input@ + +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +-# Inc. ++# Copyright (C) 1994-2013 Free Software Foundation, Inc. ++ + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY, to the extent permitted by law; without + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + + @SET_MAKE@ + + + VPATH = @srcdir@ ++am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' ++am__make_running_with_option = \ ++ case $${target_option-} in \ ++ ?) ;; \ ++ *) echo "am__make_running_with_option: internal error: invalid" \ ++ "target option '$${target_option-}' specified" >&2; \ ++ exit 1;; \ ++ esac; \ ++ has_opt=no; \ ++ sane_makeflags=$$MAKEFLAGS; \ ++ if $(am__is_gnu_make); then \ ++ sane_makeflags=$$MFLAGS; \ ++ else \ ++ case $$MAKEFLAGS in \ ++ *\\[\ \ ]*) \ ++ bs=\\; \ ++ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ ++ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ ++ esac; \ ++ fi; \ ++ skip_next=no; \ ++ strip_trailopt () \ ++ { \ ++ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ ++ }; \ ++ for flg in $$sane_makeflags; do \ ++ test $$skip_next = yes && { skip_next=no; continue; }; \ ++ case $$flg in \ ++ *=*|--*) continue;; \ ++ -*I) strip_trailopt 'I'; skip_next=yes;; \ ++ -*I?*) strip_trailopt 'I';; \ ++ -*O) strip_trailopt 'O'; skip_next=yes;; \ ++ -*O?*) strip_trailopt 'O';; \ ++ -*l) strip_trailopt 'l'; skip_next=yes;; \ ++ -*l?*) strip_trailopt 'l';; \ ++ -[dEDm]) skip_next=yes;; \ ++ -[JT]) skip_next=yes;; \ ++ esac; \ ++ case $$flg in \ ++ *$$target_option*) has_opt=yes; break;; \ ++ esac; \ ++ done; \ ++ test $$has_opt = yes ++am__make_dryrun = (target_option=n; $(am__make_running_with_option)) ++am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) + pkgdatadir = $(datadir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkglibexecdir = $(libexecdir)/@PACKAGE@ + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +@@ -31,56 +75,79 @@ NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ + target_triplet = @target@ +-@MIPS_TRUE@am__append_1 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S +-@X86_TRUE@am__append_2 = src/x86/ffi.c src/x86/sysv.S +-@X86_FREEBSD_TRUE@am__append_3 = src/x86/ffi.c src/x86/freebsd.S +-@X86_WIN32_TRUE@am__append_4 = src/x86/ffi.c src/x86/win32.S +-@X86_WIN64_TRUE@am__append_5 = src/x86/ffi.c src/x86/win64.S +-@X86_DARWIN_TRUE@am__append_6 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S +-@SPARC_TRUE@am__append_7 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S +-@ALPHA_TRUE@am__append_8 = src/alpha/ffi.c src/alpha/osf.S +-@IA64_TRUE@am__append_9 = src/ia64/ffi.c src/ia64/unix.S +-@M32R_TRUE@am__append_10 = src/m32r/sysv.S src/m32r/ffi.c +-@M68K_TRUE@am__append_11 = src/m68k/ffi.c src/m68k/sysv.S +-@POWERPC_TRUE@am__append_12 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S +-@POWERPC_AIX_TRUE@am__append_13 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S +-@POWERPC_DARWIN_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S +-@POWERPC_FREEBSD_TRUE@am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +-@ARM_TRUE@am__append_16 = src/arm/sysv.S src/arm/ffi.c +-@AVR32_TRUE@am__append_17 = src/avr32/sysv.S src/avr32/ffi.c +-@LIBFFI_CRIS_TRUE@am__append_18 = src/cris/sysv.S src/cris/ffi.c +-@FRV_TRUE@am__append_19 = src/frv/eabi.S src/frv/ffi.c +-@MOXIE_TRUE@am__append_20 = src/moxie/eabi.S src/moxie/ffi.c +-@S390_TRUE@am__append_21 = src/s390/sysv.S src/s390/ffi.c +-@X86_64_TRUE@am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S +-@SH_TRUE@am__append_23 = src/sh/sysv.S src/sh/ffi.c +-@SH64_TRUE@am__append_24 = src/sh64/sysv.S src/sh64/ffi.c +-@PA_LINUX_TRUE@am__append_25 = src/pa/linux.S src/pa/ffi.c +-@PA_HPUX_TRUE@am__append_26 = src/pa/hpux32.S src/pa/ffi.c ++@FFI_DEBUG_TRUE@am__append_1 = src/debug.c ++@MIPS_TRUE@am__append_2 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S ++@BFIN_TRUE@am__append_3 = src/bfin/ffi.c src/bfin/sysv.S ++@X86_TRUE@am__append_4 = src/x86/ffi.c src/x86/sysv.S src/x86/win32.S ++@X86_FREEBSD_TRUE@am__append_5 = src/x86/ffi.c src/x86/freebsd.S src/x86/win32.S ++@X86_WIN32_TRUE@am__append_6 = src/x86/ffi.c src/x86/win32.S ++@X86_WIN64_TRUE@am__append_7 = src/x86/ffi.c src/x86/win64.S ++@X86_DARWIN_TRUE@am__append_8 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S ++@X86_DARWIN32_TRUE@@X86_DARWIN_TRUE@am__append_9 = src/x86/win32.S ++@SPARC_TRUE@am__append_10 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S ++@ALPHA_TRUE@am__append_11 = src/alpha/ffi.c src/alpha/osf.S ++@IA64_TRUE@am__append_12 = src/ia64/ffi.c src/ia64/unix.S ++@M32R_TRUE@am__append_13 = src/m32r/sysv.S src/m32r/ffi.c ++@M68K_TRUE@am__append_14 = src/m68k/ffi.c src/m68k/sysv.S ++@M88K_TRUE@am__append_15 = src/m88k/ffi.c src/m88k/obsd.S ++@MOXIE_TRUE@am__append_16 = src/moxie/ffi.c src/moxie/eabi.S ++@MICROBLAZE_TRUE@am__append_17 = src/microblaze/ffi.c src/microblaze/sysv.S ++@NIOS2_TRUE@am__append_18 = src/nios2/sysv.S src/nios2/ffi.c ++@POWERPC_TRUE@am__append_19 = src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S ++@POWERPC_AIX_TRUE@am__append_20 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S ++@POWERPC_DARWIN_TRUE@am__append_21 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S ++@POWERPC_FREEBSD_TRUE@am__append_22 = src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/sysv.S src/powerpc/ppc_closure.S ++@AARCH64_TRUE@am__append_23 = src/aarch64/sysv.S src/aarch64/ffi.c ++@ARC_TRUE@am__append_24 = src/arc/arcompact.S src/arc/ffi.c ++@ARM_TRUE@am__append_25 = src/arm/sysv.S src/arm/ffi.c ++@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_26 = src/arm/trampoline.S ++@AVR32_TRUE@am__append_27 = src/avr32/sysv.S src/avr32/ffi.c ++@LIBFFI_CRIS_TRUE@am__append_28 = src/cris/sysv.S src/cris/ffi.c ++@FRV_TRUE@am__append_29 = src/frv/eabi.S src/frv/ffi.c ++@S390_TRUE@am__append_30 = src/s390/sysv.S src/s390/ffi.c ++@X86_64_TRUE@am__append_31 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S ++@SH_TRUE@am__append_32 = src/sh/sysv.S src/sh/ffi.c ++@SH64_TRUE@am__append_33 = src/sh64/sysv.S src/sh64/ffi.c ++@PA_LINUX_TRUE@am__append_34 = src/pa/linux.S src/pa/ffi.c ++@PA_HPUX_TRUE@am__append_35 = src/pa/hpux32.S src/pa/ffi.c ++@TILE_TRUE@am__append_36 = src/tile/tile.S src/tile/ffi.c ++@XTENSA_TRUE@am__append_37 = src/xtensa/sysv.S src/xtensa/ffi.c ++@METAG_TRUE@am__append_38 = src/metag/sysv.S src/metag/ffi.c ++@VAX_TRUE@am__append_39 = src/vax/elfbsd.S src/vax/ffi.c + # Build debug. Define FFI_DEBUG on the commandline so that, when building with + # MSVC, it can link against the debug CRT. +-@FFI_DEBUG_TRUE@am__append_27 = -DFFI_DEBUG +-# Build opt. +-@FFI_DEBUG_FALSE@am__append_28 = -O2 ++@FFI_DEBUG_TRUE@am__append_40 = -DFFI_DEBUG + subdir = . +-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ +- $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \ +- $(srcdir)/doc/version.texi $(srcdir)/fficonfig.h.in \ +- $(srcdir)/libffi.pc.in $(top_srcdir)/configure ChangeLog \ +- compile config.guess config.sub depcomp install-sh ltmain.sh \ +- mdate-sh missing texinfo.tex ++DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ ++ $(top_srcdir)/configure $(am__configure_deps) \ ++ $(srcdir)/fficonfig.h.in $(srcdir)/libffi.pc.in depcomp \ ++ mdate-sh $(srcdir)/doc/version.texi $(srcdir)/doc/stamp-vti \ ++ texinfo.tex README compile config.guess config.sub install-sh \ ++ missing ltmain.sh + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ ++am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ ++ $(top_srcdir)/m4/ax_append_flag.m4 \ ++ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ ++ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ ++ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ ++ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ ++ $(top_srcdir)/m4/ax_configure_args.m4 \ ++ $(top_srcdir)/m4/ax_enable_builddir.m4 \ ++ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ ++ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ ++ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ ++ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ ++ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) + am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno + mkinstalldirs = $(install_sh) -d + CONFIG_HEADER = fficonfig.h + CONFIG_CLEAN_FILES = libffi.pc +@@ -101,149 +168,272 @@ am__nobase_list = $(am__nobase_strip_set + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' + am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" \ ++am__uninstall_files_from_dir = { \ ++ test -z "$$files" \ ++ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ ++ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ ++ $(am__cd) "$$dir" && rm -f $$files; }; \ ++ } ++am__installdirs = "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" \ + "$(DESTDIR)$(pkgconfigdir)" +-LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) ++LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) + libffi_la_LIBADD = + am__dirstamp = $(am__leading_dot)dirstamp +-am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ +- src/raw_api.lo src/java_raw_api.lo src/closures.lo +-@MIPS_TRUE@am__objects_1 = src/mips/ffi.lo src/mips/o32.lo \ ++am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ ++ src/java_raw_api.lo src/closures.lo ++@FFI_DEBUG_TRUE@am__objects_1 = src/debug.lo ++@MIPS_TRUE@am__objects_2 = src/mips/ffi.lo src/mips/o32.lo \ + @MIPS_TRUE@ src/mips/n32.lo +-@X86_TRUE@am__objects_2 = src/x86/ffi.lo src/x86/sysv.lo +-@X86_FREEBSD_TRUE@am__objects_3 = src/x86/ffi.lo src/x86/freebsd.lo +-@X86_WIN32_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/win32.lo +-@X86_WIN64_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/win64.lo +-@X86_DARWIN_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/darwin.lo \ ++@BFIN_TRUE@am__objects_3 = src/bfin/ffi.lo src/bfin/sysv.lo ++@X86_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/sysv.lo \ ++@X86_TRUE@ src/x86/win32.lo ++@X86_FREEBSD_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/freebsd.lo \ ++@X86_FREEBSD_TRUE@ src/x86/win32.lo ++@X86_WIN32_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win32.lo ++@X86_WIN64_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/win64.lo ++@X86_DARWIN_TRUE@am__objects_8 = src/x86/ffi.lo src/x86/darwin.lo \ + @X86_DARWIN_TRUE@ src/x86/ffi64.lo src/x86/darwin64.lo +-@SPARC_TRUE@am__objects_7 = src/sparc/ffi.lo src/sparc/v8.lo \ ++@X86_DARWIN32_TRUE@@X86_DARWIN_TRUE@am__objects_9 = src/x86/win32.lo ++@SPARC_TRUE@am__objects_10 = src/sparc/ffi.lo src/sparc/v8.lo \ + @SPARC_TRUE@ src/sparc/v9.lo +-@ALPHA_TRUE@am__objects_8 = src/alpha/ffi.lo src/alpha/osf.lo +-@IA64_TRUE@am__objects_9 = src/ia64/ffi.lo src/ia64/unix.lo +-@M32R_TRUE@am__objects_10 = src/m32r/sysv.lo src/m32r/ffi.lo +-@M68K_TRUE@am__objects_11 = src/m68k/ffi.lo src/m68k/sysv.lo +-@POWERPC_TRUE@am__objects_12 = src/powerpc/ffi.lo src/powerpc/sysv.lo \ ++@ALPHA_TRUE@am__objects_11 = src/alpha/ffi.lo src/alpha/osf.lo ++@IA64_TRUE@am__objects_12 = src/ia64/ffi.lo src/ia64/unix.lo ++@M32R_TRUE@am__objects_13 = src/m32r/sysv.lo src/m32r/ffi.lo ++@M68K_TRUE@am__objects_14 = src/m68k/ffi.lo src/m68k/sysv.lo ++@M88K_TRUE@am__objects_15 = src/m88k/ffi.lo src/m88k/obsd.lo ++@MOXIE_TRUE@am__objects_16 = src/moxie/ffi.lo src/moxie/eabi.lo ++@MICROBLAZE_TRUE@am__objects_17 = src/microblaze/ffi.lo \ ++@MICROBLAZE_TRUE@ src/microblaze/sysv.lo ++@NIOS2_TRUE@am__objects_18 = src/nios2/sysv.lo src/nios2/ffi.lo ++@POWERPC_TRUE@am__objects_19 = src/powerpc/ffi.lo \ ++@POWERPC_TRUE@ src/powerpc/ffi_sysv.lo \ ++@POWERPC_TRUE@ src/powerpc/ffi_linux64.lo src/powerpc/sysv.lo \ + @POWERPC_TRUE@ src/powerpc/ppc_closure.lo \ + @POWERPC_TRUE@ src/powerpc/linux64.lo \ + @POWERPC_TRUE@ src/powerpc/linux64_closure.lo +-@POWERPC_AIX_TRUE@am__objects_13 = src/powerpc/ffi_darwin.lo \ ++@POWERPC_AIX_TRUE@am__objects_20 = src/powerpc/ffi_darwin.lo \ + @POWERPC_AIX_TRUE@ src/powerpc/aix.lo \ + @POWERPC_AIX_TRUE@ src/powerpc/aix_closure.lo +-@POWERPC_DARWIN_TRUE@am__objects_14 = src/powerpc/ffi_darwin.lo \ ++@POWERPC_DARWIN_TRUE@am__objects_21 = src/powerpc/ffi_darwin.lo \ + @POWERPC_DARWIN_TRUE@ src/powerpc/darwin.lo \ + @POWERPC_DARWIN_TRUE@ src/powerpc/darwin_closure.lo +-@POWERPC_FREEBSD_TRUE@am__objects_15 = src/powerpc/ffi.lo \ ++@POWERPC_FREEBSD_TRUE@am__objects_22 = src/powerpc/ffi.lo \ ++@POWERPC_FREEBSD_TRUE@ src/powerpc/ffi_sysv.lo \ + @POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \ + @POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo +-@ARM_TRUE@am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo +-@AVR32_TRUE@am__objects_17 = src/avr32/sysv.lo src/avr32/ffi.lo +-@LIBFFI_CRIS_TRUE@am__objects_18 = src/cris/sysv.lo src/cris/ffi.lo +-@FRV_TRUE@am__objects_19 = src/frv/eabi.lo src/frv/ffi.lo +-@MOXIE_TRUE@am__objects_20 = src/moxie/eabi.lo src/moxie/ffi.lo +-@S390_TRUE@am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo +-@X86_64_TRUE@am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \ ++@AARCH64_TRUE@am__objects_23 = src/aarch64/sysv.lo src/aarch64/ffi.lo ++@ARC_TRUE@am__objects_24 = src/arc/arcompact.lo src/arc/ffi.lo ++@ARM_TRUE@am__objects_25 = src/arm/sysv.lo src/arm/ffi.lo ++@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_26 = src/arm/trampoline.lo ++@AVR32_TRUE@am__objects_27 = src/avr32/sysv.lo src/avr32/ffi.lo ++@LIBFFI_CRIS_TRUE@am__objects_28 = src/cris/sysv.lo src/cris/ffi.lo ++@FRV_TRUE@am__objects_29 = src/frv/eabi.lo src/frv/ffi.lo ++@S390_TRUE@am__objects_30 = src/s390/sysv.lo src/s390/ffi.lo ++@X86_64_TRUE@am__objects_31 = src/x86/ffi64.lo src/x86/unix64.lo \ + @X86_64_TRUE@ src/x86/ffi.lo src/x86/sysv.lo +-@SH_TRUE@am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo +-@SH64_TRUE@am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo +-@PA_LINUX_TRUE@am__objects_25 = src/pa/linux.lo src/pa/ffi.lo +-@PA_HPUX_TRUE@am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo ++@SH_TRUE@am__objects_32 = src/sh/sysv.lo src/sh/ffi.lo ++@SH64_TRUE@am__objects_33 = src/sh64/sysv.lo src/sh64/ffi.lo ++@PA_LINUX_TRUE@am__objects_34 = src/pa/linux.lo src/pa/ffi.lo ++@PA_HPUX_TRUE@am__objects_35 = src/pa/hpux32.lo src/pa/ffi.lo ++@TILE_TRUE@am__objects_36 = src/tile/tile.lo src/tile/ffi.lo ++@XTENSA_TRUE@am__objects_37 = src/xtensa/sysv.lo src/xtensa/ffi.lo ++@METAG_TRUE@am__objects_38 = src/metag/sysv.lo src/metag/ffi.lo ++@VAX_TRUE@am__objects_39 = src/vax/elfbsd.lo src/vax/ffi.lo + nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ + $(am__objects_9) $(am__objects_10) $(am__objects_11) \ + $(am__objects_12) $(am__objects_13) $(am__objects_14) \ + $(am__objects_15) $(am__objects_16) $(am__objects_17) \ + $(am__objects_18) $(am__objects_19) $(am__objects_20) \ + $(am__objects_21) $(am__objects_22) $(am__objects_23) \ +- $(am__objects_24) $(am__objects_25) $(am__objects_26) ++ $(am__objects_24) $(am__objects_25) $(am__objects_26) \ ++ $(am__objects_27) $(am__objects_28) $(am__objects_29) \ ++ $(am__objects_30) $(am__objects_31) $(am__objects_32) \ ++ $(am__objects_33) $(am__objects_34) $(am__objects_35) \ ++ $(am__objects_36) $(am__objects_37) $(am__objects_38) \ ++ $(am__objects_39) + libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ + $(nodist_libffi_la_OBJECTS) +-libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ ++AM_V_lt = $(am__v_lt_@AM_V@) ++am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) ++am__v_lt_0 = --silent ++am__v_lt_1 = ++libffi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ + libffi_convenience_la_LIBADD = +-am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \ +- src/raw_api.lo src/java_raw_api.lo src/closures.lo +-am_libffi_convenience_la_OBJECTS = $(am__objects_27) +-am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ ++am__objects_40 = src/prep_cif.lo src/types.lo src/raw_api.lo \ ++ src/java_raw_api.lo src/closures.lo ++am_libffi_convenience_la_OBJECTS = $(am__objects_40) ++am__objects_41 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) $(am__objects_18) \ + $(am__objects_19) $(am__objects_20) $(am__objects_21) \ + $(am__objects_22) $(am__objects_23) $(am__objects_24) \ +- $(am__objects_25) $(am__objects_26) +-nodist_libffi_convenience_la_OBJECTS = $(am__objects_28) ++ $(am__objects_25) $(am__objects_26) $(am__objects_27) \ ++ $(am__objects_28) $(am__objects_29) $(am__objects_30) \ ++ $(am__objects_31) $(am__objects_32) $(am__objects_33) \ ++ $(am__objects_34) $(am__objects_35) $(am__objects_36) \ ++ $(am__objects_37) $(am__objects_38) $(am__objects_39) ++nodist_libffi_convenience_la_OBJECTS = $(am__objects_41) + libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ + $(nodist_libffi_convenience_la_OBJECTS) ++AM_V_P = $(am__v_P_@AM_V@) ++am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) ++am__v_P_0 = false ++am__v_P_1 = : ++AM_V_GEN = $(am__v_GEN_@AM_V@) ++am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) ++am__v_GEN_0 = @echo " GEN " $@; ++am__v_GEN_1 = ++AM_V_at = $(am__v_at_@AM_V@) ++am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) ++am__v_at_0 = @ ++am__v_at_1 = + DEFAULT_INCLUDES = -I.@am__isrc@ + depcomp = $(SHELL) $(top_srcdir)/depcomp + am__depfiles_maybe = depfiles + am__mv = mv -f + CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +-LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +- --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ +- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) ++LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ ++ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ ++ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ ++ $(AM_CCASFLAGS) $(CCASFLAGS) ++AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) ++am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) ++am__v_CPPAS_0 = @echo " CPPAS " $@; ++am__v_CPPAS_1 = + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +- --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ +- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ ++ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ ++ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ ++ $(AM_CFLAGS) $(CFLAGS) ++AM_V_CC = $(am__v_CC_@AM_V@) ++am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) ++am__v_CC_0 = @echo " CC " $@; ++am__v_CC_1 = + CCLD = $(CC) +-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +- --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ +- $(LDFLAGS) -o $@ ++LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ ++ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++ $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++AM_V_CCLD = $(am__v_CCLD_@AM_V@) ++am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) ++am__v_CCLD_0 = @echo " CCLD " $@; ++am__v_CCLD_1 = + SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \ + $(libffi_convenience_la_SOURCES) \ + $(nodist_libffi_convenience_la_SOURCES) + DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES) +-INFO_DEPS = ++AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) ++am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) ++am__v_DVIPS_0 = @echo " DVIPS " $@; ++am__v_DVIPS_1 = ++AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) ++am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) ++am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; ++am__v_MAKEINFO_1 = ++AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) ++am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) ++am__v_INFOHTML_0 = @echo " INFOHTML" $@; ++am__v_INFOHTML_1 = ++AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) ++am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) ++am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; ++am__v_TEXI2DVI_1 = ++AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) ++am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) ++am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; ++am__v_TEXI2PDF_1 = ++AM_V_texinfo = $(am__v_texinfo_@AM_V@) ++am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) ++am__v_texinfo_0 = -q ++am__v_texinfo_1 = ++AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) ++am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) ++am__v_texidevnull_0 = > /dev/null ++am__v_texidevnull_1 = ++INFO_DEPS = $(srcdir)/doc/libffi.info + am__TEXINFO_TEX_DIR = $(srcdir) + DVIS = doc/libffi.dvi + PDFS = doc/libffi.pdf + PSS = doc/libffi.ps + HTMLS = doc/libffi.html + TEXINFOS = doc/libffi.texi + TEXI2DVI = texi2dvi + TEXI2PDF = $(TEXI2DVI) --pdf --batch + MAKEINFOHTML = $(MAKEINFO) --html + AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) + DVIPS = dvips +-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ +- html-recursive info-recursive install-data-recursive \ +- install-dvi-recursive install-exec-recursive \ +- install-html-recursive install-info-recursive \ +- install-pdf-recursive install-ps-recursive install-recursive \ +- installcheck-recursive installdirs-recursive pdf-recursive \ +- ps-recursive uninstall-recursive ++RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ++ ctags-recursive dvi-recursive html-recursive info-recursive \ ++ install-data-recursive install-dvi-recursive \ ++ install-exec-recursive install-html-recursive \ ++ install-info-recursive install-pdf-recursive \ ++ install-ps-recursive install-recursive installcheck-recursive \ ++ installdirs-recursive pdf-recursive ps-recursive \ ++ tags-recursive uninstall-recursive ++am__can_run_installinfo = \ ++ case $$AM_UPDATE_INFO_DIR in \ ++ n|no|NO) false;; \ ++ *) (install-info --version) >/dev/null 2>&1;; \ ++ esac + DATA = $(pkgconfig_DATA) + RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ +- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ +- distdir dist dist-all distcheck ++am__recursive_targets = \ ++ $(RECURSIVE_TARGETS) \ ++ $(RECURSIVE_CLEAN_TARGETS) \ ++ $(am__extra_recursive_targets) ++AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ ++ cscope distdir dist dist-all distcheck ++am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ ++ $(LISP)fficonfig.h.in ++# Read a list of newline-separated strings from the standard input, ++# and print each of them once, without duplicates. Input order is ++# *not* preserved. ++am__uniquify_input = $(AWK) '\ ++ BEGIN { nonempty = 0; } \ ++ { items[$$0] = 1; nonempty = 1; } \ ++ END { if (nonempty) { for (i in items) print i; }; } \ ++' ++# Make sure the list of sources is unique. This is necessary because, ++# e.g., the same source file might be shared among _SOURCES variables ++# for different programs/libraries. ++am__define_uniq_tagged_files = \ ++ list='$(am__tagged_files)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | $(am__uniquify_input)` + ETAGS = etags + CTAGS = ctags ++CSCOPE = cscope + DIST_SUBDIRS = $(SUBDIRS) + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + distdir = $(PACKAGE)-$(VERSION) + top_distdir = $(distdir) + am__remove_distdir = \ +- { test ! -d "$(distdir)" \ +- || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ +- && rm -fr "$(distdir)"; }; } ++ if test -d "$(distdir)"; then \ ++ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ ++ && rm -rf "$(distdir)" \ ++ || { sleep 5 && rm -rf "$(distdir)"; }; \ ++ else :; fi ++am__post_remove_distdir = $(am__remove_distdir) + am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ +@@ -261,21 +451,25 @@ am__relativize = \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" + DIST_ARCHIVES = $(distdir).tar.gz + GZIP_ENV = --best ++DIST_TARGETS = dist-gzip + distuninstallcheck_listfiles = find . -type f -print ++am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ ++ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' + distcleancheck_listfiles = find . -type f -print + ACLOCAL = @ACLOCAL@ + ALLOCA = @ALLOCA@ + AMTAR = @AMTAR@ ++AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ + AM_LTLDFLAGS = @AM_LTLDFLAGS@ + AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ + AR = @AR@ + AUTOCONF = @AUTOCONF@ + AUTOHEADER = @AUTOHEADER@ + AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ + CC = @CC@ +@@ -284,75 +478,82 @@ CCASDEPMODE = @CCASDEPMODE@ + CCASFLAGS = @CCASFLAGS@ + CCDEPMODE = @CCDEPMODE@ + CFLAGS = @CFLAGS@ + CPP = @CPP@ + CPPFLAGS = @CPPFLAGS@ + CYGPATH_W = @CYGPATH_W@ + DEFS = @DEFS@ + DEPDIR = @DEPDIR@ ++DLLTOOL = @DLLTOOL@ + DSYMUTIL = @DSYMUTIL@ + DUMPBIN = @DUMPBIN@ + ECHO_C = @ECHO_C@ + ECHO_N = @ECHO_N@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + EXEEXT = @EXEEXT@ ++FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ + FGREP = @FGREP@ + GREP = @GREP@ + HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ ++HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ + INSTALL = @INSTALL@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LD = @LD@ + LDFLAGS = @LDFLAGS@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LIPO = @LIPO@ + LN_S = @LN_S@ + LTLIBOBJS = @LTLIBOBJS@ + MAINT = @MAINT@ + MAKEINFO = @MAKEINFO@ ++MANIFEST_TOOL = @MANIFEST_TOOL@ + MKDIR_P = @MKDIR_P@ + NM = @NM@ + NMEDIT = @NMEDIT@ + OBJDUMP = @OBJDUMP@ + OBJEXT = @OBJEXT@ + OTOOL = @OTOOL@ + OTOOL64 = @OTOOL64@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ + PACKAGE_STRING = @PACKAGE_STRING@ + PACKAGE_TARNAME = @PACKAGE_TARNAME@ + PACKAGE_URL = @PACKAGE_URL@ + PACKAGE_VERSION = @PACKAGE_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ ++PRTDIAG = @PRTDIAG@ + RANLIB = @RANLIB@ + SED = @SED@ + SET_MAKE = @SET_MAKE@ + SHELL = @SHELL@ + STRIP = @STRIP@ + TARGET = @TARGET@ + TARGETDIR = @TARGETDIR@ + VERSION = @VERSION@ + abs_builddir = @abs_builddir@ + abs_srcdir = @abs_srcdir@ + abs_top_builddir = @abs_top_builddir@ + abs_top_srcdir = @abs_top_srcdir@ ++ac_ct_AR = @ac_ct_AR@ + ac_ct_CC = @ac_ct_CC@ + ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ + am__include = @am__include@ + am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ + am__tar = @am__tar@ + am__untar = @am__untar@ ++ax_enable_builddir_sed = @ax_enable_builddir_sed@ + bindir = @bindir@ + build = @build@ + build_alias = @build_alias@ + build_cpu = @build_cpu@ + build_os = @build_os@ + build_vendor = @build_vendor@ + builddir = @builddir@ + datadir = @datadir@ +@@ -368,69 +569,86 @@ host_vendor = @host_vendor@ + htmldir = @htmldir@ + includedir = @includedir@ + infodir = @infodir@ + install_sh = @install_sh@ + libdir = @libdir@ + libexecdir = @libexecdir@ + localedir = @localedir@ + localstatedir = @localstatedir@ +-lt_ECHO = @lt_ECHO@ + mandir = @mandir@ + mkdir_p = @mkdir_p@ + oldincludedir = @oldincludedir@ + pdfdir = @pdfdir@ + prefix = @prefix@ + program_transform_name = @program_transform_name@ + psdir = @psdir@ + sbindir = @sbindir@ + sharedstatedir = @sharedstatedir@ + srcdir = @srcdir@ ++sys_symbol_underscore = @sys_symbol_underscore@ + sysconfdir = @sysconfdir@ + target = @target@ + target_alias = @target_alias@ + target_cpu = @target_cpu@ + target_os = @target_os@ + target_vendor = @target_vendor@ + toolexecdir = @toolexecdir@ + toolexeclibdir = @toolexeclibdir@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + AUTOMAKE_OPTIONS = foreign subdir-objects ++ACLOCAL_AMFLAGS = -I m4 + SUBDIRS = include testsuite man +-EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ +- src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ +- src/arm/ffi.c src/arm/sysv.S src/arm/ffitarget.h \ +- src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \ +- src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \ +- src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \ +- src/ia64/unix.S \ +- src/mips/ffi.c src/mips/n32.S src/mips/o32.S \ +- src/mips/ffitarget.h \ +- src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ +- src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ +- src/powerpc/ffi.c src/powerpc/sysv.S \ +- src/powerpc/linux64.S src/powerpc/linux64_closure.S \ +- src/powerpc/ppc_closure.S src/powerpc/asm.h \ +- src/powerpc/aix.S src/powerpc/darwin.S \ +- src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ +- src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ +- src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ +- src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h \ +- src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h \ +- src/sparc/v8.S src/sparc/v9.S src/sparc/ffitarget.h \ +- src/sparc/ffi.c src/x86/darwin64.S \ +- src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/win64.S \ +- src/x86/darwin.S src/x86/freebsd.S \ +- src/x86/ffi64.c src/x86/unix64.S src/x86/ffitarget.h \ +- src/pa/ffitarget.h src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ +- src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \ +- libtool-version ChangeLog.libffi m4/libtool.m4 \ +- m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 ++EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ ++ src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \ ++ src/alpha/ffi.c src/alpha/osf.S \ ++ src/alpha/ffitarget.h src/arc/ffi.c src/arc/arcompact.S \ ++ src/arc/ffitarget.h src/arm/ffi.c src/arm/sysv.S \ ++ src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ ++ src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ ++ src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ ++ src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ ++ src/mips/n32.S src/mips/o32.S src/metag/ffi.c \ ++ src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \ ++ src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \ ++ src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ ++ src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ ++ src/m88k/ffi.c src/m88k/obsd.S src/m88k/ffitarget.h \ ++ src/microblaze/ffi.c src/microblaze/sysv.S \ ++ src/microblaze/ffitarget.h \ ++ src/nios2/ffi.c src/nios2/ffitarget.h src/nios2/sysv.S \ ++ src/powerpc/ffi.c src/powerpc/ffi_powerpc.h \ ++ src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \ ++ src/powerpc/sysv.S src/powerpc/linux64.S \ ++ src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ ++ src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ ++ src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ ++ src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ ++ src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ ++ src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ ++ src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ ++ src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ ++ src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ ++ src/x86/win32.S src/x86/darwin.S src/x86/win64.S \ ++ src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ ++ src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ ++ src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/bfin/ffi.c \ ++ src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S \ ++ src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c \ ++ src/tile/ffitarget.h src/tile/tile.S libtool-version \ ++ src/vax/ffi.c src/vax/ffitarget.h src/vax/elfbsd.S \ ++ src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S \ ++ ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ ++ m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ ++ m4/ltversion.m4 src/arm/gentramp.sh src/debug.c msvcc.sh \ ++ generate-darwin-source-and-headers.py \ ++ libffi.xcodeproj/project.pbxproj src/arm/trampoline.S \ ++ libtool-ldflags ChangeLog.libffi-3.1 + + info_TEXINFOS = doc/libffi.texi + + # Work around what appears to be a GNU make bug handling MAKEFLAGS + # values defined in terms of make variables, as is the case for CC and + # friends when we are called from the top level Makefile. + AM_MAKEFLAGS = \ + 'AR_FLAGS=$(AR_FLAGS)' \ +@@ -462,46 +680,54 @@ AM_MAKEFLAGS = \ + 'AS=$(AS)' \ + 'CC=$(CC)' \ + 'CXX=$(CXX)' \ + 'LD=$(LD)' \ + 'NM=$(NM)' \ + 'RANLIB=$(RANLIB)' \ + 'DESTDIR=$(DESTDIR)' + ++ ++# Subdir rules rely on $(FLAGS_TO_PASS) ++FLAGS_TO_PASS = $(AM_MAKEFLAGS) + MAKEOVERRIDES = +-ACLOCAL_AMFLAGS = $(ACLOCAL_AMFLAGS) -I m4 +-lib_LTLIBRARIES = libffi.la ++toolexeclib_LTLIBRARIES = libffi.la + noinst_LTLIBRARIES = libffi_convenience.la +-libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \ ++libffi_la_SOURCES = src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c + + pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = libffi.pc + nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) \ + $(am__append_6) $(am__append_7) $(am__append_8) \ + $(am__append_9) $(am__append_10) $(am__append_11) \ + $(am__append_12) $(am__append_13) $(am__append_14) \ + $(am__append_15) $(am__append_16) $(am__append_17) \ + $(am__append_18) $(am__append_19) $(am__append_20) \ + $(am__append_21) $(am__append_22) $(am__append_23) \ +- $(am__append_24) $(am__append_25) $(am__append_26) ++ $(am__append_24) $(am__append_25) $(am__append_26) \ ++ $(am__append_27) $(am__append_28) $(am__append_29) \ ++ $(am__append_30) $(am__append_31) $(am__append_32) \ ++ $(am__append_33) $(am__append_34) $(am__append_35) \ ++ $(am__append_36) $(am__append_37) $(am__append_38) \ ++ $(am__append_39) + libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) + nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) +-AM_CFLAGS = -Wall -g -fexceptions $(am__append_27) $(am__append_28) +-libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) ++LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) ++AM_CFLAGS = $(am__append_40) ++libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) + AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + AM_CCASFLAGS = $(AM_CPPFLAGS) + all: fficonfig.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + + .SUFFIXES: + .SUFFIXES: .S .c .dvi .lo .o .obj .ps +-am--refresh: ++am--refresh: Makefile + @: + $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ +@@ -527,111 +753,125 @@ Makefile: $(srcdir)/Makefile.in $(top_bu + + $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) + $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + $(am__aclocal_m4_deps): + + fficonfig.h: stamp-h1 +- @if test ! -f $@; then \ +- rm -f stamp-h1; \ +- $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ +- else :; fi ++ @if test ! -f $@; then rm -f stamp-h1; else :; fi ++ @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + + stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h + $(srcdir)/fficonfig.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + + distclean-hdr: + -rm -f fficonfig.h stamp-h1 + libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +-install-libLTLIBRARIES: $(lib_LTLIBRARIES) ++ ++clean-noinstLTLIBRARIES: ++ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) ++ @list='$(noinst_LTLIBRARIES)'; \ ++ locs=`for p in $$list; do echo $$p; done | \ ++ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ ++ sort -u`; \ ++ test -z "$$locs" || { \ ++ echo rm -f $${locs}; \ ++ rm -f $${locs}; \ ++ } ++ ++install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) + @$(NORMAL_INSTALL) +- test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" +- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ ++ @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ +- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ +- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ ++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \ ++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \ + } + +-uninstall-libLTLIBRARIES: ++uninstall-toolexeclibLTLIBRARIES: + @$(NORMAL_UNINSTALL) +- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ ++ @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ +- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ +- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ ++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \ ++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \ + done + +-clean-libLTLIBRARIES: +- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) +- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test "$$dir" != "$$p" || dir=.; \ +- echo "rm -f \"$${dir}/so_locations\""; \ +- rm -f "$${dir}/so_locations"; \ +- done +- +-clean-noinstLTLIBRARIES: +- -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) +- @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ +- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test "$$dir" != "$$p" || dir=.; \ +- echo "rm -f \"$${dir}/so_locations\""; \ +- rm -f "$${dir}/so_locations"; \ +- done ++clean-toolexeclibLTLIBRARIES: ++ -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) ++ @list='$(toolexeclib_LTLIBRARIES)'; \ ++ locs=`for p in $$list; do echo $$p; done | \ ++ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ ++ sort -u`; \ ++ test -z "$$locs" || { \ ++ echo rm -f $${locs}; \ ++ rm -f $${locs}; \ ++ } + src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) + src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +-src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) + src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) + src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) + src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) + src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) + src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) ++src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) + src/mips/$(am__dirstamp): + @$(MKDIR_P) src/mips + @: > src/mips/$(am__dirstamp) + src/mips/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/mips/$(DEPDIR) + @: > src/mips/$(DEPDIR)/$(am__dirstamp) + src/mips/ffi.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) + src/mips/o32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) + src/mips/n32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) ++src/bfin/$(am__dirstamp): ++ @$(MKDIR_P) src/bfin ++ @: > src/bfin/$(am__dirstamp) ++src/bfin/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/bfin/$(DEPDIR) ++ @: > src/bfin/$(DEPDIR)/$(am__dirstamp) ++src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ ++ src/bfin/$(DEPDIR)/$(am__dirstamp) ++src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ ++ src/bfin/$(DEPDIR)/$(am__dirstamp) + src/x86/$(am__dirstamp): + @$(MKDIR_P) src/x86 + @: > src/x86/$(am__dirstamp) + src/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/x86/$(DEPDIR) + @: > src/x86/$(DEPDIR)/$(am__dirstamp) + src/x86/ffi.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) + src/x86/sysv.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) ++src/x86/win32.lo: src/x86/$(am__dirstamp) \ ++ src/x86/$(DEPDIR)/$(am__dirstamp) + src/x86/freebsd.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +-src/x86/win32.lo: src/x86/$(am__dirstamp) \ +- src/x86/$(DEPDIR)/$(am__dirstamp) + src/x86/win64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) + src/x86/darwin.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) + src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) + src/x86/darwin64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +@@ -682,24 +922,68 @@ src/m68k/$(am__dirstamp): + @: > src/m68k/$(am__dirstamp) + src/m68k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m68k/$(DEPDIR) + @: > src/m68k/$(DEPDIR)/$(am__dirstamp) + src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) + src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) ++src/m88k/$(am__dirstamp): ++ @$(MKDIR_P) src/m88k ++ @: > src/m88k/$(am__dirstamp) ++src/m88k/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/m88k/$(DEPDIR) ++ @: > src/m88k/$(DEPDIR)/$(am__dirstamp) ++src/m88k/ffi.lo: src/m88k/$(am__dirstamp) \ ++ src/m88k/$(DEPDIR)/$(am__dirstamp) ++src/m88k/obsd.lo: src/m88k/$(am__dirstamp) \ ++ src/m88k/$(DEPDIR)/$(am__dirstamp) ++src/moxie/$(am__dirstamp): ++ @$(MKDIR_P) src/moxie ++ @: > src/moxie/$(am__dirstamp) ++src/moxie/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/moxie/$(DEPDIR) ++ @: > src/moxie/$(DEPDIR)/$(am__dirstamp) ++src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \ ++ src/moxie/$(DEPDIR)/$(am__dirstamp) ++src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \ ++ src/moxie/$(DEPDIR)/$(am__dirstamp) ++src/microblaze/$(am__dirstamp): ++ @$(MKDIR_P) src/microblaze ++ @: > src/microblaze/$(am__dirstamp) ++src/microblaze/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/microblaze/$(DEPDIR) ++ @: > src/microblaze/$(DEPDIR)/$(am__dirstamp) ++src/microblaze/ffi.lo: src/microblaze/$(am__dirstamp) \ ++ src/microblaze/$(DEPDIR)/$(am__dirstamp) ++src/microblaze/sysv.lo: src/microblaze/$(am__dirstamp) \ ++ src/microblaze/$(DEPDIR)/$(am__dirstamp) ++src/nios2/$(am__dirstamp): ++ @$(MKDIR_P) src/nios2 ++ @: > src/nios2/$(am__dirstamp) ++src/nios2/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/nios2/$(DEPDIR) ++ @: > src/nios2/$(DEPDIR)/$(am__dirstamp) ++src/nios2/sysv.lo: src/nios2/$(am__dirstamp) \ ++ src/nios2/$(DEPDIR)/$(am__dirstamp) ++src/nios2/ffi.lo: src/nios2/$(am__dirstamp) \ ++ src/nios2/$(DEPDIR)/$(am__dirstamp) + src/powerpc/$(am__dirstamp): + @$(MKDIR_P) src/powerpc + @: > src/powerpc/$(am__dirstamp) + src/powerpc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/powerpc/$(DEPDIR) + @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) ++src/powerpc/ffi_sysv.lo: src/powerpc/$(am__dirstamp) \ ++ src/powerpc/$(DEPDIR)/$(am__dirstamp) ++src/powerpc/ffi_linux64.lo: src/powerpc/$(am__dirstamp) \ ++ src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +@@ -708,26 +992,48 @@ src/powerpc/ffi_darwin.lo: src/powerpc/$ + src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) + src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) ++src/aarch64/$(am__dirstamp): ++ @$(MKDIR_P) src/aarch64 ++ @: > src/aarch64/$(am__dirstamp) ++src/aarch64/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/aarch64/$(DEPDIR) ++ @: > src/aarch64/$(DEPDIR)/$(am__dirstamp) ++src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \ ++ src/aarch64/$(DEPDIR)/$(am__dirstamp) ++src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \ ++ src/aarch64/$(DEPDIR)/$(am__dirstamp) ++src/arc/$(am__dirstamp): ++ @$(MKDIR_P) src/arc ++ @: > src/arc/$(am__dirstamp) ++src/arc/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/arc/$(DEPDIR) ++ @: > src/arc/$(DEPDIR)/$(am__dirstamp) ++src/arc/arcompact.lo: src/arc/$(am__dirstamp) \ ++ src/arc/$(DEPDIR)/$(am__dirstamp) ++src/arc/ffi.lo: src/arc/$(am__dirstamp) \ ++ src/arc/$(DEPDIR)/$(am__dirstamp) + src/arm/$(am__dirstamp): + @$(MKDIR_P) src/arm + @: > src/arm/$(am__dirstamp) + src/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/arm/$(DEPDIR) + @: > src/arm/$(DEPDIR)/$(am__dirstamp) + src/arm/sysv.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) + src/arm/ffi.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) ++src/arm/trampoline.lo: src/arm/$(am__dirstamp) \ ++ src/arm/$(DEPDIR)/$(am__dirstamp) + src/avr32/$(am__dirstamp): + @$(MKDIR_P) src/avr32 + @: > src/avr32/$(am__dirstamp) + src/avr32/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/avr32/$(DEPDIR) + @: > src/avr32/$(DEPDIR)/$(am__dirstamp) + src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +@@ -748,26 +1054,16 @@ src/frv/$(am__dirstamp): + @: > src/frv/$(am__dirstamp) + src/frv/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/frv/$(DEPDIR) + @: > src/frv/$(DEPDIR)/$(am__dirstamp) + src/frv/eabi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) + src/frv/ffi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +-src/moxie/$(am__dirstamp): +- @$(MKDIR_P) src/moxie +- @: > src/moxie/$(am__dirstamp) +-src/moxie/$(DEPDIR)/$(am__dirstamp): +- @$(MKDIR_P) src/moxie/$(DEPDIR) +- @: > src/moxie/$(DEPDIR)/$(am__dirstamp) +-src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \ +- src/moxie/$(DEPDIR)/$(am__dirstamp) +-src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \ +- src/moxie/$(DEPDIR)/$(am__dirstamp) + src/s390/$(am__dirstamp): + @$(MKDIR_P) src/s390 + @: > src/s390/$(am__dirstamp) + src/s390/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/s390/$(DEPDIR) + @: > src/s390/$(DEPDIR)/$(am__dirstamp) + src/s390/sysv.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +@@ -800,282 +1096,297 @@ src/pa/$(am__dirstamp): + src/pa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/pa/$(DEPDIR) + @: > src/pa/$(DEPDIR)/$(am__dirstamp) + src/pa/linux.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) + src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) + src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +-libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) +- $(libffi_la_LINK) -rpath $(libdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) +-libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) +- $(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) ++src/tile/$(am__dirstamp): ++ @$(MKDIR_P) src/tile ++ @: > src/tile/$(am__dirstamp) ++src/tile/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/tile/$(DEPDIR) ++ @: > src/tile/$(DEPDIR)/$(am__dirstamp) ++src/tile/tile.lo: src/tile/$(am__dirstamp) \ ++ src/tile/$(DEPDIR)/$(am__dirstamp) ++src/tile/ffi.lo: src/tile/$(am__dirstamp) \ ++ src/tile/$(DEPDIR)/$(am__dirstamp) ++src/xtensa/$(am__dirstamp): ++ @$(MKDIR_P) src/xtensa ++ @: > src/xtensa/$(am__dirstamp) ++src/xtensa/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/xtensa/$(DEPDIR) ++ @: > src/xtensa/$(DEPDIR)/$(am__dirstamp) ++src/xtensa/sysv.lo: src/xtensa/$(am__dirstamp) \ ++ src/xtensa/$(DEPDIR)/$(am__dirstamp) ++src/xtensa/ffi.lo: src/xtensa/$(am__dirstamp) \ ++ src/xtensa/$(DEPDIR)/$(am__dirstamp) ++src/metag/$(am__dirstamp): ++ @$(MKDIR_P) src/metag ++ @: > src/metag/$(am__dirstamp) ++src/metag/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/metag/$(DEPDIR) ++ @: > src/metag/$(DEPDIR)/$(am__dirstamp) ++src/metag/sysv.lo: src/metag/$(am__dirstamp) \ ++ src/metag/$(DEPDIR)/$(am__dirstamp) ++src/metag/ffi.lo: src/metag/$(am__dirstamp) \ ++ src/metag/$(DEPDIR)/$(am__dirstamp) ++src/vax/$(am__dirstamp): ++ @$(MKDIR_P) src/vax ++ @: > src/vax/$(am__dirstamp) ++src/vax/$(DEPDIR)/$(am__dirstamp): ++ @$(MKDIR_P) src/vax/$(DEPDIR) ++ @: > src/vax/$(DEPDIR)/$(am__dirstamp) ++src/vax/elfbsd.lo: src/vax/$(am__dirstamp) \ ++ src/vax/$(DEPDIR)/$(am__dirstamp) ++src/vax/ffi.lo: src/vax/$(am__dirstamp) \ ++ src/vax/$(DEPDIR)/$(am__dirstamp) ++ ++libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(EXTRA_libffi_la_DEPENDENCIES) ++ $(AM_V_CCLD)$(libffi_la_LINK) -rpath $(toolexeclibdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) ++ ++libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) $(EXTRA_libffi_convenience_la_DEPENDENCIES) ++ $(AM_V_CCLD)$(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) + + mostlyclean-compile: + -rm -f *.$(OBJEXT) +- -rm -f src/alpha/ffi.$(OBJEXT) +- -rm -f src/alpha/ffi.lo +- -rm -f src/alpha/osf.$(OBJEXT) +- -rm -f src/alpha/osf.lo +- -rm -f src/arm/ffi.$(OBJEXT) +- -rm -f src/arm/ffi.lo +- -rm -f src/arm/sysv.$(OBJEXT) +- -rm -f src/arm/sysv.lo +- -rm -f src/avr32/ffi.$(OBJEXT) +- -rm -f src/avr32/ffi.lo +- -rm -f src/avr32/sysv.$(OBJEXT) +- -rm -f src/avr32/sysv.lo +- -rm -f src/closures.$(OBJEXT) +- -rm -f src/closures.lo +- -rm -f src/cris/ffi.$(OBJEXT) +- -rm -f src/cris/ffi.lo +- -rm -f src/cris/sysv.$(OBJEXT) +- -rm -f src/cris/sysv.lo +- -rm -f src/debug.$(OBJEXT) +- -rm -f src/debug.lo +- -rm -f src/frv/eabi.$(OBJEXT) +- -rm -f src/frv/eabi.lo +- -rm -f src/frv/ffi.$(OBJEXT) +- -rm -f src/frv/ffi.lo +- -rm -f src/ia64/ffi.$(OBJEXT) +- -rm -f src/ia64/ffi.lo +- -rm -f src/ia64/unix.$(OBJEXT) +- -rm -f src/ia64/unix.lo +- -rm -f src/java_raw_api.$(OBJEXT) +- -rm -f src/java_raw_api.lo +- -rm -f src/m32r/ffi.$(OBJEXT) +- -rm -f src/m32r/ffi.lo +- -rm -f src/m32r/sysv.$(OBJEXT) +- -rm -f src/m32r/sysv.lo +- -rm -f src/m68k/ffi.$(OBJEXT) +- -rm -f src/m68k/ffi.lo +- -rm -f src/m68k/sysv.$(OBJEXT) +- -rm -f src/m68k/sysv.lo +- -rm -f src/mips/ffi.$(OBJEXT) +- -rm -f src/mips/ffi.lo +- -rm -f src/mips/n32.$(OBJEXT) +- -rm -f src/mips/n32.lo +- -rm -f src/mips/o32.$(OBJEXT) +- -rm -f src/mips/o32.lo +- -rm -f src/moxie/eabi.$(OBJEXT) +- -rm -f src/moxie/eabi.lo +- -rm -f src/moxie/ffi.$(OBJEXT) +- -rm -f src/moxie/ffi.lo +- -rm -f src/pa/ffi.$(OBJEXT) +- -rm -f src/pa/ffi.lo +- -rm -f src/pa/hpux32.$(OBJEXT) +- -rm -f src/pa/hpux32.lo +- -rm -f src/pa/linux.$(OBJEXT) +- -rm -f src/pa/linux.lo +- -rm -f src/powerpc/aix.$(OBJEXT) +- -rm -f src/powerpc/aix.lo +- -rm -f src/powerpc/aix_closure.$(OBJEXT) +- -rm -f src/powerpc/aix_closure.lo +- -rm -f src/powerpc/darwin.$(OBJEXT) +- -rm -f src/powerpc/darwin.lo +- -rm -f src/powerpc/darwin_closure.$(OBJEXT) +- -rm -f src/powerpc/darwin_closure.lo +- -rm -f src/powerpc/ffi.$(OBJEXT) +- -rm -f src/powerpc/ffi.lo +- -rm -f src/powerpc/ffi_darwin.$(OBJEXT) +- -rm -f src/powerpc/ffi_darwin.lo +- -rm -f src/powerpc/linux64.$(OBJEXT) +- -rm -f src/powerpc/linux64.lo +- -rm -f src/powerpc/linux64_closure.$(OBJEXT) +- -rm -f src/powerpc/linux64_closure.lo +- -rm -f src/powerpc/ppc_closure.$(OBJEXT) +- -rm -f src/powerpc/ppc_closure.lo +- -rm -f src/powerpc/sysv.$(OBJEXT) +- -rm -f src/powerpc/sysv.lo +- -rm -f src/prep_cif.$(OBJEXT) +- -rm -f src/prep_cif.lo +- -rm -f src/raw_api.$(OBJEXT) +- -rm -f src/raw_api.lo +- -rm -f src/s390/ffi.$(OBJEXT) +- -rm -f src/s390/ffi.lo +- -rm -f src/s390/sysv.$(OBJEXT) +- -rm -f src/s390/sysv.lo +- -rm -f src/sh/ffi.$(OBJEXT) +- -rm -f src/sh/ffi.lo +- -rm -f src/sh/sysv.$(OBJEXT) +- -rm -f src/sh/sysv.lo +- -rm -f src/sh64/ffi.$(OBJEXT) +- -rm -f src/sh64/ffi.lo +- -rm -f src/sh64/sysv.$(OBJEXT) +- -rm -f src/sh64/sysv.lo +- -rm -f src/sparc/ffi.$(OBJEXT) +- -rm -f src/sparc/ffi.lo +- -rm -f src/sparc/v8.$(OBJEXT) +- -rm -f src/sparc/v8.lo +- -rm -f src/sparc/v9.$(OBJEXT) +- -rm -f src/sparc/v9.lo +- -rm -f src/types.$(OBJEXT) +- -rm -f src/types.lo +- -rm -f src/x86/darwin.$(OBJEXT) +- -rm -f src/x86/darwin.lo +- -rm -f src/x86/darwin64.$(OBJEXT) +- -rm -f src/x86/darwin64.lo +- -rm -f src/x86/ffi.$(OBJEXT) +- -rm -f src/x86/ffi.lo +- -rm -f src/x86/ffi64.$(OBJEXT) +- -rm -f src/x86/ffi64.lo +- -rm -f src/x86/freebsd.$(OBJEXT) +- -rm -f src/x86/freebsd.lo +- -rm -f src/x86/sysv.$(OBJEXT) +- -rm -f src/x86/sysv.lo +- -rm -f src/x86/unix64.$(OBJEXT) +- -rm -f src/x86/unix64.lo +- -rm -f src/x86/win32.$(OBJEXT) +- -rm -f src/x86/win32.lo +- -rm -f src/x86/win64.$(OBJEXT) +- -rm -f src/x86/win64.lo ++ -rm -f src/*.$(OBJEXT) ++ -rm -f src/*.lo ++ -rm -f src/aarch64/*.$(OBJEXT) ++ -rm -f src/aarch64/*.lo ++ -rm -f src/alpha/*.$(OBJEXT) ++ -rm -f src/alpha/*.lo ++ -rm -f src/arc/*.$(OBJEXT) ++ -rm -f src/arc/*.lo ++ -rm -f src/arm/*.$(OBJEXT) ++ -rm -f src/arm/*.lo ++ -rm -f src/avr32/*.$(OBJEXT) ++ -rm -f src/avr32/*.lo ++ -rm -f src/bfin/*.$(OBJEXT) ++ -rm -f src/bfin/*.lo ++ -rm -f src/cris/*.$(OBJEXT) ++ -rm -f src/cris/*.lo ++ -rm -f src/frv/*.$(OBJEXT) ++ -rm -f src/frv/*.lo ++ -rm -f src/ia64/*.$(OBJEXT) ++ -rm -f src/ia64/*.lo ++ -rm -f src/m32r/*.$(OBJEXT) ++ -rm -f src/m32r/*.lo ++ -rm -f src/m68k/*.$(OBJEXT) ++ -rm -f src/m68k/*.lo ++ -rm -f src/m88k/*.$(OBJEXT) ++ -rm -f src/m88k/*.lo ++ -rm -f src/metag/*.$(OBJEXT) ++ -rm -f src/metag/*.lo ++ -rm -f src/microblaze/*.$(OBJEXT) ++ -rm -f src/microblaze/*.lo ++ -rm -f src/mips/*.$(OBJEXT) ++ -rm -f src/mips/*.lo ++ -rm -f src/moxie/*.$(OBJEXT) ++ -rm -f src/moxie/*.lo ++ -rm -f src/nios2/*.$(OBJEXT) ++ -rm -f src/nios2/*.lo ++ -rm -f src/pa/*.$(OBJEXT) ++ -rm -f src/pa/*.lo ++ -rm -f src/powerpc/*.$(OBJEXT) ++ -rm -f src/powerpc/*.lo ++ -rm -f src/s390/*.$(OBJEXT) ++ -rm -f src/s390/*.lo ++ -rm -f src/sh/*.$(OBJEXT) ++ -rm -f src/sh/*.lo ++ -rm -f src/sh64/*.$(OBJEXT) ++ -rm -f src/sh64/*.lo ++ -rm -f src/sparc/*.$(OBJEXT) ++ -rm -f src/sparc/*.lo ++ -rm -f src/tile/*.$(OBJEXT) ++ -rm -f src/tile/*.lo ++ -rm -f src/vax/*.$(OBJEXT) ++ -rm -f src/vax/*.lo ++ -rm -f src/x86/*.$(OBJEXT) ++ -rm -f src/x86/*.lo ++ -rm -f src/xtensa/*.$(OBJEXT) ++ -rm -f src/xtensa/*.lo + + distclean-compile: + -rm -f *.tab.c + + @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/closures.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/debug.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/java_raw_api.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/prep_cif.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/raw_api.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/arc/$(DEPDIR)/arcompact.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/arc/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/unix.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/sysv.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/m88k/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/m88k/$(DEPDIR)/obsd.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/sysv.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin_closure.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_darwin.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_linux64.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64_closure.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ppc_closure.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v8.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v9.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/tile.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/elfbsd.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin64.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/freebsd.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/sysv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/unix64.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win32.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win64.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/ffi.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/sysv.Plo@am__quote@ + +-%.o: %.S +-@am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ ++.S.o: ++@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ + @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ + @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ + @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ $< ++@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $< + +-%.obj: %.S +-@am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ ++.S.obj: ++@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ + @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ + @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ + @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ++@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +-%.lo: %.S +-@am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ ++.S.lo: ++@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ + @am__fastdepCCAS_TRUE@ $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ + @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ + @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCCAS_FALSE@ $(LTCPPASCOMPILE) -c -o $@ $< ++@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(LTCPPASCOMPILE) -c -o $@ $< + +-%.o: %.c +-@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ ++.c.o: ++@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ + @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ + @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ + @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +-%.obj: %.c +-@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ ++.c.obj: ++@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ + @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ + @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ + @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +-%.lo: %.c +-@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ ++.c.lo: ++@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ + @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ + @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ + @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + + mostlyclean-libtool: + -rm -f *.lo + + clean-libtool: + -rm -rf .libs _libs + -rm -rf src/.libs src/_libs ++ -rm -rf src/aarch64/.libs src/aarch64/_libs + -rm -rf src/alpha/.libs src/alpha/_libs ++ -rm -rf src/arc/.libs src/arc/_libs + -rm -rf src/arm/.libs src/arm/_libs + -rm -rf src/avr32/.libs src/avr32/_libs ++ -rm -rf src/bfin/.libs src/bfin/_libs + -rm -rf src/cris/.libs src/cris/_libs + -rm -rf src/frv/.libs src/frv/_libs + -rm -rf src/ia64/.libs src/ia64/_libs + -rm -rf src/m32r/.libs src/m32r/_libs + -rm -rf src/m68k/.libs src/m68k/_libs ++ -rm -rf src/m88k/.libs src/m88k/_libs ++ -rm -rf src/metag/.libs src/metag/_libs ++ -rm -rf src/microblaze/.libs src/microblaze/_libs + -rm -rf src/mips/.libs src/mips/_libs + -rm -rf src/moxie/.libs src/moxie/_libs ++ -rm -rf src/nios2/.libs src/nios2/_libs + -rm -rf src/pa/.libs src/pa/_libs + -rm -rf src/powerpc/.libs src/powerpc/_libs + -rm -rf src/s390/.libs src/s390/_libs + -rm -rf src/sh/.libs src/sh/_libs + -rm -rf src/sh64/.libs src/sh64/_libs + -rm -rf src/sparc/.libs src/sparc/_libs ++ -rm -rf src/tile/.libs src/tile/_libs ++ -rm -rf src/vax/.libs src/vax/_libs + -rm -rf src/x86/.libs src/x86/_libs ++ -rm -rf src/xtensa/.libs src/xtensa/_libs + + distclean-libtool: + -rm -f libtool config.lt + doc/$(am__dirstamp): + @$(MKDIR_P) doc + @: > doc/$(am__dirstamp) + + $(srcdir)/doc/libffi.info: doc/libffi.texi $(srcdir)/doc/version.texi +- restore=: && backupdir="$(am__leading_dot)am$$$$" && \ ++ $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ +@@ -1087,28 +1398,30 @@ doc/$(am__dirstamp): + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + + doc/libffi.dvi: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) +- TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ ++ $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ +- $(TEXI2DVI) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi ++ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ ++ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + + doc/libffi.pdf: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) +- TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ ++ $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ +- $(TEXI2PDF) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi ++ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ ++ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + + doc/libffi.html: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) +- rm -rf $(@:.html=.htp) +- if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ ++ $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) ++ $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ + -o $(@:.html=.htp) `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi; \ + then \ + rm -rf $@; \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ + else \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ +@@ -1129,19 +1442,19 @@ doc/libffi.html: doc/libffi.texi $(srcdi + -@rm -f vti.tmp + @cp $(srcdir)/doc/version.texi $@ + + mostlyclean-vti: + -rm -f vti.tmp + + maintainer-clean-vti: + @MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi +-%.ps: %.dvi +- TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ +- $(DVIPS) -o $@ $< ++.dvi.ps: ++ $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ ++ $(DVIPS) $(AM_V_texinfo) -o $@ $< + + uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ +@@ -1153,19 +1466,17 @@ uninstall-html-am: + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + + uninstall-info-am: + @$(PRE_UNINSTALL) +- @if test -d '$(DESTDIR)$(infodir)' && \ +- (install-info --version && \ +- install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ ++ @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi +@@ -1212,184 +1523,155 @@ dist-info: $(INFO_DEPS) + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + + mostlyclean-aminfo: +- -rm -rf libffi.aux libffi.cp libffi.cps libffi.fn libffi.ky libffi.log \ +- libffi.pg libffi.tmp libffi.toc libffi.tp libffi.vr ++ -rm -rf doc/libffi.t2d doc/libffi.t2p + + clean-aminfo: + -test -z "doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html" \ + || rm -rf doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html + + maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done + install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) +- test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ ++ if test -n "$$list"; then \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ ++ fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + + uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ +- test -n "$$files" || exit 0; \ +- echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ +- cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files ++ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + + # This directory's subdirectories are mostly independent; you can cd +-# into them and run `make' without going through this Makefile. +-# To change the values of `make' variables: instead of editing Makefiles, +-# (1) if the variable is set in `config.status', edit `config.status' +-# (which will cause the Makefiles to be regenerated when you run `make'); +-# (2) otherwise, pass the desired values on the `make' command line. +-$(RECURSIVE_TARGETS): +- @fail= failcom='exit 1'; \ +- for f in x $$MAKEFLAGS; do \ +- case $$f in \ +- *=* | --[!k]*);; \ +- *k*) failcom='fail=yes';; \ +- esac; \ +- done; \ ++# into them and run 'make' without going through this Makefile. ++# To change the values of 'make' variables: instead of editing Makefiles, ++# (1) if the variable is set in 'config.status', edit 'config.status' ++# (which will cause the Makefiles to be regenerated when you run 'make'); ++# (2) otherwise, pass the desired values on the 'make' command line. ++$(am__recursive_targets): ++ @fail=; \ ++ if $(am__make_keepgoing); then \ ++ failcom='fail=yes'; \ ++ else \ ++ failcom='exit 1'; \ ++ fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ +- list='$(SUBDIRS)'; for subdir in $$list; do \ ++ case "$@" in \ ++ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ ++ *) list='$(SUBDIRS)' ;; \ ++ esac; \ ++ for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +-$(RECURSIVE_CLEAN_TARGETS): +- @fail= failcom='exit 1'; \ +- for f in x $$MAKEFLAGS; do \ +- case $$f in \ +- *=* | --[!k]*);; \ +- *k*) failcom='fail=yes';; \ +- esac; \ +- done; \ +- dot_seen=no; \ +- case "$@" in \ +- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +- *) list='$(SUBDIRS)' ;; \ +- esac; \ +- rev=''; for subdir in $$list; do \ +- if test "$$subdir" = "."; then :; else \ +- rev="$$subdir $$rev"; \ +- fi; \ +- done; \ +- rev="$$rev ."; \ +- target=`echo $@ | sed s/-recursive//`; \ +- for subdir in $$rev; do \ +- echo "Making $$target in $$subdir"; \ +- if test "$$subdir" = "."; then \ +- local_target="$$target-am"; \ +- else \ +- local_target="$$target"; \ +- fi; \ +- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || eval $$failcom; \ +- done && test -z "$$fail" +-tags-recursive: +- list='$(SUBDIRS)'; for subdir in $$list; do \ +- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ +- done +-ctags-recursive: +- list='$(SUBDIRS)'; for subdir in $$list; do \ +- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ +- done ++ID: $(am__tagged_files) ++ $(am__define_uniq_tagged_files); mkid -fID $$unique ++tags: tags-recursive ++TAGS: tags + +-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +- END { if (nonempty) { for (i in files) print i; }; }'`; \ +- mkid -fID $$unique +-tags: TAGS +- +-TAGS: tags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) ++tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ +- list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +- END { if (nonempty) { for (i in files) print i; }; }'`; \ ++ $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +-ctags: CTAGS +-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +- END { if (nonempty) { for (i in files) print i; }; }'`; \ ++ctags: ctags-recursive ++ ++CTAGS: ctags ++ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) ++ $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" ++cscope: cscope.files ++ test ! -s cscope.files \ ++ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) ++clean-cscope: ++ -rm -f cscope.files ++cscope.files: clean-cscope cscopelist ++cscopelist: cscopelist-recursive ++ ++cscopelist-am: $(am__tagged_files) ++ list='$(am__tagged_files)'; \ ++ case "$(srcdir)" in \ ++ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ ++ *) sdir=$(subdir)/$(srcdir) ;; \ ++ esac; \ ++ for i in $$list; do \ ++ if test -f "$$i"; then \ ++ echo "$(subdir)/$$i"; \ ++ else \ ++ echo "$$sdir/$$i"; \ ++ fi; \ ++ done >> $(top_builddir)/cscope.files + + distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + + distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ +@@ -1415,23 +1697,20 @@ distdir: $(DISTFILES) + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ +- test -d "$(distdir)/$$subdir" \ +- || $(MKDIR_P) "$(distdir)/$$subdir" \ +- || exit 1; \ +- fi; \ +- done +- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ +- if test "$$subdir" = .; then :; else \ ++ $(am__make_dryrun) \ ++ || test -d "$(distdir)/$$subdir" \ ++ || $(MKDIR_P) "$(distdir)/$$subdir" \ ++ || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ +@@ -1443,87 +1722,88 @@ distdir: $(DISTFILES) + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ +- dist-info ++ dist-info dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" + dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz +- $(am__remove_distdir) ++ $(am__post_remove_distdir) + + dist-bzip2: distdir +- tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 +- $(am__remove_distdir) ++ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 ++ $(am__post_remove_distdir) + +-dist-lzma: distdir +- tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma +- $(am__remove_distdir) ++dist-lzip: distdir ++ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz ++ $(am__post_remove_distdir) + + dist-xz: distdir +- tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz +- $(am__remove_distdir) ++ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz ++ $(am__post_remove_distdir) + + dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z +- $(am__remove_distdir) ++ $(am__post_remove_distdir) + + dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz +- $(am__remove_distdir) ++ $(am__post_remove_distdir) + + dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) +- $(am__remove_distdir) ++ $(am__post_remove_distdir) + +-dist dist-all: distdir +- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz +- $(am__remove_distdir) ++dist dist-all: ++ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' ++ $(am__post_remove_distdir) + + # This target untars the dist file and tries a VPATH configuration. Then + # it guarantees that the distribution is self-contained by making another + # tarfile. + distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ +- *.tar.lzma*) \ +- lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ ++ *.tar.lz*) \ ++ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac +- chmod -R a-w $(distdir); chmod a+w $(distdir) +- mkdir $(distdir)/_build +- mkdir $(distdir)/_inst ++ chmod -R a-w $(distdir) ++ chmod u+w $(distdir) ++ mkdir $(distdir)/_build $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ ++ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ +@@ -1537,23 +1817,31 @@ distcheck: dist + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 +- $(am__remove_distdir) ++ $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' + distuninstallcheck: +- @$(am__cd) '$(distuninstallcheck_dir)' \ +- && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ ++ @test -n '$(distuninstallcheck_dir)' || { \ ++ echo 'ERROR: trying to run $@ with an empty' \ ++ '$$(distuninstallcheck_dir)' >&2; \ ++ exit 1; \ ++ }; \ ++ $(am__cd) '$(distuninstallcheck_dir)' || { \ ++ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ ++ exit 1; \ ++ }; \ ++ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 + distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ +@@ -1564,89 +1852,115 @@ distcleancheck: distclean + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 + check-am: all-am + check: check-recursive + all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) $(DATA) fficonfig.h + installdirs: installdirs-recursive + installdirs-am: +- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \ ++ for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done + install: install-recursive + install-exec: install-exec-recursive + install-data: install-data-recursive + uninstall: uninstall-recursive + + install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + + installcheck: installcheck-recursive + install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++ if test -z '$(STRIP)'; then \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ install; \ ++ else \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ ++ fi + mostlyclean-generic: + + clean-generic: + + distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f doc/$(am__dirstamp) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) ++ -rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/aarch64/$(am__dirstamp) + -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) + -rm -f src/alpha/$(am__dirstamp) ++ -rm -f src/arc/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/arc/$(am__dirstamp) + -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f src/arm/$(am__dirstamp) + -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) + -rm -f src/avr32/$(am__dirstamp) ++ -rm -f src/bfin/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/bfin/$(am__dirstamp) + -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cris/$(am__dirstamp) + -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) + -rm -f src/frv/$(am__dirstamp) + -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ia64/$(am__dirstamp) + -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m32r/$(am__dirstamp) + -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m68k/$(am__dirstamp) ++ -rm -f src/m88k/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/m88k/$(am__dirstamp) ++ -rm -f src/metag/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/metag/$(am__dirstamp) ++ -rm -f src/microblaze/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/microblaze/$(am__dirstamp) + -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) + -rm -f src/mips/$(am__dirstamp) + -rm -f src/moxie/$(DEPDIR)/$(am__dirstamp) + -rm -f src/moxie/$(am__dirstamp) ++ -rm -f src/nios2/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/nios2/$(am__dirstamp) + -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/pa/$(am__dirstamp) + -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/powerpc/$(am__dirstamp) + -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) + -rm -f src/s390/$(am__dirstamp) + -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh/$(am__dirstamp) + -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh64/$(am__dirstamp) + -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sparc/$(am__dirstamp) ++ -rm -f src/tile/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/tile/$(am__dirstamp) ++ -rm -f src/vax/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/vax/$(am__dirstamp) + -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f src/x86/$(am__dirstamp) ++ -rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp) ++ -rm -f src/xtensa/$(am__dirstamp) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + clean: clean-recursive + +-clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \ +- clean-libtool clean-noinstLTLIBRARIES mostlyclean-am ++clean-am: clean-aminfo clean-generic clean-libtool \ ++ clean-noinstLTLIBRARIES clean-toolexeclibLTLIBRARIES \ ++ mostlyclean-am + + distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) +- -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) ++ -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) + -rm -f Makefile + distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + + dvi: dvi-recursive + + dvi-am: $(DVIS) + +@@ -1659,56 +1973,68 @@ info: info-recursive + info-am: $(INFO_DEPS) + + install-data-am: install-info-am install-pkgconfigDATA + + install-dvi: install-dvi-recursive + + install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) +- test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ ++ if test -n "$$list"; then \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ ++ fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +-install-exec-am: install-libLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES ++ ++install-html: install-html-recursive + + install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) +- test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ ++ if test -n "$$list"; then \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ ++ fi; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ +- if test -d "$$d$$p"; then \ ++ d2=$$d$$p; \ ++ if test -d "$$d2"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ +- echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ +- $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ ++ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ ++ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ +- list2="$$list2 $$d$$p"; \ ++ list2="$$list2 $$d2"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } + install-info: install-info-recursive + + install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) +- test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ ++ if test -n "$$list"; then \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ ++ fi; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ +@@ -1716,57 +2042,64 @@ install-info-am: $(INFO_DEPS) + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) +- @if (install-info --version && \ +- install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ ++ @if $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi + install-man: + ++install-pdf: install-pdf-recursive ++ + install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) +- test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ ++ if test -n "$$list"; then \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ ++ fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done + install-ps: install-ps-recursive + + install-ps-am: $(PSS) + @$(NORMAL_INSTALL) +- test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" + @list='$(PSS)'; test -n "$(psdir)" || list=; \ ++ if test -n "$$list"; then \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ ++ fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done + installcheck-am: + + maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache +- -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) ++ -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) + -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + + mostlyclean: mostlyclean-recursive + + mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool mostlyclean-vti +@@ -1775,46 +2108,44 @@ pdf: pdf-recursive + + pdf-am: $(PDFS) + + ps: ps-recursive + + ps-am: $(PSS) + + uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ +- uninstall-libLTLIBRARIES uninstall-pdf-am \ +- uninstall-pkgconfigDATA uninstall-ps-am ++ uninstall-pdf-am uninstall-pkgconfigDATA uninstall-ps-am \ ++ uninstall-toolexeclibLTLIBRARIES + +-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ +- ctags-recursive install-am install-strip tags-recursive ++.MAKE: $(am__recursive_targets) all install-am install-strip + +-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ +- all all-am am--refresh check check-am clean clean-aminfo \ +- clean-generic clean-libLTLIBRARIES clean-libtool \ +- clean-noinstLTLIBRARIES ctags ctags-recursive dist dist-all \ +- dist-bzip2 dist-gzip dist-info dist-lzma dist-shar dist-tarZ \ +- dist-xz dist-zip distcheck distclean distclean-compile \ +- distclean-generic distclean-hdr distclean-libtool \ +- distclean-tags distcleancheck distdir distuninstallcheck dvi \ +- dvi-am html html-am info info-am install install-am \ +- install-data install-data-am install-dvi install-dvi-am \ +- install-exec install-exec-am install-html install-html-am \ +- install-info install-info-am install-libLTLIBRARIES \ ++.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ ++ am--refresh check check-am clean clean-aminfo clean-cscope \ ++ clean-generic clean-libtool clean-noinstLTLIBRARIES \ ++ clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \ ++ ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ ++ dist-info dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ ++ distcheck distclean distclean-compile distclean-generic \ ++ distclean-hdr distclean-libtool distclean-tags distcleancheck \ ++ distdir distuninstallcheck dvi dvi-am html html-am info \ ++ info-am install install-am install-data install-data-am \ ++ install-dvi install-dvi-am install-exec install-exec-am \ ++ install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ +- install-ps install-ps-am install-strip installcheck \ +- installcheck-am installdirs installdirs-am maintainer-clean \ ++ install-ps install-ps-am install-strip \ ++ install-toolexeclibLTLIBRARIES installcheck installcheck-am \ ++ installdirs installdirs-am maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ +- mostlyclean-vti pdf pdf-am ps ps-am tags tags-recursive \ +- uninstall uninstall-am uninstall-dvi-am uninstall-html-am \ +- uninstall-info-am uninstall-libLTLIBRARIES uninstall-pdf-am \ +- uninstall-pkgconfigDATA uninstall-ps-am ++ mostlyclean-vti pdf pdf-am ps ps-am tags tags-am uninstall \ ++ uninstall-am uninstall-dvi-am uninstall-html-am \ ++ uninstall-info-am uninstall-pdf-am uninstall-pkgconfigDATA \ ++ uninstall-ps-am uninstall-toolexeclibLTLIBRARIES + + +-# No install-html or install-pdf support in automake yet +-.PHONY: install-html install-pdf +-install-html: +-install-pdf: ++dist-hook: ++ if [ -d $(top_srcdir)/.git ] ; then git -C $(top_srcdir) log --no-decorate ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: +diff --git a/js/src/ctypes/libffi/README b/js/src/ctypes/libffi/README +--- a/js/src/ctypes/libffi/README ++++ b/js/src/ctypes/libffi/README +@@ -1,12 +1,12 @@ + Status + ====== + +-libffi-3.0.10 was released on XXXXXXXXXX, 2010. Check the libffi web ++libffi-3.1 was released on TBD. Check the libffi web + page for updates: . + + + What is libffi? + =============== + + Compilers for high level languages generate code that follow certain + conventions. These conventions are necessary, in part, for separate +@@ -38,70 +38,102 @@ between the two languages. + + Supported Platforms + =================== + + Libffi has been ported to many different platforms. + For specific configuration details and testing status, please + refer to the wiki page here: + +- http://www.moxielogic.org/wiki/index.php?title=Libffi_3.0.10 ++ http://www.moxielogic.org/wiki/index.php?title=Libffi_3.1 + + At the time of release, the following basic configurations have been + tested: + +-|--------------+------------------| +-| Architecture | Operating System | +-|--------------+------------------| +-| Alpha | Linux | +-| Alpha | Tru64 | +-| ARM | Linux | +-| AVR32 | Linux | +-| HPPA | HPUX | +-| IA-64 | Linux | +-| MIPS | IRIX | +-| MIPS | Linux | +-| MIPS64 | Linux | +-| PowerPC | Linux | +-| PowerPC | Mac OSX | +-| PowerPC | FreeBSD | +-| PowerPC64 | Linux | +-| S390 | Linux | +-| S390X | Linux | +-| SPARC | Linux | +-| SPARC | Solaris | +-| SPARC64 | Linux | +-| SPARC64 | FreeBSD | +-| X86 | FreeBSD | +-| X86 | kFreeBSD | +-| X86 | Linux | +-| X86 | Mac OSX | +-| X86 | OpenBSD | +-| X86 | OS/2 | +-| X86 | Solaris | +-| X86 | Windows/Cygwin | +-| X86 | Windows/MingW | +-| X86-64 | FreeBSD | +-| X86-64 | Linux | +-| X86-64 | OpenBSD | +-| X86-64 | Windows/MingW | +-|--------------+------------------| ++|-----------------+------------------+-------------------------| ++| Architecture | Operating System | Compiler | ++|-----------------+------------------+-------------------------| ++| AArch64 (ARM64) | iOS | Clang | ++| AArch64 | Linux | GCC | ++| Alpha | Linux | GCC | ++| Alpha | Tru64 | GCC | ++| ARC | Linux | GCC | ++| ARM | Linux | GCC | ++| ARM | iOS | GCC | ++| AVR32 | Linux | GCC | ++| Blackfin | uClinux | GCC | ++| HPPA | HPUX | GCC | ++| IA-64 | Linux | GCC | ++| M68K | FreeMiNT | GCC | ++| M68K | Linux | GCC | ++| M68K | RTEMS | GCC | ++| M88K | OpenBSD/mvme88k | GCC | ++| Meta | Linux | GCC | ++| MicroBlaze | Linux | GCC | ++| MIPS | IRIX | GCC | ++| MIPS | Linux | GCC | ++| MIPS | RTEMS | GCC | ++| MIPS64 | Linux | GCC | ++| Moxie | Bare metal | GCC | ++| Nios II | Linux | GCC | ++| PowerPC 32-bit | AIX | IBM XL C | ++| PowerPC 64-bit | AIX | IBM XL C | ++| PowerPC | AMIGA | GCC | ++| PowerPC | Linux | GCC | ++| PowerPC | Mac OSX | GCC | ++| PowerPC | FreeBSD | GCC | ++| PowerPC 64-bit | FreeBSD | GCC | ++| PowerPC 64-bit | Linux ELFv1 | GCC | ++| PowerPC 64-bit | Linux ELFv2 | GCC | ++| S390 | Linux | GCC | ++| S390X | Linux | GCC | ++| SPARC | Linux | GCC | ++| SPARC | Solaris | GCC | ++| SPARC | Solaris | Oracle Solaris Studio C | ++| SPARC64 | Linux | GCC | ++| SPARC64 | FreeBSD | GCC | ++| SPARC64 | Solaris | Oracle Solaris Studio C | ++| TILE-Gx/TILEPro | Linux | GCC | ++| VAX | OpenBSD/vax | GCC | ++| X86 | FreeBSD | GCC | ++| X86 | GNU HURD | GCC | ++| X86 | Interix | GCC | ++| X86 | kFreeBSD | GCC | ++| X86 | Linux | GCC | ++| X86 | Mac OSX | GCC | ++| X86 | OpenBSD | GCC | ++| X86 | OS/2 | GCC | ++| X86 | Solaris | GCC | ++| X86 | Solaris | Oracle Solaris Studio C | ++| X86 | Windows/Cygwin | GCC | ++| X86 | Windows/MingW | GCC | ++| X86-64 | FreeBSD | GCC | ++| X86-64 | Linux | GCC | ++| X86-64 | Linux/x32 | GCC | ++| X86-64 | OpenBSD | GCC | ++| X86-64 | Solaris | Oracle Solaris Studio C | ++| X86-64 | Windows/MingW | GCC | ++| Xtensa | Linux | GCC | ++|-----------------+------------------+-------------------------| + + Please send additional platform test results to + libffi-discuss@sourceware.org and feel free to update the wiki page + above. + + Installing libffi + ================= + + First you must configure the distribution for your particular + system. Go to the directory you wish to build libffi in and run the + "configure" program found in the root directory of the libffi source + distribution. + ++If you're building libffi directly from version control, configure won't ++exist yet; run ./autogen.sh first. ++ + You may want to tell configure where to install the libffi library and + header files. To do that, use the --prefix configure switch. Libffi + will install under /usr/local by default. + + If you want to enable extra run-time debugging checks use the the + --enable-debug configure switch. This is useful when your program dies + mysteriously while using libffi. + +@@ -117,37 +149,93 @@ wrapper script during configuration like + path/to/configure CC=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\" + + For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64". + You may also need to specify --build appropriately. When building with MSVC + under a MingW environment, you may need to remove the line in configure + that sets 'fix_srcfile_path' to a 'cygpath' command. ('cygpath' is not + present in MingW, and is not required when using MingW-style paths.) + ++For iOS builds, the 'libffi.xcodeproj' Xcode project is available. ++ + Configure has many other options. Use "configure --help" to see them all. + + Once configure has finished, type "make". Note that you must be using +-GNU make. You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++GNU make. You can ftp GNU make from ftp.gnu.org:/pub/gnu/make . + + To ensure that libffi is working as advertised, type "make check". + This will require that you have DejaGNU installed. + + To install the library and header files, type "make install". + + + History + ======= + +-See the ChangeLog files for details. ++See the git log for details at http://github.com/atgreen/libffi. + +-3.0.10 ???-??-?? +- Fix the N64 build on mips-sgi-irix6.5. ++3.1 TBD ++ Add AArch64 (ARM64) iOS support. ++ Add Nios II support. ++ Add m88k and DEC VAX support. ++ Add support for stdcall, thiscall, and fastcall on non-Windows ++ 32-bit x86 targets such as Linux. ++ Various Android, MIPS N32, x86, FreeBSD and UltraSPARC IIi ++ fixes. ++ Make the testsuite more robust: eliminated several spurious ++ failures. ++ Archive off the manually maintained ChangeLog in favor of git ++ log. ++ ++3.0.13 Mar-17-13 ++ Add Meta support. ++ Add missing Moxie bits. ++ Fix stack alignment bug on 32-bit x86. ++ Build fix for m68000 targets. ++ Build fix for soft-float Power targets. ++ Fix the install dir location for some platforms when building ++ with GCC (OS X, Solaris). ++ Fix Cygwin regression. ++ ++3.0.12 Feb-11-13 ++ Add Moxie support. ++ Add AArch64 support. ++ Add Blackfin support. ++ Add TILE-Gx/TILEPro support. ++ Add MicroBlaze support. ++ Add Xtensa support. ++ Add support for PaX enabled kernels with MPROTECT. ++ Add support for native vendor compilers on ++ Solaris and AIX. ++ Work around LLVM/GCC interoperability issue on x86_64. ++ ++3.0.11 Apr-11-12 ++ Lots of build fixes. ++ Add support for variadic functions (ffi_prep_cif_var). ++ Add Linux/x32 support. ++ Add thiscall, fastcall and MSVC cdecl support on Windows. ++ Add Amiga and newer MacOS support. ++ Add m68k FreeMiNT support. ++ Integration with iOS' xcode build tools. ++ Fix Octeon and MC68881 support. ++ Fix code pessimizations. ++ ++3.0.10 Aug-23-11 ++ Add support for Apple's iOS. ++ Add support for ARM VFP ABI. ++ Add RTEMS support for MIPS and M68K. ++ Fix instruction cache clearing problems on ++ ARM and SPARC. ++ Fix the N64 build on mips-sgi-irix6.5. ++ Enable builds with Microsoft's compiler. ++ Enable x86 builds with Oracle's Solaris compiler. ++ Fix support for calling code compiled with Oracle's Sparc ++ Solaris compiler. + Testsuite fixes for Tru64 Unix. +- Enable builds with Microsoft's compiler. +- Enable x86 builds with Sun's compiler. ++ Additional platform support. + + 3.0.9 Dec-31-09 + Add AVR32 and win64 ports. Add ARM softfp support. + Many fixes for AIX, Solaris, HP-UX, *BSD. + Several PowerPC and x86-64 bug fixes. + Build DLL for windows. + + 3.0.8 Dec-19-08 +@@ -267,50 +355,59 @@ 1.01 Oct-8-96 + + 1.00 Oct-7-96 + First release. No public announcement. + + + Authors & Credits + ================= + +-libffi was originally written by Anthony Green . ++libffi was originally written by Anthony Green . + + The developers of the GNU Compiler Collection project have made + innumerable valuable contributions. See the ChangeLog file for + details. + + Some of the ideas behind libffi were inspired by Gianni Mariani's free + gencall library for Silicon Graphics machines. + + The closure mechanism was designed and implemented by Kresten Krab + Thorup. + + Major processor architecture ports were contributed by the following + developers: + ++aarch64 Marcus Shawcroft, James Greenhalgh + alpha Richard Henderson + arm Raffaele Sena ++blackfin Alexandre Keunecke I. de Mendonca + cris Simon Posnjak, Hans-Peter Nilsson + frv Anthony Green + ia64 Hans Boehm + m32r Kazuhiro Inaoka + m68k Andreas Schwab ++m88k Miod Vallat ++microblaze Nathan Rossi + mips Anthony Green, Casey Marshall + mips64 David Daney ++moxie Anthony Green ++nios ii Sandra Loosemore + pa Randolph Chung, Dave Anglin, Andreas Tobler + powerpc Geoffrey Keating, Andreas Tobler, + David Edelsohn, John Hornkvist + powerpc64 Jakub Jelinek + s390 Gerhard Tonn, Ulrich Weigand + sh Kaz Kojima + sh64 Kaz Kojima + sparc Anthony Green, Gordon Irlam ++tile-gx/tilepro Walter Lee ++vax Miod Vallat + x86 Anthony Green, Jon Beniston + x86-64 Bo Thorsen ++xtensa Chris Zankel + + Jesper Skov and Andrew Haley both did more than their fair share of + stepping through the code and tracking down bugs. + + Thanks also to Tom Tromey for bug fixes, documentation and + configuration help. + + Thanks to Jim Blandy, who provided some useful feedback on the libffi +@@ -318,10 +415,11 @@ interface. + + Andreas Tobler has done a tremendous amount of work on the testsuite. + + Alex Oliva solved the executable page problem for SElinux. + + The list above is almost certainly incomplete and inaccurate. I'm + happy to make corrections or additions upon request. + +-If you have a problem, or have found a bug, please send a note to +-green@redhat.com. ++If you have a problem, or have found a bug, please send a note to the ++author at green@moxielogic.com, or the project mailing list at ++libffi-discuss@sourceware.org. +diff --git a/js/src/ctypes/libffi/aclocal.m4 b/js/src/ctypes/libffi/aclocal.m4 +--- a/js/src/ctypes/libffi/aclocal.m4 ++++ b/js/src/ctypes/libffi/aclocal.m4 +@@ -1,7390 +1,40 @@ +-# generated automatically by aclocal 1.11.1 -*- Autoconf -*- ++# generated automatically by aclocal 1.13.4 -*- Autoconf -*- + +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +-# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. ++# Copyright (C) 1996-2013 Free Software Foundation, Inc. ++ + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY, to the extent permitted by law; without + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + ++m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) + m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, +-[m4_warning([this file was generated for autoconf 2.65. ++m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, ++[m4_warning([this file was generated for autoconf 2.69. + You have another version of autoconf. It may work, but is not guaranteed to. + If you have problems, you may need to regenerate the build system entirely. +-To do so, use the procedure documented by the package, typically `autoreconf'.])]) +- +-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +-# +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +-# 2006, 2007, 2008 Free Software Foundation, Inc. +-# Written by Gordon Matzigkeit, 1996 +-# +-# This file is free software; the Free Software Foundation gives +-# unlimited permission to copy and/or distribute it, with or without +-# modifications, as long as this notice is preserved. +- +-m4_define([_LT_COPYING], [dnl +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +-# 2006, 2007, 2008 Free Software Foundation, Inc. +-# Written by Gordon Matzigkeit, 1996 +-# +-# This file is part of GNU Libtool. +-# +-# GNU Libtool is free software; you can redistribute it and/or +-# modify it under the terms of the GNU General Public License as +-# published by the Free Software Foundation; either version 2 of +-# the License, or (at your option) any later version. +-# +-# As a special exception to the GNU General Public License, +-# if you distribute this file as part of a program or library that +-# is built using GNU Libtool, you may include this file under the +-# same distribution terms that you use for the rest of that program. +-# +-# GNU Libtool is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with GNU Libtool; see the file COPYING. If not, a copy +-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +-# obtained by writing to the Free Software Foundation, Inc., +-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +-]) +- +-# serial 56 LT_INIT +- +- +-# LT_PREREQ(VERSION) +-# ------------------ +-# Complain and exit if this libtool version is less that VERSION. +-m4_defun([LT_PREREQ], +-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, +- [m4_default([$3], +- [m4_fatal([Libtool version $1 or higher is required], +- 63)])], +- [$2])]) +- +- +-# _LT_CHECK_BUILDDIR +-# ------------------ +-# Complain if the absolute build directory name contains unusual characters +-m4_defun([_LT_CHECK_BUILDDIR], +-[case `pwd` in +- *\ * | *\ *) +- AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +-esac +-]) +- +- +-# LT_INIT([OPTIONS]) +-# ------------------ +-AC_DEFUN([LT_INIT], +-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +-AC_BEFORE([$0], [LT_LANG])dnl +-AC_BEFORE([$0], [LT_OUTPUT])dnl +-AC_BEFORE([$0], [LTDL_INIT])dnl +-m4_require([_LT_CHECK_BUILDDIR])dnl +- +-dnl Autoconf doesn't catch unexpanded LT_ macros by default: +-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +-dnl unless we require an AC_DEFUNed macro: +-AC_REQUIRE([LTOPTIONS_VERSION])dnl +-AC_REQUIRE([LTSUGAR_VERSION])dnl +-AC_REQUIRE([LTVERSION_VERSION])dnl +-AC_REQUIRE([LTOBSOLETE_VERSION])dnl +-m4_require([_LT_PROG_LTMAIN])dnl +- +-dnl Parse OPTIONS +-_LT_SET_OPTIONS([$0], [$1]) +- +-# This can be used to rebuild libtool when needed +-LIBTOOL_DEPS="$ltmain" +- +-# Always use our own libtool. +-LIBTOOL='$(SHELL) $(top_builddir)/libtool' +-AC_SUBST(LIBTOOL)dnl +- +-_LT_SETUP +- +-# Only expand once: +-m4_define([LT_INIT]) +-])# LT_INIT +- +-# Old names: +-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +-dnl AC_DEFUN([AM_PROG_LIBTOOL], []) +- +- +-# _LT_CC_BASENAME(CC) +-# ------------------- +-# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +-m4_defun([_LT_CC_BASENAME], +-[for cc_temp in $1""; do +- case $cc_temp in +- compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; +- distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; +- \-*) ;; +- *) break;; +- esac +-done +-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +-]) +- +- +-# _LT_FILEUTILS_DEFAULTS +-# ---------------------- +-# It is okay to use these file commands and assume they have been set +-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +-m4_defun([_LT_FILEUTILS_DEFAULTS], +-[: ${CP="cp -f"} +-: ${MV="mv -f"} +-: ${RM="rm -f"} +-])# _LT_FILEUTILS_DEFAULTS +- +- +-# _LT_SETUP +-# --------- +-m4_defun([_LT_SETUP], +-[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-AC_REQUIRE([AC_CANONICAL_BUILD])dnl +-_LT_DECL([], [host_alias], [0], [The host system])dnl +-_LT_DECL([], [host], [0])dnl +-_LT_DECL([], [host_os], [0])dnl +-dnl +-_LT_DECL([], [build_alias], [0], [The build system])dnl +-_LT_DECL([], [build], [0])dnl +-_LT_DECL([], [build_os], [0])dnl +-dnl +-AC_REQUIRE([AC_PROG_CC])dnl +-AC_REQUIRE([LT_PATH_LD])dnl +-AC_REQUIRE([LT_PATH_NM])dnl +-dnl +-AC_REQUIRE([AC_PROG_LN_S])dnl +-test -z "$LN_S" && LN_S="ln -s" +-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +-dnl +-AC_REQUIRE([LT_CMD_MAX_LEN])dnl +-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +-dnl +-m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_CHECK_SHELL_FEATURES])dnl +-m4_require([_LT_CMD_RELOAD])dnl +-m4_require([_LT_CHECK_MAGIC_METHOD])dnl +-m4_require([_LT_CMD_OLD_ARCHIVE])dnl +-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +- +-_LT_CONFIG_LIBTOOL_INIT([ +-# See if we are running on zsh, and set the options which allow our +-# commands through without removal of \ escapes INIT. +-if test -n "\${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +-fi +-]) +-if test -n "${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +-fi +- +-_LT_CHECK_OBJDIR +- +-m4_require([_LT_TAG_COMPILER])dnl +-_LT_PROG_ECHO_BACKSLASH +- +-case $host_os in +-aix3*) +- # AIX sometimes has problems with the GCC collect2 program. For some +- # reason, if we set the COLLECT_NAMES environment variable, the problems +- # vanish in a puff of smoke. +- if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +- fi +- ;; +-esac +- +-# Sed substitution that helps us do robust quoting. It backslashifies +-# metacharacters that are still active within double-quoted strings. +-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' +- +-# Same as above, but do not quote variable references. +-double_quote_subst='s/\([["`\\]]\)/\\\1/g' +- +-# Sed substitution to delay expansion of an escaped shell variable in a +-# double_quote_subst'ed string. +-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +- +-# Sed substitution to delay expansion of an escaped single quote. +-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' +- +-# Sed substitution to avoid accidental globbing in evaled expressions +-no_glob_subst='s/\*/\\\*/g' +- +-# Global variables: +-ofile=libtool +-can_build_shared=yes +- +-# All known linkers require a `.a' archive for static linking (except MSVC, +-# which needs '.lib'). +-libext=a +- +-with_gnu_ld="$lt_cv_prog_gnu_ld" +- +-old_CC="$CC" +-old_CFLAGS="$CFLAGS" +- +-# Set sane defaults for various variables +-test -z "$CC" && CC=cc +-test -z "$LTCC" && LTCC=$CC +-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +-test -z "$LD" && LD=ld +-test -z "$ac_objext" && ac_objext=o +- +-_LT_CC_BASENAME([$compiler]) +- +-# Only perform the check for file, if the check method requires it +-test -z "$MAGIC_CMD" && MAGIC_CMD=file +-case $deplibs_check_method in +-file_magic*) +- if test "$file_magic_cmd" = '$MAGIC_CMD'; then +- _LT_PATH_MAGIC +- fi +- ;; +-esac +- +-# Use C for the default configuration in the libtool script +-LT_SUPPORTED_TAG([CC]) +-_LT_LANG_C_CONFIG +-_LT_LANG_DEFAULT_CONFIG +-_LT_CONFIG_COMMANDS +-])# _LT_SETUP +- +- +-# _LT_PROG_LTMAIN +-# --------------- +-# Note that this code is called both from `configure', and `config.status' +-# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +-# `config.status' has no value for ac_aux_dir unless we are using Automake, +-# so we pass a copy along to make sure it has a sensible value anyway. +-m4_defun([_LT_PROG_LTMAIN], +-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +-ltmain="$ac_aux_dir/ltmain.sh" +-])# _LT_PROG_LTMAIN +- +- +- +-# So that we can recreate a full libtool script including additional +-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +-# in macros and then make a single call at the end using the `libtool' +-# label. +- +- +-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +-# ---------------------------------------- +-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +-m4_define([_LT_CONFIG_LIBTOOL_INIT], +-[m4_ifval([$1], +- [m4_append([_LT_OUTPUT_LIBTOOL_INIT], +- [$1 +-])])]) +- +-# Initialize. +-m4_define([_LT_OUTPUT_LIBTOOL_INIT]) +- +- +-# _LT_CONFIG_LIBTOOL([COMMANDS]) +-# ------------------------------ +-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +-m4_define([_LT_CONFIG_LIBTOOL], +-[m4_ifval([$1], +- [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], +- [$1 +-])])]) +- +-# Initialize. +-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) +- +- +-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +-# ----------------------------------------------------- +-m4_defun([_LT_CONFIG_SAVE_COMMANDS], +-[_LT_CONFIG_LIBTOOL([$1]) +-_LT_CONFIG_LIBTOOL_INIT([$2]) +-]) +- +- +-# _LT_FORMAT_COMMENT([COMMENT]) +-# ----------------------------- +-# Add leading comment marks to the start of each line, and a trailing +-# full-stop to the whole comment if one is not present already. +-m4_define([_LT_FORMAT_COMMENT], +-[m4_ifval([$1], [ +-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], +- [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +-)]) +- +- +- +- +- +-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +-# ------------------------------------------------------------------- +-# CONFIGNAME is the name given to the value in the libtool script. +-# VARNAME is the (base) name used in the configure script. +-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +-# VARNAME. Any other value will be used directly. +-m4_define([_LT_DECL], +-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], +- [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], +- [m4_ifval([$1], [$1], [$2])]) +- lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) +- m4_ifval([$4], +- [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) +- lt_dict_add_subkey([lt_decl_dict], [$2], +- [tagged?], [m4_ifval([$5], [yes], [no])])]) +-]) +- +- +-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +-# -------------------------------------------------------- +-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) +- +- +-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +-# ------------------------------------------------ +-m4_define([lt_decl_tag_varnames], +-[_lt_decl_filter([tagged?], [yes], $@)]) +- +- +-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +-# --------------------------------------------------------- +-m4_define([_lt_decl_filter], +-[m4_case([$#], +- [0], [m4_fatal([$0: too few arguments: $#])], +- [1], [m4_fatal([$0: too few arguments: $#: $1])], +- [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], +- [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], +- [lt_dict_filter([lt_decl_dict], $@)])[]dnl +-]) +- +- +-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +-# -------------------------------------------------- +-m4_define([lt_decl_quote_varnames], +-[_lt_decl_filter([value], [1], $@)]) +- +- +-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +-# --------------------------------------------------- +-m4_define([lt_decl_dquote_varnames], +-[_lt_decl_filter([value], [2], $@)]) +- +- +-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +-# --------------------------------------------------- +-m4_define([lt_decl_varnames_tagged], +-[m4_assert([$# <= 2])dnl +-_$0(m4_quote(m4_default([$1], [[, ]])), +- m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), +- m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +-m4_define([_lt_decl_varnames_tagged], +-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) +- +- +-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +-# ------------------------------------------------ +-m4_define([lt_decl_all_varnames], +-[_$0(m4_quote(m4_default([$1], [[, ]])), +- m4_if([$2], [], +- m4_quote(lt_decl_varnames), +- m4_quote(m4_shift($@))))[]dnl +-]) +-m4_define([_lt_decl_all_varnames], +-[lt_join($@, lt_decl_varnames_tagged([$1], +- lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +-]) +- +- +-# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +-# ------------------------------------ +-# Quote a variable value, and forward it to `config.status' so that its +-# declaration there will have the same value as in `configure'. VARNAME +-# must have a single quote delimited value for this to work. +-m4_define([_LT_CONFIG_STATUS_DECLARE], +-[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) +- +- +-# _LT_CONFIG_STATUS_DECLARATIONS +-# ------------------------------ +-# We delimit libtool config variables with single quotes, so when +-# we write them to config.status, we have to be sure to quote all +-# embedded single quotes properly. In configure, this macro expands +-# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +-# +-# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), +- [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) +- +- +-# _LT_LIBTOOL_TAGS +-# ---------------- +-# Output comment and list of tags supported by the script +-m4_defun([_LT_LIBTOOL_TAGS], +-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +-available_tags="_LT_TAGS"dnl +-]) +- +- +-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +-# ----------------------------------- +-# Extract the dictionary values for VARNAME (optionally with TAG) and +-# expand to a commented shell variable setting: +-# +-# # Some comment about what VAR is for. +-# visible_name=$lt_internal_name +-m4_define([_LT_LIBTOOL_DECLARE], +-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], +- [description])))[]dnl +-m4_pushdef([_libtool_name], +- m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), +- [0], [_libtool_name=[$]$1], +- [1], [_libtool_name=$lt_[]$1], +- [2], [_libtool_name=$lt_[]$1], +- [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +-]) +- +- +-# _LT_LIBTOOL_CONFIG_VARS +-# ----------------------- +-# Produce commented declarations of non-tagged libtool config variables +-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +-# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +-# section) are produced by _LT_LIBTOOL_TAG_VARS. +-m4_defun([_LT_LIBTOOL_CONFIG_VARS], +-[m4_foreach([_lt_var], +- m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), +- [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) +- +- +-# _LT_LIBTOOL_TAG_VARS(TAG) +-# ------------------------- +-m4_define([_LT_LIBTOOL_TAG_VARS], +-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), +- [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) +- +- +-# _LT_TAGVAR(VARNAME, [TAGNAME]) +-# ------------------------------ +-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) +- +- +-# _LT_CONFIG_COMMANDS +-# ------------------- +-# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +-# variables for single and double quote escaping we saved from calls +-# to _LT_DECL, we can put quote escaped variables declarations +-# into `config.status', and then the shell code to quote escape them in +-# for loops in `config.status'. Finally, any additional code accumulated +-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +-m4_defun([_LT_CONFIG_COMMANDS], +-[AC_PROVIDE_IFELSE([LT_OUTPUT], +- dnl If the libtool generation code has been placed in $CONFIG_LT, +- dnl instead of duplicating it all over again into config.status, +- dnl then we will have config.status run $CONFIG_LT later, so it +- dnl needs to know what name is stored there: +- [AC_CONFIG_COMMANDS([libtool], +- [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], +- dnl If the libtool generation code is destined for config.status, +- dnl expand the accumulated commands and init code now: +- [AC_CONFIG_COMMANDS([libtool], +- [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +-])#_LT_CONFIG_COMMANDS +- +- +-# Initialize. +-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +-[ +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-sed_quote_subst='$sed_quote_subst' +-double_quote_subst='$double_quote_subst' +-delay_variable_subst='$delay_variable_subst' +-_LT_CONFIG_STATUS_DECLARATIONS +-LTCC='$LTCC' +-LTCFLAGS='$LTCFLAGS' +-compiler='$compiler_DEFAULT' +- +-# Quote evaled strings. +-for var in lt_decl_all_varnames([[ \ +-]], lt_decl_quote_varnames); do +- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in +- *[[\\\\\\\`\\"\\\$]]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" +- ;; +- *) +- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" +- ;; +- esac +-done +- +-# Double-quote double-evaled strings. +-for var in lt_decl_all_varnames([[ \ +-]], lt_decl_dquote_varnames); do +- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in +- *[[\\\\\\\`\\"\\\$]]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" +- ;; +- *) +- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" +- ;; +- esac +-done +- +-# Fix-up fallback echo if it was mangled by the above quoting rules. +-case \$lt_ECHO in +-*'\\\[$]0 --fallback-echo"')dnl " +- lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` +- ;; +-esac +- +-_LT_OUTPUT_LIBTOOL_INIT +-]) +- +- +-# LT_OUTPUT +-# --------- +-# This macro allows early generation of the libtool script (before +-# AC_OUTPUT is called), incase it is used in configure for compilation +-# tests. +-AC_DEFUN([LT_OUTPUT], +-[: ${CONFIG_LT=./config.lt} +-AC_MSG_NOTICE([creating $CONFIG_LT]) +-cat >"$CONFIG_LT" <<_LTEOF +-#! $SHELL +-# Generated by $as_me. +-# Run this file to recreate a libtool stub with the current configuration. +- +-lt_cl_silent=false +-SHELL=\${CONFIG_SHELL-$SHELL} +-_LTEOF +- +-cat >>"$CONFIG_LT" <<\_LTEOF +-AS_SHELL_SANITIZE +-_AS_PREPARE +- +-exec AS_MESSAGE_FD>&1 +-exec AS_MESSAGE_LOG_FD>>config.log +-{ +- echo +- AS_BOX([Running $as_me.]) +-} >&AS_MESSAGE_LOG_FD +- +-lt_cl_help="\ +-\`$as_me' creates a local libtool stub from the current configuration, +-for use in further configure time tests before the real libtool is +-generated. +- +-Usage: $[0] [[OPTIONS]] +- +- -h, --help print this help, then exit +- -V, --version print version number, then exit +- -q, --quiet do not print progress messages +- -d, --debug don't remove temporary files +- +-Report bugs to ." +- +-lt_cl_version="\ +-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +-configured by $[0], generated by m4_PACKAGE_STRING. +- +-Copyright (C) 2008 Free Software Foundation, Inc. +-This config.lt script is free software; the Free Software Foundation +-gives unlimited permision to copy, distribute and modify it." +- +-while test $[#] != 0 +-do +- case $[1] in +- --version | --v* | -V ) +- echo "$lt_cl_version"; exit 0 ;; +- --help | --h* | -h ) +- echo "$lt_cl_help"; exit 0 ;; +- --debug | --d* | -d ) +- debug=: ;; +- --quiet | --q* | --silent | --s* | -q ) +- lt_cl_silent=: ;; +- +- -*) AC_MSG_ERROR([unrecognized option: $[1] +-Try \`$[0] --help' for more information.]) ;; +- +- *) AC_MSG_ERROR([unrecognized argument: $[1] +-Try \`$[0] --help' for more information.]) ;; +- esac +- shift +-done +- +-if $lt_cl_silent; then +- exec AS_MESSAGE_FD>/dev/null +-fi +-_LTEOF +- +-cat >>"$CONFIG_LT" <<_LTEOF +-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +-_LTEOF +- +-cat >>"$CONFIG_LT" <<\_LTEOF +-AC_MSG_NOTICE([creating $ofile]) +-_LT_OUTPUT_LIBTOOL_COMMANDS +-AS_EXIT(0) +-_LTEOF +-chmod +x "$CONFIG_LT" +- +-# configure is writing to config.log, but config.lt does its own redirection, +-# appending to config.log, which fails on DOS, as config.log is still kept +-# open by configure. Here we exec the FD to /dev/null, effectively closing +-# config.log, so it can be properly (re)opened and appended to by config.lt. +-if test "$no_create" != yes; then +- lt_cl_success=: +- test "$silent" = yes && +- lt_config_lt_args="$lt_config_lt_args --quiet" +- exec AS_MESSAGE_LOG_FD>/dev/null +- $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +- exec AS_MESSAGE_LOG_FD>>config.log +- $lt_cl_success || AS_EXIT(1) +-fi +-])# LT_OUTPUT +- +- +-# _LT_CONFIG(TAG) +-# --------------- +-# If TAG is the built-in tag, create an initial libtool script with a +-# default configuration from the untagged config vars. Otherwise add code +-# to config.status for appending the configuration named by TAG from the +-# matching tagged config vars. +-m4_defun([_LT_CONFIG], +-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-_LT_CONFIG_SAVE_COMMANDS([ +- m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl +- m4_if(_LT_TAG, [C], [ +- # See if we are running on zsh, and set the options which allow our +- # commands through without removal of \ escapes. +- if test -n "${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +- fi +- +- cfgfile="${ofile}T" +- trap "$RM \"$cfgfile\"; exit 1" 1 2 15 +- $RM "$cfgfile" +- +- cat <<_LT_EOF >> "$cfgfile" +-#! $SHELL +- +-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +-# NOTE: Changes made to this file will be lost: look at ltmain.sh. +-# +-_LT_COPYING +-_LT_LIBTOOL_TAGS +- +-# ### BEGIN LIBTOOL CONFIG +-_LT_LIBTOOL_CONFIG_VARS +-_LT_LIBTOOL_TAG_VARS +-# ### END LIBTOOL CONFIG +- +-_LT_EOF +- +- case $host_os in +- aix3*) +- cat <<\_LT_EOF >> "$cfgfile" +-# AIX sometimes has problems with the GCC collect2 program. For some +-# reason, if we set the COLLECT_NAMES environment variable, the problems +-# vanish in a puff of smoke. +-if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +-fi +-_LT_EOF +- ;; +- esac +- +- _LT_PROG_LTMAIN +- +- # We use sed instead of cat because bash on DJGPP gets confused if +- # if finds mixed CR/LF and LF-only lines. Since sed operates in +- # text mode, it properly converts lines to CR/LF. This bash problem +- # is reportedly fixed, but why not run on old versions too? +- sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- _LT_PROG_XSI_SHELLFNS +- +- sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- mv -f "$cfgfile" "$ofile" || +- (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") +- chmod +x "$ofile" +-], +-[cat <<_LT_EOF >> "$ofile" +- +-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +-dnl in a comment (ie after a #). +-# ### BEGIN LIBTOOL TAG CONFIG: $1 +-_LT_LIBTOOL_TAG_VARS(_LT_TAG) +-# ### END LIBTOOL TAG CONFIG: $1 +-_LT_EOF +-])dnl /m4_if +-], +-[m4_if([$1], [], [ +- PACKAGE='$PACKAGE' +- VERSION='$VERSION' +- TIMESTAMP='$TIMESTAMP' +- RM='$RM' +- ofile='$ofile'], []) +-])dnl /_LT_CONFIG_SAVE_COMMANDS +-])# _LT_CONFIG +- +- +-# LT_SUPPORTED_TAG(TAG) +-# --------------------- +-# Trace this macro to discover what tags are supported by the libtool +-# --tag option, using: +-# autoconf --trace 'LT_SUPPORTED_TAG:$1' +-AC_DEFUN([LT_SUPPORTED_TAG], []) +- +- +-# C support is built-in for now +-m4_define([_LT_LANG_C_enabled], []) +-m4_define([_LT_TAGS], []) +- +- +-# LT_LANG(LANG) +-# ------------- +-# Enable libtool support for the given language if not already enabled. +-AC_DEFUN([LT_LANG], +-[AC_BEFORE([$0], [LT_OUTPUT])dnl +-m4_case([$1], +- [C], [_LT_LANG(C)], +- [C++], [_LT_LANG(CXX)], +- [Java], [_LT_LANG(GCJ)], +- [Fortran 77], [_LT_LANG(F77)], +- [Fortran], [_LT_LANG(FC)], +- [Windows Resource], [_LT_LANG(RC)], +- [m4_ifdef([_LT_LANG_]$1[_CONFIG], +- [_LT_LANG($1)], +- [m4_fatal([$0: unsupported language: "$1"])])])dnl +-])# LT_LANG +- +- +-# _LT_LANG(LANGNAME) +-# ------------------ +-m4_defun([_LT_LANG], +-[m4_ifdef([_LT_LANG_]$1[_enabled], [], +- [LT_SUPPORTED_TAG([$1])dnl +- m4_append([_LT_TAGS], [$1 ])dnl +- m4_define([_LT_LANG_]$1[_enabled], [])dnl +- _LT_LANG_$1_CONFIG($1)])dnl +-])# _LT_LANG +- +- +-# _LT_LANG_DEFAULT_CONFIG +-# ----------------------- +-m4_defun([_LT_LANG_DEFAULT_CONFIG], +-[AC_PROVIDE_IFELSE([AC_PROG_CXX], +- [LT_LANG(CXX)], +- [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) +- +-AC_PROVIDE_IFELSE([AC_PROG_F77], +- [LT_LANG(F77)], +- [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) +- +-AC_PROVIDE_IFELSE([AC_PROG_FC], +- [LT_LANG(FC)], +- [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) +- +-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +-dnl pulling things in needlessly. +-AC_PROVIDE_IFELSE([AC_PROG_GCJ], +- [LT_LANG(GCJ)], +- [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], +- [LT_LANG(GCJ)], +- [AC_PROVIDE_IFELSE([LT_PROG_GCJ], +- [LT_LANG(GCJ)], +- [m4_ifdef([AC_PROG_GCJ], +- [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) +- m4_ifdef([A][M_PROG_GCJ], +- [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) +- m4_ifdef([LT_PROG_GCJ], +- [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) +- +-AC_PROVIDE_IFELSE([LT_PROG_RC], +- [LT_LANG(RC)], +- [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +-])# _LT_LANG_DEFAULT_CONFIG +- +-# Obsolete macros: +-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +-dnl AC_DEFUN([AC_LIBTOOL_F77], []) +-dnl AC_DEFUN([AC_LIBTOOL_FC], []) +-dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +- +- +-# _LT_TAG_COMPILER +-# ---------------- +-m4_defun([_LT_TAG_COMPILER], +-[AC_REQUIRE([AC_PROG_CC])dnl +- +-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl +- +-# If no C compiler was specified, use CC. +-LTCC=${LTCC-"$CC"} +- +-# If no C compiler flags were specified, use CFLAGS. +-LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +- +-# Allow CC to be a program name with arguments. +-compiler=$CC +-])# _LT_TAG_COMPILER +- +- +-# _LT_COMPILER_BOILERPLATE +-# ------------------------ +-# Check for compiler boilerplate output or warnings with +-# the simple compiler test code. +-m4_defun([_LT_COMPILER_BOILERPLATE], +-[m4_require([_LT_DECL_SED])dnl +-ac_outfile=conftest.$ac_objext +-echo "$lt_simple_compile_test_code" >conftest.$ac_ext +-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_compiler_boilerplate=`cat conftest.err` +-$RM conftest* +-])# _LT_COMPILER_BOILERPLATE +- +- +-# _LT_LINKER_BOILERPLATE +-# ---------------------- +-# Check for linker boilerplate output or warnings with +-# the simple link test code. +-m4_defun([_LT_LINKER_BOILERPLATE], +-[m4_require([_LT_DECL_SED])dnl +-ac_outfile=conftest.$ac_objext +-echo "$lt_simple_link_test_code" >conftest.$ac_ext +-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_linker_boilerplate=`cat conftest.err` +-$RM -r conftest* +-])# _LT_LINKER_BOILERPLATE +- +-# _LT_REQUIRED_DARWIN_CHECKS +-# ------------------------- +-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ +- case $host_os in +- rhapsody* | darwin*) +- AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) +- AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) +- AC_CHECK_TOOL([LIPO], [lipo], [:]) +- AC_CHECK_TOOL([OTOOL], [otool], [:]) +- AC_CHECK_TOOL([OTOOL64], [otool64], [:]) +- _LT_DECL([], [DSYMUTIL], [1], +- [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) +- _LT_DECL([], [NMEDIT], [1], +- [Tool to change global to local symbols on Mac OS X]) +- _LT_DECL([], [LIPO], [1], +- [Tool to manipulate fat objects and archives on Mac OS X]) +- _LT_DECL([], [OTOOL], [1], +- [ldd/readelf like tool for Mach-O binaries on Mac OS X]) +- _LT_DECL([], [OTOOL64], [1], +- [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) +- +- AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], +- [lt_cv_apple_cc_single_mod=no +- if test -z "${LT_MULTI_MODULE}"; then +- # By default we will add the -single_module flag. You can override +- # by either setting the environment variable LT_MULTI_MODULE +- # non-empty at configure time, or by adding -multi_module to the +- # link flags. +- rm -rf libconftest.dylib* +- echo "int foo(void){return 1;}" > conftest.c +- echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD +- $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +- -dynamiclib -Wl,-single_module conftest.c 2>conftest.err +- _lt_result=$? +- if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then +- lt_cv_apple_cc_single_mod=yes +- else +- cat conftest.err >&AS_MESSAGE_LOG_FD +- fi +- rm -rf libconftest.dylib* +- rm -f conftest.* +- fi]) +- AC_CACHE_CHECK([for -exported_symbols_list linker flag], +- [lt_cv_ld_exported_symbols_list], +- [lt_cv_ld_exported_symbols_list=no +- save_LDFLAGS=$LDFLAGS +- echo "_main" > conftest.sym +- LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" +- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], +- [lt_cv_ld_exported_symbols_list=yes], +- [lt_cv_ld_exported_symbols_list=no]) +- LDFLAGS="$save_LDFLAGS" +- ]) +- case $host_os in +- rhapsody* | darwin1.[[012]]) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; +- darwin1.*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- darwin*) # darwin 5.x on +- # if running on 10.5 or later, the deployment target defaults +- # to the OS version, if on x86, and 10.4, the deployment +- # target defaults to 10.4. Don't you love it? +- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in +- 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- 10.[[012]]*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- 10.*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- esac +- ;; +- esac +- if test "$lt_cv_apple_cc_single_mod" = "yes"; then +- _lt_dar_single_mod='$single_module' +- fi +- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then +- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' +- else +- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- if test "$DSYMUTIL" != ":"; then +- _lt_dsymutil='~$DSYMUTIL $lib || :' +- else +- _lt_dsymutil= +- fi +- ;; +- esac +-]) +- +- +-# _LT_DARWIN_LINKER_FEATURES +-# -------------------------- +-# Checks for linker and compiler features on darwin +-m4_defun([_LT_DARWIN_LINKER_FEATURES], +-[ +- m4_require([_LT_REQUIRED_DARWIN_CHECKS]) +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- _LT_TAGVAR(hardcode_direct, $1)=no +- _LT_TAGVAR(hardcode_automatic, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +- _LT_TAGVAR(whole_archive_flag_spec, $1)='' +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" +- case $cc_basename in +- ifort*) _lt_dar_can_shared=yes ;; +- *) _lt_dar_can_shared=$GCC ;; +- esac +- if test "$_lt_dar_can_shared" = "yes"; then +- output_verbose_link_cmd=echo +- _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" +- _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" +- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" +- _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" +- m4_if([$1], [CXX], +-[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then +- _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" +- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" +- fi +-],[]) +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +-]) +- +-# _LT_SYS_MODULE_PATH_AIX +-# ----------------------- +-# Links a minimal program and checks the executable +-# for the system default hardcoded library path. In most cases, +-# this is /usr/lib:/lib, but when the MPI compilers are used +-# the location of the communication and MPI libs are included too. +-# If we don't find anything, use the default library path according +-# to the aix ld manual. +-m4_defun([_LT_SYS_MODULE_PATH_AIX], +-[m4_require([_LT_DECL_SED])dnl +-AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +-lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\(.*\)$/\1/ +- p +- } +- }' +-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-# Check for a 64-bit object if we didn't find anything. +-if test -z "$aix_libpath"; then +- aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-fi],[]) +-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +-])# _LT_SYS_MODULE_PATH_AIX +- +- +-# _LT_SHELL_INIT(ARG) +-# ------------------- +-m4_define([_LT_SHELL_INIT], +-[ifdef([AC_DIVERSION_NOTICE], +- [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], +- [AC_DIVERT_PUSH(NOTICE)]) +-$1 +-AC_DIVERT_POP +-])# _LT_SHELL_INIT +- +- +-# _LT_PROG_ECHO_BACKSLASH +-# ----------------------- +-# Add some code to the start of the generated configure script which +-# will find an echo command which doesn't interpret backslashes. +-m4_defun([_LT_PROG_ECHO_BACKSLASH], +-[_LT_SHELL_INIT([ +-# Check that we are running under the correct shell. +-SHELL=${CONFIG_SHELL-/bin/sh} +- +-case X$lt_ECHO in +-X*--fallback-echo) +- # Remove one level of quotation (which was required for Make). +- ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` +- ;; +-esac +- +-ECHO=${lt_ECHO-echo} +-if test "X[$]1" = X--no-reexec; then +- # Discard the --no-reexec flag, and continue. +- shift +-elif test "X[$]1" = X--fallback-echo; then +- # Avoid inline document here, it may be left over +- : +-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then +- # Yippee, $ECHO works! +- : +-else +- # Restart under the correct shell. +- exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +-fi +- +-if test "X[$]1" = X--fallback-echo; then +- # used as fallback echo +- shift +- cat <<_LT_EOF +-[$]* +-_LT_EOF +- exit 0 +-fi +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-if test -z "$lt_ECHO"; then +- if test "X${echo_test_string+set}" != Xset; then +- # find a string as large as possible, as long as the shell can cope with it +- for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do +- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... +- if { echo_test_string=`eval $cmd`; } 2>/dev/null && +- { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null +- then +- break +- fi +- done +- fi +- +- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- : +- else +- # The Solaris, AIX, and Digital Unix default echo programs unquote +- # backslashes. This makes it impossible to quote backslashes using +- # echo "$something" | sed 's/\\/\\\\/g' +- # +- # So, first we look for a working echo in the user's PATH. +- +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for dir in $PATH /usr/ucb; do +- IFS="$lt_save_ifs" +- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && +- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && +- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- ECHO="$dir/echo" +- break +- fi +- done +- IFS="$lt_save_ifs" +- +- if test "X$ECHO" = Xecho; then +- # We didn't find a better echo, so look for alternatives. +- if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # This shell has a builtin print -r that does the trick. +- ECHO='print -r' +- elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && +- test "X$CONFIG_SHELL" != X/bin/ksh; then +- # If we have ksh, try running configure again with it. +- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} +- export ORIGINAL_CONFIG_SHELL +- CONFIG_SHELL=/bin/ksh +- export CONFIG_SHELL +- exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} +- else +- # Try using printf. +- ECHO='printf %s\n' +- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # Cool, printf works +- : +- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL +- export CONFIG_SHELL +- SHELL="$CONFIG_SHELL" +- export SHELL +- ECHO="$CONFIG_SHELL [$]0 --fallback-echo" +- elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- ECHO="$CONFIG_SHELL [$]0 --fallback-echo" +- else +- # maybe with a smaller string... +- prev=: +- +- for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do +- if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null +- then +- break +- fi +- prev="$cmd" +- done +- +- if test "$prev" != 'sed 50q "[$]0"'; then +- echo_test_string=`eval $prev` +- export echo_test_string +- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} +- else +- # Oops. We lost completely, so just stick with echo. +- ECHO=echo +- fi +- fi +- fi +- fi +- fi +-fi +- +-# Copy echo and quote the copy suitably for passing to libtool from +-# the Makefile, instead of quoting the original, which is used later. +-lt_ECHO=$ECHO +-if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then +- lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +-fi +- +-AC_SUBST(lt_ECHO) +-]) +-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +-_LT_DECL([], [ECHO], [1], +- [An echo program that does not interpret backslashes]) +-])# _LT_PROG_ECHO_BACKSLASH +- +- +-# _LT_ENABLE_LOCK +-# --------------- +-m4_defun([_LT_ENABLE_LOCK], +-[AC_ARG_ENABLE([libtool-lock], +- [AS_HELP_STRING([--disable-libtool-lock], +- [avoid locking (might break parallel builds)])]) +-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +- +-# Some flags need to be propagated to the compiler or linker for good +-# libtool support. +-case $host in +-ia64-*-hpux*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if AC_TRY_EVAL(ac_compile); then +- case `/usr/bin/file conftest.$ac_objext` in +- *ELF-32*) +- HPUX_IA64_MODE="32" +- ;; +- *ELF-64*) +- HPUX_IA64_MODE="64" +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +-*-*-irix6*) +- # Find out which ABI we are using. +- echo '[#]line __oline__ "configure"' > conftest.$ac_ext +- if AC_TRY_EVAL(ac_compile); then +- if test "$lt_cv_prog_gnu_ld" = yes; then +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -melf32bsmip" +- ;; +- *N32*) +- LD="${LD-ld} -melf32bmipn32" +- ;; +- *64-bit*) +- LD="${LD-ld} -melf64bmip" +- ;; +- esac +- else +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -32" +- ;; +- *N32*) +- LD="${LD-ld} -n32" +- ;; +- *64-bit*) +- LD="${LD-ld} -64" +- ;; +- esac +- fi +- fi +- rm -rf conftest* +- ;; +- +-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +-s390*-*linux*|s390*-*tpf*|sparc*-*linux*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if AC_TRY_EVAL(ac_compile); then +- case `/usr/bin/file conftest.o` in +- *32-bit*) +- case $host in +- x86_64-*kfreebsd*-gnu) +- LD="${LD-ld} -m elf_i386_fbsd" +- ;; +- x86_64-*linux*) +- LD="${LD-ld} -m elf_i386" +- ;; +- powerpc64le-*linux*) +- LD="${LD-ld} -m elf32lppclinux" +- ;; +- powerpc64-*linux*) +- LD="${LD-ld} -m elf32ppclinux" +- ;; +- s390x-*linux*) +- LD="${LD-ld} -m elf_s390" +- ;; +- sparc64-*linux*) +- LD="${LD-ld} -m elf32_sparc" +- ;; +- esac +- ;; +- *64-bit*) +- case $host in +- x86_64-*kfreebsd*-gnu) +- LD="${LD-ld} -m elf_x86_64_fbsd" +- ;; +- x86_64-*linux*) +- LD="${LD-ld} -m elf_x86_64" +- ;; +- powerpcle-*linux*) +- LD="${LD-ld} -m elf64lppc" +- ;; +- powerpc-*linux*) +- LD="${LD-ld} -m elf64ppc" +- ;; +- s390*-*linux*|s390*-*tpf*) +- LD="${LD-ld} -m elf64_s390" +- ;; +- sparc*-*linux*) +- LD="${LD-ld} -m elf64_sparc" +- ;; +- esac +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +- +-*-*-sco3.2v5*) +- # On SCO OpenServer 5, we need -belf to get full-featured binaries. +- SAVE_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -belf" +- AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, +- [AC_LANG_PUSH(C) +- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) +- AC_LANG_POP]) +- if test x"$lt_cv_cc_needs_belf" != x"yes"; then +- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf +- CFLAGS="$SAVE_CFLAGS" +- fi +- ;; +-sparc*-*solaris*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if AC_TRY_EVAL(ac_compile); then +- case `/usr/bin/file conftest.o` in +- *64-bit*) +- case $lt_cv_prog_gnu_ld in +- yes*) LD="${LD-ld} -m elf64_sparc" ;; +- *) +- if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then +- LD="${LD-ld} -64" +- fi +- ;; +- esac +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +-esac +- +-need_locks="$enable_libtool_lock" +-])# _LT_ENABLE_LOCK +- +- +-# _LT_CMD_OLD_ARCHIVE +-# ------------------- +-m4_defun([_LT_CMD_OLD_ARCHIVE], +-[AC_CHECK_TOOL(AR, ar, false) +-test -z "$AR" && AR=ar +-test -z "$AR_FLAGS" && AR_FLAGS=cru +-_LT_DECL([], [AR], [1], [The archiver]) +-_LT_DECL([], [AR_FLAGS], [1]) +- +-AC_CHECK_TOOL(STRIP, strip, :) +-test -z "$STRIP" && STRIP=: +-_LT_DECL([], [STRIP], [1], [A symbol stripping program]) +- +-AC_CHECK_TOOL(RANLIB, ranlib, :) +-test -z "$RANLIB" && RANLIB=: +-_LT_DECL([], [RANLIB], [1], +- [Commands used to install an old-style archive]) +- +-# Determine commands to create old-style static archives. +-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +-old_postinstall_cmds='chmod 644 $oldlib' +-old_postuninstall_cmds= +- +-if test -n "$RANLIB"; then +- case $host_os in +- openbsd*) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" +- ;; +- *) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" +- ;; +- esac +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +-fi +-_LT_DECL([], [old_postinstall_cmds], [2]) +-_LT_DECL([], [old_postuninstall_cmds], [2]) +-_LT_TAGDECL([], [old_archive_cmds], [2], +- [Commands used to build an old-style archive]) +-])# _LT_CMD_OLD_ARCHIVE +- +- +-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +-# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +-# ---------------------------------------------------------------- +-# Check whether the given compiler option works +-AC_DEFUN([_LT_COMPILER_OPTION], +-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_SED])dnl +-AC_CACHE_CHECK([$1], [$2], +- [$2=no +- m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="$3" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&AS_MESSAGE_LOG_FD +- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- $2=yes +- fi +- fi +- $RM conftest* +-]) +- +-if test x"[$]$2" = xyes; then +- m4_if([$5], , :, [$5]) +-else +- m4_if([$6], , :, [$6]) +-fi +-])# _LT_COMPILER_OPTION +- +-# Old name: +-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) +- +- +-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +-# [ACTION-SUCCESS], [ACTION-FAILURE]) +-# ---------------------------------------------------- +-# Check whether the given linker option works +-AC_DEFUN([_LT_LINKER_OPTION], +-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_SED])dnl +-AC_CACHE_CHECK([$1], [$2], +- [$2=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $3" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&AS_MESSAGE_LOG_FD +- $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- $2=yes +- fi +- else +- $2=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +-]) +- +-if test x"[$]$2" = xyes; then +- m4_if([$4], , :, [$4]) +-else +- m4_if([$5], , :, [$5]) +-fi +-])# _LT_LINKER_OPTION +- +-# Old name: +-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) +- +- +-# LT_CMD_MAX_LEN +-#--------------- +-AC_DEFUN([LT_CMD_MAX_LEN], +-[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-# find the maximum length of command line arguments +-AC_MSG_CHECKING([the maximum length of command line arguments]) +-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl +- i=0 +- teststring="ABCD" +- +- case $build_os in +- msdosdjgpp*) +- # On DJGPP, this test can blow up pretty badly due to problems in libc +- # (any single argument exceeding 2000 bytes causes a buffer overrun +- # during glob expansion). Even if it were fixed, the result of this +- # check would be larger than it should be. +- lt_cv_sys_max_cmd_len=12288; # 12K is about right +- ;; +- +- gnu*) +- # Under GNU Hurd, this test is not required because there is +- # no limit to the length of command line arguments. +- # Libtool will interpret -1 as no limit whatsoever +- lt_cv_sys_max_cmd_len=-1; +- ;; +- +- cygwin* | mingw* | cegcc*) +- # On Win9x/ME, this test blows up -- it succeeds, but takes +- # about 5 minutes as the teststring grows exponentially. +- # Worse, since 9x/ME are not pre-emptively multitasking, +- # you end up with a "frozen" computer, even though with patience +- # the test eventually succeeds (with a max line length of 256k). +- # Instead, let's just punt: use the minimum linelength reported by +- # all of the supported platforms: 8192 (on NT/2K/XP). +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- amigaos*) +- # On AmigaOS with pdksh, this test takes hours, literally. +- # So we just punt and use a minimum line length of 8192. +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) +- # This has been around since 386BSD, at least. Likely further. +- if test -x /sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` +- elif test -x /usr/sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` +- else +- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs +- fi +- # And add a safety zone +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- ;; +- +- interix*) +- # We know the value 262144 and hardcode it with a safety zone (like BSD) +- lt_cv_sys_max_cmd_len=196608 +- ;; +- +- osf*) +- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure +- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not +- # nice to cause kernel panics so lets avoid the loop below. +- # First set a reasonable default. +- lt_cv_sys_max_cmd_len=16384 +- # +- if test -x /sbin/sysconfig; then +- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in +- *1*) lt_cv_sys_max_cmd_len=-1 ;; +- esac +- fi +- ;; +- sco3.2v5*) +- lt_cv_sys_max_cmd_len=102400 +- ;; +- sysv5* | sco5v6* | sysv4.2uw2*) +- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` +- if test -n "$kargmax"; then +- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` +- else +- lt_cv_sys_max_cmd_len=32768 +- fi +- ;; +- *) +- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` +- if test -n "$lt_cv_sys_max_cmd_len"; then +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- else +- # Make teststring a little bigger before we do anything with it. +- # a 1K string should be a reasonable start. +- for i in 1 2 3 4 5 6 7 8 ; do +- teststring=$teststring$teststring +- done +- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} +- # If test is not a shell built-in, we'll probably end up computing a +- # maximum length that is only half of the actual maximum length, but +- # we can't tell. +- while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ +- = "XX$teststring$teststring"; } >/dev/null 2>&1 && +- test $i != 17 # 1/2 MB should be enough +- do +- i=`expr $i + 1` +- teststring=$teststring$teststring +- done +- # Only check the string length outside the loop. +- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` +- teststring= +- # Add a significant safety factor because C++ compilers can tack on +- # massive amounts of additional arguments before passing them to the +- # linker. It appears as though 1/2 is a usable value. +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` +- fi +- ;; +- esac +-]) +-if test -n $lt_cv_sys_max_cmd_len ; then +- AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +-else +- AC_MSG_RESULT(none) +-fi +-max_cmd_len=$lt_cv_sys_max_cmd_len +-_LT_DECL([], [max_cmd_len], [0], +- [What is the maximum length of a command?]) +-])# LT_CMD_MAX_LEN +- +-# Old name: +-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) +- +- +-# _LT_HEADER_DLFCN +-# ---------------- +-m4_defun([_LT_HEADER_DLFCN], +-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +-])# _LT_HEADER_DLFCN +- +- +-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +-# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +-# ---------------------------------------------------------------- +-m4_defun([_LT_TRY_DLOPEN_SELF], +-[m4_require([_LT_HEADER_DLFCN])dnl +-if test "$cross_compiling" = yes; then : +- [$4] +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext <<_LT_EOF +-[#line __oline__ "configure" +-#include "confdefs.h" +- +-#if HAVE_DLFCN_H +-#include +-#endif +- +-#include +- +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif +- +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif +- +-void fnord() { int i=42;} +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; +- +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- /* dlclose (self); */ +- } +- else +- puts (dlerror ()); +- +- return status; +-}] +-_LT_EOF +- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) $1 ;; +- x$lt_dlneed_uscore) $2 ;; +- x$lt_dlunknown|x*) $3 ;; +- esac +- else : +- # compilation failed +- $3 +- fi +-fi +-rm -fr conftest* +-])# _LT_TRY_DLOPEN_SELF +- +- +-# LT_SYS_DLOPEN_SELF +-# ------------------ +-AC_DEFUN([LT_SYS_DLOPEN_SELF], +-[m4_require([_LT_HEADER_DLFCN])dnl +-if test "x$enable_dlopen" != xyes; then +- enable_dlopen=unknown +- enable_dlopen_self=unknown +- enable_dlopen_self_static=unknown +-else +- lt_cv_dlopen=no +- lt_cv_dlopen_libs= +- +- case $host_os in +- beos*) +- lt_cv_dlopen="load_add_on" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ;; +- +- mingw* | pw32* | cegcc*) +- lt_cv_dlopen="LoadLibrary" +- lt_cv_dlopen_libs= +- ;; +- +- cygwin*) +- lt_cv_dlopen="dlopen" +- lt_cv_dlopen_libs= +- ;; +- +- darwin*) +- # if libdl is installed we need to link against it +- AC_CHECK_LIB([dl], [dlopen], +- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ +- lt_cv_dlopen="dyld" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ]) +- ;; +- +- *) +- AC_CHECK_FUNC([shl_load], +- [lt_cv_dlopen="shl_load"], +- [AC_CHECK_LIB([dld], [shl_load], +- [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], +- [AC_CHECK_FUNC([dlopen], +- [lt_cv_dlopen="dlopen"], +- [AC_CHECK_LIB([dl], [dlopen], +- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], +- [AC_CHECK_LIB([svld], [dlopen], +- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], +- [AC_CHECK_LIB([dld], [dld_link], +- [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) +- ]) +- ]) +- ]) +- ]) +- ]) +- ;; +- esac +- +- if test "x$lt_cv_dlopen" != xno; then +- enable_dlopen=yes +- else +- enable_dlopen=no +- fi +- +- case $lt_cv_dlopen in +- dlopen) +- save_CPPFLAGS="$CPPFLAGS" +- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +- +- save_LDFLAGS="$LDFLAGS" +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +- +- save_LIBS="$LIBS" +- LIBS="$lt_cv_dlopen_libs $LIBS" +- +- AC_CACHE_CHECK([whether a program can dlopen itself], +- lt_cv_dlopen_self, [dnl +- _LT_TRY_DLOPEN_SELF( +- lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, +- lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) +- ]) +- +- if test "x$lt_cv_dlopen_self" = xyes; then +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" +- AC_CACHE_CHECK([whether a statically linked program can dlopen itself], +- lt_cv_dlopen_self_static, [dnl +- _LT_TRY_DLOPEN_SELF( +- lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, +- lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) +- ]) +- fi +- +- CPPFLAGS="$save_CPPFLAGS" +- LDFLAGS="$save_LDFLAGS" +- LIBS="$save_LIBS" +- ;; +- esac +- +- case $lt_cv_dlopen_self in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac +- +- case $lt_cv_dlopen_self_static in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac +-fi +-_LT_DECL([dlopen_support], [enable_dlopen], [0], +- [Whether dlopen is supported]) +-_LT_DECL([dlopen_self], [enable_dlopen_self], [0], +- [Whether dlopen of programs is supported]) +-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], +- [Whether dlopen of statically linked programs is supported]) +-])# LT_SYS_DLOPEN_SELF +- +-# Old name: +-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) +- +- +-# _LT_COMPILER_C_O([TAGNAME]) +-# --------------------------- +-# Check to see if options -c and -o are simultaneously supported by compiler. +-# This macro does not hard code the compiler like AC_PROG_CC_C_O. +-m4_defun([_LT_COMPILER_C_O], +-[m4_require([_LT_DECL_SED])dnl +-m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_TAG_COMPILER])dnl +-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], +- [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], +- [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&AS_MESSAGE_LOG_FD +- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes +- fi +- fi +- chmod u+w . 2>&AS_MESSAGE_LOG_FD +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +-]) +-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], +- [Does compiler simultaneously support -c and -o options?]) +-])# _LT_COMPILER_C_O +- +- +-# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +-# ---------------------------------- +-# Check to see if we can do hard links to lock some files if needed +-m4_defun([_LT_COMPILER_FILE_LOCKS], +-[m4_require([_LT_ENABLE_LOCK])dnl +-m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-_LT_COMPILER_C_O([$1]) +- +-hard_links="nottested" +-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then +- # do not overwrite the value of need_locks provided by the user +- AC_MSG_CHECKING([if we can lock with hard links]) +- hard_links=yes +- $RM conftest* +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- touch conftest.a +- ln conftest.a conftest.b 2>&5 || hard_links=no +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- AC_MSG_RESULT([$hard_links]) +- if test "$hard_links" = no; then +- AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) +- need_locks=warn +- fi +-else +- need_locks=no +-fi +-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +-])# _LT_COMPILER_FILE_LOCKS +- +- +-# _LT_CHECK_OBJDIR +-# ---------------- +-m4_defun([_LT_CHECK_OBJDIR], +-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +-[rm -f .libs 2>/dev/null +-mkdir .libs 2>/dev/null +-if test -d .libs; then +- lt_cv_objdir=.libs +-else +- # MS-DOS does not allow filenames that begin with a dot. +- lt_cv_objdir=_libs +-fi +-rmdir .libs 2>/dev/null]) +-objdir=$lt_cv_objdir +-_LT_DECL([], [objdir], [0], +- [The name of the directory that contains temporary libtool files])dnl +-m4_pattern_allow([LT_OBJDIR])dnl +-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", +- [Define to the sub-directory in which libtool stores uninstalled libraries.]) +-])# _LT_CHECK_OBJDIR +- +- +-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +-# -------------------------------------- +-# Check hardcoding attributes. +-m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +-[AC_MSG_CHECKING([how to hardcode library paths into programs]) +-_LT_TAGVAR(hardcode_action, $1)= +-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || +- test -n "$_LT_TAGVAR(runpath_var, $1)" || +- test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then +- +- # We can hardcode non-existent directories. +- if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && +- test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then +- # Linking always hardcodes the temporary library directory. +- _LT_TAGVAR(hardcode_action, $1)=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- _LT_TAGVAR(hardcode_action, $1)=immediate +- fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- _LT_TAGVAR(hardcode_action, $1)=unsupported +-fi +-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) +- +-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || +- test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then +- # Fast installation is not supported +- enable_fast_install=no +-elif test "$shlibpath_overrides_runpath" = yes || +- test "$enable_shared" = no; then +- # Fast installation is not necessary +- enable_fast_install=needless +-fi +-_LT_TAGDECL([], [hardcode_action], [0], +- [How to hardcode a shared library path into an executable]) +-])# _LT_LINKER_HARDCODE_LIBPATH +- +- +-# _LT_CMD_STRIPLIB +-# ---------------- +-m4_defun([_LT_CMD_STRIPLIB], +-[m4_require([_LT_DECL_EGREP]) +-striplib= +-old_striplib= +-AC_MSG_CHECKING([whether stripping libraries is possible]) +-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- AC_MSG_RESULT([yes]) +-else +-# FIXME - insert some real tests, host_os isn't really good enough +- case $host_os in +- darwin*) +- if test -n "$STRIP" ; then +- striplib="$STRIP -x" +- old_striplib="$STRIP -S" +- AC_MSG_RESULT([yes]) +- else +- AC_MSG_RESULT([no]) +- fi +- ;; +- *) +- AC_MSG_RESULT([no]) +- ;; +- esac +-fi +-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +-_LT_DECL([], [striplib], [1]) +-])# _LT_CMD_STRIPLIB +- +- +-# _LT_SYS_DYNAMIC_LINKER([TAG]) +-# ----------------------------- +-# PORTME Fill in your ld.so characteristics +-m4_defun([_LT_SYS_DYNAMIC_LINKER], +-[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-m4_require([_LT_DECL_EGREP])dnl +-m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_OBJDUMP])dnl +-m4_require([_LT_DECL_SED])dnl +-AC_MSG_CHECKING([dynamic linker characteristics]) +-m4_if([$1], +- [], [ +-if test "$GCC" = yes; then +- case $host_os in +- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; +- *) lt_awk_arg="/^libraries:/" ;; +- esac +- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` +- if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then +- # if the path contains ";" then we assume it to be the separator +- # otherwise default to the standard path separator (i.e. ":") - it is +- # assumed that no part of a normal pathname contains ";" but that should +- # okay in the real world where ";" in dirpaths is itself problematic. +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` +- else +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi +- # Ok, now we have the path, separated by spaces, we can step through it +- # and add multilib dir if necessary. +- lt_tmp_lt_search_path_spec= +- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` +- for lt_sys_path in $lt_search_path_spec; do +- if test -d "$lt_sys_path/$lt_multi_os_dir"; then +- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" +- else +- test -d "$lt_sys_path" && \ +- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" +- fi +- done +- lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +-BEGIN {RS=" "; FS="/|\n";} { +- lt_foo=""; +- lt_count=0; +- for (lt_i = NF; lt_i > 0; lt_i--) { +- if ($lt_i != "" && $lt_i != ".") { +- if ($lt_i == "..") { +- lt_count++; +- } else { +- if (lt_count == 0) { +- lt_foo="/" $lt_i lt_foo; +- } else { +- lt_count--; +- } +- } +- } +- } +- if (lt_foo != "") { lt_freq[[lt_foo]]++; } +- if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +-}'` +- sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +-else +- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +-fi]) +-library_names_spec= +-libname_spec='lib$name' +-soname_spec= +-shrext_cmds=".so" +-postinstall_cmds= +-postuninstall_cmds= +-finish_cmds= +-finish_eval= +-shlibpath_var= +-shlibpath_overrides_runpath=unknown +-version_type=none +-dynamic_linker="$host_os ld.so" +-sys_lib_dlsearch_path_spec="/lib /usr/lib" +-need_lib_prefix=unknown +-hardcode_into_libs=no +- +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-need_version=unknown +- +-case $host_os in +-aix3*) +- version_type=linux +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' +- shlibpath_var=LIBPATH +- +- # AIX 3 has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- +-aix[[4-9]]*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- hardcode_into_libs=yes +- if test "$host_cpu" = ia64; then +- # AIX 5 supports IA64 +- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- else +- # With GCC up to 2.95.x, collect2 would create an import file +- # for dependence libraries. The import file would start with +- # the line `#! .'. This would cause the generated library to +- # depend on `.', always an invalid library. This was fixed in +- # development snapshots of GCC prior to 3.0. +- case $host_os in +- aix4 | aix4.[[01]] | aix4.[[01]].*) +- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' +- echo ' yes ' +- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then +- : +- else +- can_build_shared=no +- fi +- ;; +- esac +- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct +- # soname into executable. Probably we can add versioning support to +- # collect2, so additional links can be useful in future. +- if test "$aix_use_runtimelinking" = yes; then +- # If using run time linking (on AIX 4.2 or later) use lib.so +- # instead of lib.a to let people know that these are not +- # typical AIX shared libraries. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- else +- # We preserve .a as extension for shared libraries through AIX4.2 +- # and later when we are not doing run time linking. +- library_names_spec='${libname}${release}.a $libname.a' +- soname_spec='${libname}${release}${shared_ext}$major' +- fi +- shlibpath_var=LIBPATH +- fi +- ;; +- +-amigaos*) +- case $host_cpu in +- powerpc) +- # Since July 2007 AmigaOS4 officially supports .so libraries. +- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- ;; +- m68k) +- library_names_spec='$libname.ixlibrary $libname.a' +- # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' +- ;; +- esac +- ;; +- +-beos*) +- library_names_spec='${libname}${shared_ext}' +- dynamic_linker="$host_os ld.so" +- shlibpath_var=LIBRARY_PATH +- ;; +- +-bsdi[[45]]*) +- version_type=linux +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; +- +-cygwin* | mingw* | pw32* | cegcc*) +- version_type=windows +- shrext_cmds=".dll" +- need_version=no +- need_lib_prefix=no +- +- case $GCC,$host_os in +- yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) +- library_names_spec='$libname.dll.a' +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname~ +- chmod a+x \$dldir/$dlname~ +- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then +- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; +- fi' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- +- case $host_os in +- cygwin*) +- # Cygwin DLLs use 'cyg' prefix rather than 'lib' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" +- ;; +- mingw* | cegcc*) +- # MinGW DLLs use traditional 'lib' prefix +- soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` +- if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then +- # It is most probably a Windows format PATH printed by +- # mingw gcc, but we are running on Cygwin. Gcc prints its search +- # path with ; separators, and with drive letters. We can handle the +- # drive letters (cygwin fileutils understands them), so leave them, +- # especially as we might pass files found there to a mingw objdump, +- # which wouldn't understand a cygwinified path. Ahh. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi +- ;; +- pw32*) +- # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +- ;; +- esac +- ;; +- +- *) +- library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- ;; +- +-darwin* | rhapsody*) +- dynamic_linker="$host_os dyld" +- version_type=darwin +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' +- soname_spec='${libname}${release}${major}$shared_ext' +- shlibpath_overrides_runpath=yes +- shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +-m4_if([$1], [],[ +- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) +- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +- ;; +- +-dgux*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-freebsd1*) +- dynamic_linker=no +- ;; +- +-freebsd* | dragonfly*) +- # DragonFly does not have aout. When/if they implement a new +- # versioning mechanism, adjust this. +- if test -x /usr/bin/objformat; then +- objformat=`/usr/bin/objformat` +- else +- case $host_os in +- freebsd[[123]]*) objformat=aout ;; +- *) objformat=elf ;; +- esac +- fi +- version_type=freebsd-$objformat +- case $version_type in +- freebsd-elf*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' +- need_version=yes +- ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case $host_os in +- freebsd2*) +- shlibpath_overrides_runpath=yes +- ;; +- freebsd3.[[01]]* | freebsdelf3.[[01]]*) +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ +- freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- *) # from 4.6 on, and DragonFly +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- esac +- ;; +- +-gnu*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- hardcode_into_libs=yes +- ;; +- +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- case $host_cpu in +- ia64*) +- shrext_cmds='.so' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.so" +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- if test "X$HPUX_IA64_MODE" = X32; then +- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" +- else +- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" +- fi +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- hppa*64*) +- shrext_cmds='.sl' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- *) +- shrext_cmds='.sl' +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555. +- postinstall_cmds='chmod 555 $lib' +- ;; +- +-interix[[3-9]]*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $host_os in +- nonstopux*) version_type=nonstopux ;; +- *) +- if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux +- else +- version_type=irix +- fi ;; +- esac +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +- case $host_os in +- irix5* | nonstopux*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") +- libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") +- libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") +- libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- hardcode_into_libs=yes +- ;; +- +-# No shared lib support for Linux oldld, aout, or coff. +-linux*oldld* | linux*aout* | linux*coff*) +- dynamic_linker=no +- ;; +- +-# This must be Linux ELF. +-linux* | k*bsd*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- # Some binutils ld are patched to set DT_RUNPATH +- save_LDFLAGS=$LDFLAGS +- save_libdir=$libdir +- eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ +- LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" +- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], +- [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], +- [shlibpath_overrides_runpath=yes])]) +- LDFLAGS=$save_LDFLAGS +- libdir=$save_libdir +- +- # This implies no fast_install, which is unacceptable. +- # Some rework will be needed to allow for fast_install +- # before this can be enabled. +- hardcode_into_libs=yes +- +- # Add ABI-specific directories to the system library path. +- sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" +- +- # Append ld.so.conf contents to the search path +- if test -f /etc/ld.so.conf; then +- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" +- fi +- +- # We used to test for /lib/ld.so.1 and disable shared libraries on +- # powerpc, because MkLinux only supported shared libraries with the +- # GNU dynamic linker. Since this was broken with cross compilers, +- # most powerpc-linux boxes support dynamic linking these days and +- # people can always --disable-shared, the test was removed, and we +- # assume the GNU/Linux dynamic linker is in use. +- dynamic_linker='GNU/Linux ld.so' +- ;; +- +-netbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- +-newsos6) +- version_type=linux +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- ;; +- +-*nto* | *qnx*) +- version_type=qnx +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='ldqnx.so' +- ;; +- +-openbsd*) +- version_type=sunos +- sys_lib_dlsearch_path_spec="/usr/lib" +- need_lib_prefix=no +- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. +- case $host_os in +- openbsd3.3 | openbsd3.3.*) need_version=yes ;; +- *) need_version=no ;; +- esac +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case $host_os in +- openbsd2.[[89]] | openbsd2.[[89]].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac +- else +- shlibpath_overrides_runpath=yes +- fi +- ;; +- +-os2*) +- libname_spec='$name' +- shrext_cmds=".dll" +- need_lib_prefix=no +- library_names_spec='$libname${shared_ext} $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; +- +-osf3* | osf4* | osf5*) +- version_type=osf +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; +- +-rdos*) +- dynamic_linker=no +- ;; +- +-solaris*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- # ldd complains unless libraries are executable +- postinstall_cmds='chmod +x $lib' +- ;; +- +-sunos4*) +- version_type=sunos +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- fi +- need_version=yes +- ;; +- +-sysv4 | sysv4.3*) +- version_type=linux +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- case $host_vendor in +- sni) +- shlibpath_overrides_runpath=no +- need_lib_prefix=no +- runpath_var=LD_RUN_PATH +- ;; +- siemens) +- need_lib_prefix=no +- ;; +- motorola) +- need_lib_prefix=no +- need_version=no +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' +- ;; +- esac +- ;; +- +-sysv4*MP*) +- if test -d /usr/nec ;then +- version_type=linux +- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' +- soname_spec='$libname${shared_ext}.$major' +- shlibpath_var=LD_LIBRARY_PATH +- fi +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- version_type=freebsd-elf +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- if test "$with_gnu_ld" = yes; then +- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' +- else +- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' +- case $host_os in +- sco3.2v5*) +- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" +- ;; +- esac +- fi +- sys_lib_dlsearch_path_spec='/usr/lib' +- ;; +- +-tpf*) +- # TPF is a cross-target only. Preferred cross-host = GNU/Linux. +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-uts4*) +- version_type=linux +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-*) +- dynamic_linker=no +- ;; +-esac +-AC_MSG_RESULT([$dynamic_linker]) +-test "$dynamic_linker" = no && can_build_shared=no +- +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- +-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then +- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +-fi +-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then +- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +-fi +- +-_LT_DECL([], [variables_saved_for_relink], [1], +- [Variables whose values should be saved in libtool wrapper scripts and +- restored at link time]) +-_LT_DECL([], [need_lib_prefix], [0], +- [Do we need the "lib" prefix for modules?]) +-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +-_LT_DECL([], [version_type], [0], [Library versioning type]) +-_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +-_LT_DECL([], [shlibpath_overrides_runpath], [0], +- [Is shlibpath searched before the hard-coded library search path?]) +-_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +-_LT_DECL([], [library_names_spec], [1], +- [[List of archive names. First name is the real one, the rest are links. +- The last name is the one that the linker finds with -lNAME]]) +-_LT_DECL([], [soname_spec], [1], +- [[The coded name of the library, if different from the real name]]) +-_LT_DECL([], [postinstall_cmds], [2], +- [Command to use after installation of a shared archive]) +-_LT_DECL([], [postuninstall_cmds], [2], +- [Command to use after uninstallation of a shared archive]) +-_LT_DECL([], [finish_cmds], [2], +- [Commands used to finish a libtool library installation in a directory]) +-_LT_DECL([], [finish_eval], [1], +- [[As "finish_cmds", except a single script fragment to be evaled but +- not shown]]) +-_LT_DECL([], [hardcode_into_libs], [0], +- [Whether we should hardcode library paths into libraries]) +-_LT_DECL([], [sys_lib_search_path_spec], [2], +- [Compile-time system search path for libraries]) +-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], +- [Run-time system search path for libraries]) +-])# _LT_SYS_DYNAMIC_LINKER +- +- +-# _LT_PATH_TOOL_PREFIX(TOOL) +-# -------------------------- +-# find a file program which can recognize shared library +-AC_DEFUN([_LT_PATH_TOOL_PREFIX], +-[m4_require([_LT_DECL_EGREP])dnl +-AC_MSG_CHECKING([for $1]) +-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +-[case $MAGIC_CMD in +-[[\\/*] | ?:[\\/]*]) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +-*) +- lt_save_MAGIC_CMD="$MAGIC_CMD" +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +-dnl $ac_dummy forces splitting on constant user-supplied paths. +-dnl POSIX.2 word splitting is done only on the output of word expansions, +-dnl not every word. This closes a longstanding sh security hole. +- ac_dummy="m4_if([$2], , $PATH, [$2])" +- for ac_dir in $ac_dummy; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$1; then +- lt_cv_path_MAGIC_CMD="$ac_dir/$1" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- $EGREP "$file_magic_regex" > /dev/null; then +- : +- else +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-_LT_EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$lt_save_ifs" +- MAGIC_CMD="$lt_save_MAGIC_CMD" +- ;; +-esac]) +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- AC_MSG_RESULT($MAGIC_CMD) +-else +- AC_MSG_RESULT(no) +-fi +-_LT_DECL([], [MAGIC_CMD], [0], +- [Used to examine libraries when file_magic_cmd begins with "file"])dnl +-])# _LT_PATH_TOOL_PREFIX +- +-# Old name: +-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) +- +- +-# _LT_PATH_MAGIC +-# -------------- +-# find a file program which can recognize a shared library +-m4_defun([_LT_PATH_MAGIC], +-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +-if test -z "$lt_cv_path_MAGIC_CMD"; then +- if test -n "$ac_tool_prefix"; then +- _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) +- else +- MAGIC_CMD=: +- fi +-fi +-])# _LT_PATH_MAGIC +- +- +-# LT_PATH_LD +-# ---------- +-# find the pathname to the GNU or non-GNU linker +-AC_DEFUN([LT_PATH_LD], +-[AC_REQUIRE([AC_PROG_CC])dnl +-AC_REQUIRE([AC_CANONICAL_HOST])dnl +-AC_REQUIRE([AC_CANONICAL_BUILD])dnl +-m4_require([_LT_DECL_SED])dnl +-m4_require([_LT_DECL_EGREP])dnl +- +-AC_ARG_WITH([gnu-ld], +- [AS_HELP_STRING([--with-gnu-ld], +- [assume the C compiler uses GNU ld @<:@default=no@:>@])], +- [test "$withval" = no || with_gnu_ld=yes], +- [with_gnu_ld=no])dnl +- +-ac_prog=ld +-if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- AC_MSG_CHECKING([for ld used by $CC]) +- case $host in +- *-*-mingw*) +- # gcc leaves a trailing carriage return which upsets mingw +- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $ac_prog in +- # Accept absolute paths. +- [[\\/]]* | ?:[[\\/]]*) +- re_direlt='/[[^/]][[^/]]*/\.\./' +- # Canonicalize the pathname of ld +- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` +- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" +- ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +-elif test "$with_gnu_ld" = yes; then +- AC_MSG_CHECKING([for GNU ld]) +-else +- AC_MSG_CHECKING([for non-GNU ld]) +-fi +-AC_CACHE_VAL(lt_cv_path_LD, +-[if test -z "$LD"; then +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- lt_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some variants of GNU ld only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then +- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' +- lt_cv_file_magic_cmd='func_win32_libid' +- else +- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' +- lt_cv_file_magic_cmd='$OBJDUMP -f' +- fi +- ;; +- +-cegcc) +- # use the weaker test based on 'objdump'. See mingw*. +- lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' +- lt_cv_file_magic_cmd='$OBJDUMP -f' +- ;; +- +-darwin* | rhapsody*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-freebsd* | dragonfly*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then +- case $host_cpu in +- i*86 ) +- # Not sure whether the presence of OpenBSD here was a mistake. +- # Let's accept both of them until this is cleared up. +- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` +- ;; +- esac +- else +- lt_cv_deplibs_check_method=pass_all +- fi +- ;; +- +-gnu*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-hpux10.20* | hpux11*) +- lt_cv_file_magic_cmd=/usr/bin/file +- case $host_cpu in +- ia64*) +- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' +- lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so +- ;; +- hppa*64*) +- [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] +- lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl +- ;; +- *) +- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' +- lt_cv_file_magic_test_file=/usr/lib/libc.sl +- ;; +- esac +- ;; +- +-interix[[3-9]]*) +- # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here +- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $LD in +- *-32|*"-32 ") libmagic=32-bit;; +- *-n32|*"-n32 ") libmagic=N32;; +- *-64|*"-64 ") libmagic=64-bit;; +- *) libmagic=never-match;; +- esac +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-# This must be Linux ELF. +-linux* | k*bsd*-gnu) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-netbsd*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then +- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' +- else +- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' +- fi +- ;; +- +-newos6*) +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libnls.so +- ;; +- +-*nto* | *qnx*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-openbsd*) +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' +- else +- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' +- fi +- ;; +- +-osf3* | osf4* | osf5*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-rdos*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-solaris*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-sysv4 | sysv4.3*) +- case $host_vendor in +- motorola) +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` +- ;; +- ncr) +- lt_cv_deplibs_check_method=pass_all +- ;; +- sequent) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' +- ;; +- sni) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" +- lt_cv_file_magic_test_file=/lib/libc.so +- ;; +- siemens) +- lt_cv_deplibs_check_method=pass_all +- ;; +- pc) +- lt_cv_deplibs_check_method=pass_all +- ;; +- esac +- ;; +- +-tpf*) +- lt_cv_deplibs_check_method=pass_all +- ;; +-esac +-]) +-file_magic_cmd=$lt_cv_file_magic_cmd +-deplibs_check_method=$lt_cv_deplibs_check_method +-test -z "$deplibs_check_method" && deplibs_check_method=unknown +- +-_LT_DECL([], [deplibs_check_method], [1], +- [Method to check whether dependent libraries are shared objects]) +-_LT_DECL([], [file_magic_cmd], [1], +- [Command to use when deplibs_check_method == "file_magic"]) +-])# _LT_CHECK_MAGIC_METHOD +- +- +-# LT_PATH_NM +-# ---------- +-# find the pathname to a BSD- or MS-compatible name lister +-AC_DEFUN([LT_PATH_NM], +-[AC_REQUIRE([AC_PROG_CC])dnl +-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +-[if test -n "$NM"; then +- # Let the user override the test. +- lt_cv_path_NM="$NM" +-else +- lt_nm_to_check="${ac_tool_prefix}nm" +- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +- lt_nm_to_check="$lt_nm_to_check nm" +- fi +- for lt_tmp_nm in $lt_nm_to_check; do +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- tmp_nm="$ac_dir/$lt_tmp_nm" +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no} +-fi]) +-if test "$lt_cv_path_NM" != "no"; then +- NM="$lt_cv_path_NM" +-else +- # Didn't find any BSD compatible name lister, look for dumpbin. +- AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) +- AC_SUBST([DUMPBIN]) +- if test "$DUMPBIN" != ":"; then +- NM="$DUMPBIN" +- fi +-fi +-test -z "$NM" && NM=nm +-AC_SUBST([NM]) +-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl +- +-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], +- [lt_cv_nm_interface="BSD nm" +- echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) +- (eval "$ac_compile" 2>conftest.err) +- cat conftest.err >&AS_MESSAGE_LOG_FD +- (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) +- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) +- cat conftest.err >&AS_MESSAGE_LOG_FD +- (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) +- cat conftest.out >&AS_MESSAGE_LOG_FD +- if $GREP 'External.*some_variable' conftest.out > /dev/null; then +- lt_cv_nm_interface="MS dumpbin" +- fi +- rm -f conftest*]) +-])# LT_PATH_NM +- +-# Old names: +-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AM_PROG_NM], []) +-dnl AC_DEFUN([AC_PROG_NM], []) +- +- +-# LT_LIB_M +-# -------- +-# check for math library +-AC_DEFUN([LT_LIB_M], +-[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-LIBM= +-case $host in +-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) +- # These system don't have libm, or don't need it +- ;; +-*-ncr-sysv4.3*) +- AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") +- AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") +- ;; +-*) +- AC_CHECK_LIB(m, cos, LIBM="-lm") +- ;; +-esac +-AC_SUBST([LIBM]) +-])# LT_LIB_M +- +-# Old name: +-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_CHECK_LIBM], []) +- +- +-# _LT_COMPILER_NO_RTTI([TAGNAME]) +-# ------------------------------- +-m4_defun([_LT_COMPILER_NO_RTTI], +-[m4_require([_LT_TAG_COMPILER])dnl +- +-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +- +-if test "$GCC" = yes; then +- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +- +- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], +- lt_cv_prog_compiler_rtti_exceptions, +- [-fno-rtti -fno-exceptions], [], +- [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +-fi +-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], +- [Compiler flag to turn off builtin functions]) +-])# _LT_COMPILER_NO_RTTI +- +- +-# _LT_CMD_GLOBAL_SYMBOLS +-# ---------------------- +-m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +-[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-AC_REQUIRE([AC_PROG_CC])dnl +-AC_REQUIRE([LT_PATH_NM])dnl +-AC_REQUIRE([LT_PATH_LD])dnl +-m4_require([_LT_DECL_SED])dnl +-m4_require([_LT_DECL_EGREP])dnl +-m4_require([_LT_TAG_COMPILER])dnl +- +-# Check for command to grab the raw symbol name followed by C symbol from nm. +-AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +-[ +-# These are sane defaults that work on at least a few old systems. +-# [They come from Ultrix. What could be older than Ultrix?!! ;)] +- +-# Character class describing NM global symbol codes. +-symcode='[[BCDEGRST]]' +- +-# Regexp to match symbols that can be accessed directly from C. +-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' +- +-# Define system-specific variables. +-case $host_os in +-aix*) +- symcode='[[BCDT]]' +- ;; +-cygwin* | mingw* | pw32* | cegcc*) +- symcode='[[ABCDGISTW]]' +- ;; +-hpux*) +- if test "$host_cpu" = ia64; then +- symcode='[[ABCDEGRST]]' +- fi +- ;; +-irix* | nonstopux*) +- symcode='[[BCDEGRST]]' +- ;; +-osf*) +- symcode='[[BCDEGQRST]]' +- ;; +-solaris*) +- symcode='[[BDRT]]' +- ;; +-sco3.2v5*) +- symcode='[[DT]]' +- ;; +-sysv4.2uw2*) +- symcode='[[DT]]' +- ;; +-sysv5* | sco5v6* | unixware* | OpenUNIX*) +- symcode='[[ABDT]]' +- ;; +-sysv4) +- symcode='[[DFNSTU]]' +- ;; +-esac +- +-# If we're using GNU nm, then use its standard symbol codes. +-case `$NM -V 2>&1` in +-*GNU* | *'with BFD'*) +- symcode='[[ABCDGIRSTW]]' ;; +-esac +- +-# Transform an extracted symbol line into a proper C declaration. +-# Some systems (esp. on ia64) link data and code symbols differently, +-# so use this general approach. +-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +- +-# Transform an extracted symbol line into symbol name and symbol address +-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +- +-# Handle CRLF in mingw tool chain +-opt_cr= +-case $build_os in +-mingw*) +- opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp +- ;; +-esac +- +-# Try without a prefix underscore, then with it. +-for ac_symprfx in "" "_"; do +- +- # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. +- symxfrm="\\1 $ac_symprfx\\2 \\2" +- +- # Write the raw and C identifiers. +- if test "$lt_cv_nm_interface" = "MS dumpbin"; then +- # Fake it for dumpbin and say T for any non-static function +- # and D for any global variable. +- # Also find C++ and __fastcall symbols from MSVC++, +- # which start with @ or ?. +- lt_cv_sys_global_symbol_pipe="$AWK ['"\ +-" {last_section=section; section=\$ 3};"\ +-" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +-" \$ 0!~/External *\|/{next};"\ +-" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +-" {if(hide[section]) next};"\ +-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +-" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +-" ' prfx=^$ac_symprfx]" +- else +- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" +- fi +- +- # Check to see that the pipe works correctly. +- pipe_works=no +- +- rm -f conftest* +- cat > conftest.$ac_ext <<_LT_EOF +-#ifdef __cplusplus +-extern "C" { +-#endif +-char nm_test_var; +-void nm_test_func(void); +-void nm_test_func(void){} +-#ifdef __cplusplus +-} +-#endif +-int main(){nm_test_var='a';nm_test_func();return(0);} +-_LT_EOF +- +- if AC_TRY_EVAL(ac_compile); then +- # Now try to grab the symbols. +- nlist=conftest.nm +- if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then +- # Try sorting and uniquifying the output. +- if sort "$nlist" | uniq > "$nlist"T; then +- mv -f "$nlist"T "$nlist" +- else +- rm -f "$nlist"T +- fi +- +- # Make sure that we snagged all the symbols we need. +- if $GREP ' nm_test_var$' "$nlist" >/dev/null; then +- if $GREP ' nm_test_func$' "$nlist" >/dev/null; then +- cat <<_LT_EOF > conftest.$ac_ext +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-_LT_EOF +- # Now generate the symbol file. +- eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' +- +- cat <<_LT_EOF >> conftest.$ac_ext +- +-/* The mapping between symbol names and symbols. */ +-const struct { +- const char *name; +- void *address; +-} +-lt__PROGRAM__LTX_preloaded_symbols[[]] = +-{ +- { "@PROGRAM@", (void *) 0 }, +-_LT_EOF +- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext +- cat <<\_LT_EOF >> conftest.$ac_ext +- {0, (void *) 0} +-}; +- +-/* This works around a problem in FreeBSD linker */ +-#ifdef FREEBSD_WORKAROUND +-static const void *lt_preloaded_setup() { +- return lt__PROGRAM__LTX_preloaded_symbols; +-} +-#endif +- +-#ifdef __cplusplus +-} +-#endif +-_LT_EOF +- # Now try linking the two files. +- mv conftest.$ac_objext conftstm.$ac_objext +- lt_save_LIBS="$LIBS" +- lt_save_CFLAGS="$CFLAGS" +- LIBS="conftstm.$ac_objext" +- CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" +- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then +- pipe_works=yes +- fi +- LIBS="$lt_save_LIBS" +- CFLAGS="$lt_save_CFLAGS" +- else +- echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD +- fi +- else +- echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD +- fi +- else +- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD +- fi +- else +- echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD +- cat conftest.$ac_ext >&5 +- fi +- rm -rf conftest* conftst* +- +- # Do not use the global_symbol_pipe unless it works. +- if test "$pipe_works" = yes; then +- break +- else +- lt_cv_sys_global_symbol_pipe= +- fi +-done +-]) +-if test -z "$lt_cv_sys_global_symbol_pipe"; then +- lt_cv_sys_global_symbol_to_cdecl= +-fi +-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then +- AC_MSG_RESULT(failed) +-else +- AC_MSG_RESULT(ok) +-fi +- +-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], +- [Take the output of nm and produce a listing of raw symbols and C names]) +-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], +- [Transform the output of nm in a proper C declaration]) +-_LT_DECL([global_symbol_to_c_name_address], +- [lt_cv_sys_global_symbol_to_c_name_address], [1], +- [Transform the output of nm in a C name address pair]) +-_LT_DECL([global_symbol_to_c_name_address_lib_prefix], +- [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], +- [Transform the output of nm in a C name address pair when lib prefix is needed]) +-]) # _LT_CMD_GLOBAL_SYMBOLS +- +- +-# _LT_COMPILER_PIC([TAGNAME]) +-# --------------------------- +-m4_defun([_LT_COMPILER_PIC], +-[m4_require([_LT_TAG_COMPILER])dnl +-_LT_TAGVAR(lt_prog_compiler_wl, $1)= +-_LT_TAGVAR(lt_prog_compiler_pic, $1)= +-_LT_TAGVAR(lt_prog_compiler_static, $1)= +- +-AC_MSG_CHECKING([for $compiler option to produce PIC]) +-m4_if([$1], [CXX], [ +- # C++ specific cases for pic, static, wl, etc. +- if test "$GXX" = yes; then +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' +- +- case $host_os in +- aix*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- m68k) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' +- ;; +- esac +- ;; +- +- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- mingw* | cygwin* | os2* | pw32* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- # Although the cygwin gcc ignores -fPIC, still need this for old-style +- # (--disable-auto-import) libraries +- m4_if([$1], [GCJ], [], +- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) +- ;; +- darwin* | rhapsody*) +- # PIC is the default on this platform +- # Common symbols not allowed in MH_DYLIB files +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' +- ;; +- *djgpp*) +- # DJGPP does not support shared libraries at all +- _LT_TAGVAR(lt_prog_compiler_pic, $1)= +- ;; +- interix[[3-9]]*) +- # Interix 3.x gcc -fpic/-fPIC options generate broken code. +- # Instead, we relocate shared libraries at runtime. +- ;; +- sysv4*MP*) +- if test -d /usr/nec; then +- _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic +- fi +- ;; +- hpux*) +- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit +- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag +- # sets the default TLS model and affects inlining. +- case $host_cpu in +- hppa*64*) +- ;; +- *) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- esac +- ;; +- *qnx* | *nto*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' +- ;; +- *) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- esac +- else +- case $host_os in +- aix[[4-9]]*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- else +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' +- fi +- ;; +- chorus*) +- case $cc_basename in +- cxch68*) +- # Green Hills C++ Compiler +- # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" +- ;; +- esac +- ;; +- dgux*) +- case $cc_basename in +- ec++*) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- ;; +- ghcx*) +- # Green Hills C++ Compiler +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' +- ;; +- *) +- ;; +- esac +- ;; +- freebsd* | dragonfly*) +- # FreeBSD uses GNU C++ +- ;; +- hpux9* | hpux10* | hpux11*) +- case $cc_basename in +- CC*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' +- if test "$host_cpu" != ia64; then +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' +- fi +- ;; +- aCC*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' +- case $host_cpu in +- hppa*64*|ia64*) +- # +Z the default +- ;; +- *) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' +- ;; +- esac +- ;; +- *) +- ;; +- esac +- ;; +- interix*) +- # This is c89, which is MS Visual C++ (no shared libs) +- # Anyone wants to do a port? +- ;; +- irix5* | irix6* | nonstopux*) +- case $cc_basename in +- CC*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' +- # CC pic flag -KPIC is the default. +- ;; +- *) +- ;; +- esac +- ;; +- linux* | k*bsd*-gnu) +- case $cc_basename in +- KCC*) +- # KAI C++ Compiler +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- ecpc* ) +- # old Intel C++ for x86_64 which still supported -KPIC. +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' +- ;; +- icpc* ) +- # Intel C++, used to be incompatible with GCC. +- # ICC 10 doesn't accept -KPIC any more. +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' +- ;; +- pgCC* | pgcpp*) +- # Portland Group C++ compiler +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- cxx*) +- # Compaq C++ +- # Make sure the PIC flag is empty. It appears that all Alpha +- # Linux and Compaq Tru64 Unix objects are PIC. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)= +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' +- ;; +- xlc* | xlC*) +- # IBM XL 8.0 on PPC +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' +- ;; +- esac +- ;; +- esac +- ;; +- lynxos*) +- ;; +- m88k*) +- ;; +- mvs*) +- case $cc_basename in +- cxx*) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' +- ;; +- *) +- ;; +- esac +- ;; +- netbsd*) +- ;; +- *qnx* | *nto*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' +- ;; +- osf3* | osf4* | osf5*) +- case $cc_basename in +- KCC*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' +- ;; +- RCC*) +- # Rational C++ 2.4.1 +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' +- ;; +- cxx*) +- # Digital/Compaq C++ +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- # Make sure the PIC flag is empty. It appears that all Alpha +- # Linux and Compaq Tru64 Unix objects are PIC. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)= +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' +- ;; +- *) +- ;; +- esac +- ;; +- psos*) +- ;; +- solaris*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.2, 5.x and Centerline C++ +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' +- ;; +- gcx*) +- # Green Hills C++ Compiler +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' +- ;; +- *) +- ;; +- esac +- ;; +- sunos4*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.x +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- lcc*) +- # Lucid +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' +- ;; +- *) +- ;; +- esac +- ;; +- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) +- case $cc_basename in +- CC*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- esac +- ;; +- tandem*) +- case $cc_basename in +- NCC*) +- # NonStop-UX NCC 3.20 +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- ;; +- *) +- ;; +- esac +- ;; +- vxworks*) +- ;; +- *) +- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no +- ;; +- esac +- fi +-], +-[ +- if test "$GCC" = yes; then +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' +- +- case $host_os in +- aix*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- m68k) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' +- ;; +- esac +- ;; +- +- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- +- mingw* | cygwin* | pw32* | os2* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- # Although the cygwin gcc ignores -fPIC, still need this for old-style +- # (--disable-auto-import) libraries +- m4_if([$1], [GCJ], [], +- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) +- ;; +- +- darwin* | rhapsody*) +- # PIC is the default on this platform +- # Common symbols not allowed in MH_DYLIB files +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' +- ;; +- +- hpux*) +- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit +- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag +- # sets the default TLS model and affects inlining. +- case $host_cpu in +- hppa*64*) +- # +Z the default +- ;; +- *) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- esac +- ;; +- +- interix[[3-9]]*) +- # Interix 3.x gcc -fpic/-fPIC options generate broken code. +- # Instead, we relocate shared libraries at runtime. +- ;; +- +- msdosdjgpp*) +- # Just because we use GCC doesn't mean we suddenly get shared libraries +- # on systems that don't support them. +- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no +- enable_shared=no +- ;; +- +- *nto* | *qnx*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic +- fi +- ;; +- +- *) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- esac +- else +- # PORTME Check for flag to pass linker flags through the system compiler. +- case $host_os in +- aix*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- else +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' +- fi +- ;; +- +- mingw* | cygwin* | pw32* | os2* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- m4_if([$1], [GCJ], [], +- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) +- ;; +- +- hpux9* | hpux10* | hpux11*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but +- # not for PA HP-UX. +- case $host_cpu in +- hppa*64*|ia64*) +- # +Z the default +- ;; +- *) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' +- ;; +- esac +- # Is there a better lt_prog_compiler_static that works with the bundled CC? +- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' +- ;; +- +- irix5* | irix6* | nonstopux*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- # PIC (with -KPIC) is the default. +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' +- ;; +- +- linux* | k*bsd*-gnu) +- case $cc_basename in +- # old Intel for x86_64 which still supported -KPIC. +- ecc*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' +- ;; +- # icc used to be incompatible with GCC. +- # ICC 10 doesn't accept -KPIC any more. +- icc* | ifort*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' +- ;; +- # Lahey Fortran 8.1. +- lf95*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' +- ;; +- pgcc* | pgf77* | pgf90* | pgf95*) +- # Portland Group compilers (*not* the Pentium gcc compiler, +- # which looks to be a dead project) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- ccc*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- # All Alpha code is PIC. +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' +- ;; +- xl*) +- # IBM XL C 8.0/Fortran 10.1 on PPC +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C 5.9 +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- ;; +- *Sun\ F*) +- # Sun Fortran 8.3 passes all unrecognized flags to the linker +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='' +- ;; +- esac +- ;; +- esac +- ;; +- +- newsos6) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- +- *nto* | *qnx*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' +- ;; +- +- osf3* | osf4* | osf5*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- # All OSF/1 code is PIC. +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' +- ;; +- +- rdos*) +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' +- ;; +- +- solaris*) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- case $cc_basename in +- f77* | f90* | f95*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; +- *) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; +- esac +- ;; +- +- sunos4*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- +- sysv4 | sysv4.2uw2* | sysv4.3*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec ;then +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- fi +- ;; +- +- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- +- unicos*) +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no +- ;; +- +- uts4*) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' +- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- ;; +- +- *) +- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no +- ;; +- esac +- fi +-]) +-case $host_os in +- # For platforms which do not support PIC, -DPIC is meaningless: +- *djgpp*) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)= +- ;; +- *) +- _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" +- ;; +-esac +-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], +- [How to pass a linker flag through the compiler]) +- +-# +-# Check to make sure the PIC flag actually works. +-# +-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then +- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], +- [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], +- [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], +- [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in +- "" | " "*) ;; +- *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; +- esac], +- [_LT_TAGVAR(lt_prog_compiler_pic, $1)= +- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +-fi +-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], +- [Additional compiler flags for building library objects]) +- +-# +-# Check to make sure the static flag actually works. +-# +-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], +- _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), +- $lt_tmp_static_flag, +- [], +- [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], +- [Compiler flag to prevent dynamic linking]) +-])# _LT_COMPILER_PIC +- +- +-# _LT_LINKER_SHLIBS([TAGNAME]) +-# ---------------------------- +-# See if the linker supports building shared libraries. +-m4_defun([_LT_LINKER_SHLIBS], +-[AC_REQUIRE([LT_PATH_LD])dnl +-AC_REQUIRE([LT_PATH_NM])dnl +-m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_EGREP])dnl +-m4_require([_LT_DECL_SED])dnl +-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +-m4_require([_LT_TAG_COMPILER])dnl +-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +-m4_if([$1], [CXX], [ +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- case $host_os in +- aix[[4-9]]*) +- # If we're using GNU nm, then we don't want the "-C" option. +- # -C means demangle to AIX nm, but means don't demangle with GNU nm +- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- else +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- fi +- ;; +- pw32*) +- _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" +- ;; +- cygwin* | mingw* | cegcc*) +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' +- ;; +- *) +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- ;; +- esac +- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +-], [ +- runpath_var= +- _LT_TAGVAR(allow_undefined_flag, $1)= +- _LT_TAGVAR(always_export_symbols, $1)=no +- _LT_TAGVAR(archive_cmds, $1)= +- _LT_TAGVAR(archive_expsym_cmds, $1)= +- _LT_TAGVAR(compiler_needs_object, $1)=no +- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no +- _LT_TAGVAR(export_dynamic_flag_spec, $1)= +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- _LT_TAGVAR(hardcode_automatic, $1)=no +- _LT_TAGVAR(hardcode_direct, $1)=no +- _LT_TAGVAR(hardcode_direct_absolute, $1)=no +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +- _LT_TAGVAR(hardcode_libdir_separator, $1)= +- _LT_TAGVAR(hardcode_minus_L, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +- _LT_TAGVAR(inherit_rpath, $1)=no +- _LT_TAGVAR(link_all_deplibs, $1)=unknown +- _LT_TAGVAR(module_cmds, $1)= +- _LT_TAGVAR(module_expsym_cmds, $1)= +- _LT_TAGVAR(old_archive_from_new_cmds, $1)= +- _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= +- _LT_TAGVAR(thread_safe_flag_spec, $1)= +- _LT_TAGVAR(whole_archive_flag_spec, $1)= +- # include_expsyms should be a list of space-separated symbols to be *always* +- # included in the symbol list +- _LT_TAGVAR(include_expsyms, $1)= +- # exclude_expsyms can be an extended regexp of symbols to exclude +- # it will be wrapped by ` (' and `)$', so one must not match beginning or +- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +- # as well as any symbol that contains `d'. +- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +- # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +- # platforms (ab)use it in PIC code, but their linkers get confused if +- # the symbol is explicitly referenced. Since portable code cannot +- # rely on this symbol name, it's probably fine to never include it in +- # preloaded symbol tables. +- # Exclude shared library initialization/finalization symbols. +-dnl Note also adjust exclude_expsyms for C++ above. +- extract_expsyms_cmds= +- +- case $host_os in +- cygwin* | mingw* | pw32* | cegcc*) +- # FIXME: the MSVC++ port hasn't been tested in a loooong time +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- if test "$GCC" != yes; then +- with_gnu_ld=no +- fi +- ;; +- interix*) +- # we just hope/assume this is gcc and not c89 (= MSVC++) +- with_gnu_ld=yes +- ;; +- openbsd*) +- with_gnu_ld=no +- ;; +- esac +- +- _LT_TAGVAR(ld_shlibs, $1)=yes +- if test "$with_gnu_ld" = yes; then +- # If archive_cmds runs LD, not CC, wlarc should be empty +- wlarc='${wl}' +- +- # Set some defaults for GNU ld with shared library support. These +- # are reset later if shared libraries are not supported. Putting them +- # here allows them to be overridden if necessary. +- runpath_var=LD_RUN_PATH +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then +- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- _LT_TAGVAR(whole_archive_flag_spec, $1)= +- fi +- supports_anon_versioning=no +- case `$LD -v 2>&1` in +- *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 +- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... +- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... +- *\ 2.11.*) ;; # other 2.11 versions +- *) supports_anon_versioning=yes ;; +- esac +- +- # See if GNU ld supports shared libraries. +- case $host_os in +- aix[[3-9]]*) +- # On AIX/PPC, the GNU linker is very broken +- if test "$host_cpu" != ia64; then +- _LT_TAGVAR(ld_shlibs, $1)=no +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the GNU linker, at least up to release 2.9.1, is reported +-*** to be unable to reliably create shared libraries on AIX. +-*** Therefore, libtool is disabling shared libraries support. If you +-*** really care for shared libraries, you may want to modify your PATH +-*** so that a non-GNU linker is found, and then restart. +- +-_LT_EOF +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='' +- ;; +- m68k) +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- ;; +- esac +- ;; +- +- beos*) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, +- # as there is no search path for DLLs. +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- _LT_TAGVAR(always_export_symbols, $1)=no +- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' +- +- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is; otherwise, prepend... +- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname.def; +- else +- echo EXPORTS > $output_objdir/$soname.def; +- cat $export_symbols >> $output_objdir/$soname.def; +- fi~ +- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- +- interix[[3-9]]*) +- _LT_TAGVAR(hardcode_direct, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. +- # Instead, shared libraries are loaded at an image base (0x10000000 by +- # default) and relocated if they conflict, which is a slow very memory +- # consuming and fragmenting process. To avoid this, we pick a random, +- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link +- # time. Moving up from 0x10000000 also allows more sbrk(2) space. +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- ;; +- +- gnu* | linux* | tpf* | k*bsd*-gnu) +- tmp_diet=no +- if test "$host_os" = linux-dietlibc; then +- case $cc_basename in +- diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) +- esac +- fi +- if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ +- && test "$tmp_diet" = no +- then +- tmp_addflag= +- tmp_sharedflag='-shared' +- case $cc_basename,$host_cpu in +- pgcc*) # Portland Group C compiler +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' +- tmp_addflag=' $pic_flag' +- ;; +- pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' +- tmp_addflag=' $pic_flag -Mnomain' ;; +- ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 +- tmp_addflag=' -i_dynamic' ;; +- efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 +- tmp_addflag=' -i_dynamic -nofor_main' ;; +- ifc* | ifort*) # Intel Fortran compiler +- tmp_addflag=' -nofor_main' ;; +- lf95*) # Lahey Fortran 8.1 +- _LT_TAGVAR(whole_archive_flag_spec, $1)= +- tmp_sharedflag='--shared' ;; +- xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) +- tmp_sharedflag='-qmkshrobj' +- tmp_addflag= ;; +- esac +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) # Sun C 5.9 +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' +- _LT_TAGVAR(compiler_needs_object, $1)=yes +- tmp_sharedflag='-G' ;; +- *Sun\ F*) # Sun Fortran 8.3 +- tmp_sharedflag='-G' ;; +- esac +- _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- +- if test "x$supports_anon_versioning" = xyes; then +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- fi +- +- case $cc_basename in +- xlf*) +- # IBM XL Fortran 10.1 on PPC cannot create shared libs itself +- _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' +- _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' +- if test "x$supports_anon_versioning" = xyes; then +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' +- fi +- ;; +- esac +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' +- wlarc= +- else +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- fi +- ;; +- +- solaris*) +- if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then +- _LT_TAGVAR(ld_shlibs, $1)=no +- cat <<_LT_EOF 1>&2 +- +-*** Warning: The releases 2.8.* of the GNU linker cannot reliably +-*** create shared libraries on Solaris systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.9.1 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. +- +-_LT_EOF +- elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- +- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) +- case `$LD -v 2>&1` in +- *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) +- _LT_TAGVAR(ld_shlibs, $1)=no +- cat <<_LT_EOF 1>&2 +- +-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +-*** reliably create shared libraries on SCO systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. +- +-_LT_EOF +- ;; +- *) +- # For security reasons, it is highly recommended that you always +- # use absolute paths for naming shared libraries, and exclude the +- # DT_RUNPATH tag from executables and libraries. But doing so +- # requires that you compile everything twice, which is a pain. +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- esac +- ;; +- +- sunos4*) +- _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- wlarc= +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- *) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- esac +- +- if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then +- runpath_var= +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +- _LT_TAGVAR(export_dynamic_flag_spec, $1)= +- _LT_TAGVAR(whole_archive_flag_spec, $1)= +- fi +- else +- # PORTME fill in a description of your system's linker (not GNU ld) +- case $host_os in +- aix3*) +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- _LT_TAGVAR(always_export_symbols, $1)=yes +- _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' +- # Note: this linker hardcodes the directories in LIBPATH if there +- # are no directories specified by -L. +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then +- # Neither direct hardcoding nor static linking is supported with a +- # broken collect2. +- _LT_TAGVAR(hardcode_direct, $1)=unsupported +- fi +- ;; +- +- aix[[4-9]]*) +- if test "$host_cpu" = ia64; then +- # On IA64, the linker does run time linking by default, so we don't +- # have to do anything special. +- aix_use_runtimelinking=no +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- else +- # If we're using GNU nm, then we don't want the "-C" option. +- # -C means demangle to AIX nm, but means don't demangle with GNU nm +- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- else +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- fi +- aix_use_runtimelinking=no +- +- # Test if we are trying to use run time linking or normal +- # AIX style linking. If -brtl is somewhere in LDFLAGS, we +- # need to do runtime linking. +- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) +- for ld_flag in $LDFLAGS; do +- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then +- aix_use_runtimelinking=yes +- break +- fi +- done +- ;; +- esac +- +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' +- fi +- +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. +- +- _LT_TAGVAR(archive_cmds, $1)='' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes +- _LT_TAGVAR(hardcode_libdir_separator, $1)=':' +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' +- +- if test "$GCC" = yes; then +- case $host_os in aix4.[[012]]|aix4.[[012]].*) +- # We only want to do this on AIX 4.2 and lower, the check +- # below for broken collect2 doesn't work under 4.3+ +- collect2name=`${CC} -print-prog-name=collect2` +- if test -f "$collect2name" && +- strings "$collect2name" | $GREP resolve_lib_name >/dev/null +- then +- # We have reworked collect2 +- : +- else +- # We have old collect2 +- _LT_TAGVAR(hardcode_direct, $1)=unsupported +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)= +- fi +- ;; +- esac +- shared_flag='-shared' +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag="$shared_flag "'${wl}-G' +- fi +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release +- # chokes on -Wl,-G. The following line is correct: +- shared_flag='-G' +- else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' +- else +- shared_flag='${wl}-bM:SRE' +- fi +- fi +- fi +- +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' +- # It seems that -bexpall does not export symbols beginning with +- # underscore (_), so it is better to generate a list of symbols to export. +- _LT_TAGVAR(always_export_symbols, $1)=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- _LT_TAGVAR(allow_undefined_flag, $1)='-berok' +- # Determine the default libpath from the value encoded in an +- # empty executable. +- _LT_SYS_MODULE_PATH_AIX +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' +- _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" +- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" +- else +- # Determine the default libpath from the value encoded in an +- # empty executable. +- _LT_SYS_MODULE_PATH_AIX +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" +- # Warning - without using the other run time loading flags, +- # -berok will link without error, but may produce a broken library. +- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' +- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' +- # Exported symbols can be pulled into shared objects from archives +- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' +- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes +- # This is similar to how AIX traditionally builds its shared libraries. +- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' +- fi +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='' +- ;; +- m68k) +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- ;; +- esac +- ;; +- +- bsdi[[45]]*) +- _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' +- # FIXME: Should let the user specify the lib program. +- _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' +- _LT_TAGVAR(fix_srcfile_path, $1)='' +- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes +- ;; +- +- darwin* | rhapsody*) +- _LT_DARWIN_LINKER_FEATURES($1) +- ;; +- +- dgux*) +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- freebsd1*) +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- +- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor +- # support. Future versions do this automatically, but an explicit c++rt0.o +- # does not break anything, and helps significantly (at the cost of a little +- # extra space). +- freebsd2.2*) +- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2*) +- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd* | dragonfly*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- hpux9*) +- if test "$GCC" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- else +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- fi +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- _LT_TAGVAR(hardcode_direct, $1)=yes +- +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- ;; +- +- hpux10*) +- if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +- else +- _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +- fi +- if test "$with_gnu_ld" = no; then +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- fi +- ;; +- +- hpux11*) +- if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- case $host_cpu in +- hppa*64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- ia64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- else +- case $host_cpu in +- hppa*64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- ia64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- fi +- if test "$with_gnu_ld" = no; then +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- +- case $host_cpu in +- hppa*64*|ia64*) +- _LT_TAGVAR(hardcode_direct, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- *) +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- ;; +- esac +- fi +- ;; +- +- irix5* | irix6* | nonstopux*) +- if test "$GCC" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- # Try to use the -exported_symbol ld option, if it does not +- # work, assume that -exports_file does not work either and +- # implicitly export all symbols. +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" +- AC_LINK_IFELSE(int foo(void) {}, +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' +- ) +- LDFLAGS="$save_LDFLAGS" +- else +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' +- fi +- _LT_TAGVAR(archive_cmds_need_lc, $1)='no' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- _LT_TAGVAR(inherit_rpath, $1)=yes +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out +- else +- _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF +- fi +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- newsos6) +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- *nto* | *qnx*) +- ;; +- +- openbsd*) +- if test -f /usr/libexec/ld.so; then +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- else +- case $host_os in +- openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) +- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- ;; +- esac +- fi +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- +- os2*) +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' +- _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' +- ;; +- +- osf3*) +- if test "$GCC" = yes; then +- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- fi +- _LT_TAGVAR(archive_cmds_need_lc, $1)='no' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- ;; +- +- osf4* | osf5*) # as osf3* with the addition of -msym flag +- if test "$GCC" = yes; then +- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- else +- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ +- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' +- +- # Both c and cxx compiler support -rpath directly +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' +- fi +- _LT_TAGVAR(archive_cmds_need_lc, $1)='no' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- ;; +- +- solaris*) +- _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' +- if test "$GCC" = yes; then +- wlarc='${wl}' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' +- else +- case `$CC -V 2>&1` in +- *"Compilers 5.0"*) +- wlarc='' +- _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' +- ;; +- *) +- wlarc='${wl}' +- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' +- ;; +- esac +- fi +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- case $host_os in +- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; +- *) +- # The compiler driver will combine and reorder linker options, +- # but understands `-z linker_flag'. GCC discards it without `$wl', +- # but is careful enough not to reorder. +- # Supported since Solaris 2.6 (maybe 2.5.1?) +- if test "$GCC" = yes; then +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' +- else +- _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' +- fi +- ;; +- esac +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- ;; +- +- sunos4*) +- if test "x$host_vendor" = xsequent; then +- # Use $CC to link under sequent, because it throws in some extra .o +- # files that make .init and .fini sections work. +- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' +- fi +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- sysv4) +- case $host_vendor in +- sni) +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? +- ;; +- siemens) +- ## LD is ld it makes a PLAMLIB +- ## CC just makes a GrossModule. +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' +- _LT_TAGVAR(hardcode_direct, $1)=no +- ;; +- motorola) +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie +- ;; +- esac +- runpath_var='LD_RUN_PATH' +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- sysv4.3*) +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- _LT_TAGVAR(ld_shlibs, $1)=yes +- fi +- ;; +- +- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) +- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- runpath_var='LD_RUN_PATH' +- +- if test "$GCC" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- ;; +- +- sysv5* | sco3.2v5* | sco5v6*) +- # Note: We can NOT use -z defs as we might desire, because we do not +- # link with -lc, and that would cause any symbols used from libc to +- # always be unresolved, which means just about no library would +- # ever link correctly. If we're not using GNU ld we use -z text +- # though, which does catch some bad symbols but isn't as heavy-handed +- # as -z defs. +- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' +- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=':' +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' +- runpath_var='LD_RUN_PATH' +- +- if test "$GCC" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- ;; +- +- uts4*) +- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- +- *) +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- +- if test x$host_vendor = xsni; then +- case $host in +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' +- ;; +- esac +- fi +- fi +-]) +-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no +- +-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld +- +-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +-_LT_DECL([], [extract_expsyms_cmds], [2], +- [The commands to extract the exported symbol list from a shared archive]) +- +-# +-# Do we need to explicitly link libc? +-# +-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +-x|xyes) +- # Assume -lc should be added +- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes +- +- if test "$enable_shared" = yes && test "$GCC" = yes; then +- case $_LT_TAGVAR(archive_cmds, $1) in +- *'~'*) +- # FIXME: we may have to deal with multi-command sequences. +- ;; +- '$CC '*) +- # Test whether the compiler implicitly links with -lc since on some +- # systems, -lgcc has to come before -lc. If gcc already passes -lc +- # to ld, don't add -lc before -lgcc. +- AC_MSG_CHECKING([whether -lc should be explicitly linked in]) +- $RM conftest* +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- if AC_TRY_EVAL(ac_compile) 2>conftest.err; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) +- pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) +- _LT_TAGVAR(allow_undefined_flag, $1)= +- if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) +- then +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- else +- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes +- fi +- _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +- $RM conftest* +- AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) +- ;; +- esac +- fi +- ;; +-esac +- +-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], +- [Whether or not to add -lc for building shared libraries]) +-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], +- [enable_shared_with_static_runtimes], [0], +- [Whether or not to disallow shared libs when runtime libs are static]) +-_LT_TAGDECL([], [export_dynamic_flag_spec], [1], +- [Compiler flag to allow reflexive dlopens]) +-_LT_TAGDECL([], [whole_archive_flag_spec], [1], +- [Compiler flag to generate shared objects directly from archives]) +-_LT_TAGDECL([], [compiler_needs_object], [1], +- [Whether the compiler copes with passing no objects directly]) +-_LT_TAGDECL([], [old_archive_from_new_cmds], [2], +- [Create an old-style archive from a shared archive]) +-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], +- [Create a temporary old-style archive to link instead of a shared archive]) +-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +-_LT_TAGDECL([], [archive_expsym_cmds], [2]) +-_LT_TAGDECL([], [module_cmds], [2], +- [Commands used to build a loadable module if different from building +- a shared archive.]) +-_LT_TAGDECL([], [module_expsym_cmds], [2]) +-_LT_TAGDECL([], [with_gnu_ld], [1], +- [Whether we are building with GNU ld or not]) +-_LT_TAGDECL([], [allow_undefined_flag], [1], +- [Flag that allows shared libraries with undefined symbols to be built]) +-_LT_TAGDECL([], [no_undefined_flag], [1], +- [Flag that enforces no undefined symbols]) +-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], +- [Flag to hardcode $libdir into a binary during linking. +- This must work even if $libdir does not exist]) +-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], +- [[If ld is used when linking, flag to hardcode $libdir into a binary +- during linking. This must work even if $libdir does not exist]]) +-_LT_TAGDECL([], [hardcode_libdir_separator], [1], +- [Whether we need a single "-rpath" flag with a separated argument]) +-_LT_TAGDECL([], [hardcode_direct], [0], +- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +- DIR into the resulting binary]) +-_LT_TAGDECL([], [hardcode_direct_absolute], [0], +- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +- DIR into the resulting binary and the resulting library dependency is +- "absolute", i.e impossible to change by setting ${shlibpath_var} if the +- library is relocated]) +-_LT_TAGDECL([], [hardcode_minus_L], [0], +- [Set to "yes" if using the -LDIR flag during linking hardcodes DIR +- into the resulting binary]) +-_LT_TAGDECL([], [hardcode_shlibpath_var], [0], +- [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +- into the resulting binary]) +-_LT_TAGDECL([], [hardcode_automatic], [0], +- [Set to "yes" if building a shared library automatically hardcodes DIR +- into the library and all subsequent libraries and executables linked +- against it]) +-_LT_TAGDECL([], [inherit_rpath], [0], +- [Set to yes if linker adds runtime paths of dependent libraries +- to runtime path list]) +-_LT_TAGDECL([], [link_all_deplibs], [0], +- [Whether libtool must link a program against all its dependency libraries]) +-_LT_TAGDECL([], [fix_srcfile_path], [1], +- [Fix the shell variable $srcfile for the compiler]) +-_LT_TAGDECL([], [always_export_symbols], [0], +- [Set to "yes" if exported symbols are required]) +-_LT_TAGDECL([], [export_symbols_cmds], [2], +- [The commands to list exported symbols]) +-_LT_TAGDECL([], [exclude_expsyms], [1], +- [Symbols that should not be listed in the preloaded symbols]) +-_LT_TAGDECL([], [include_expsyms], [1], +- [Symbols that must always be exported]) +-_LT_TAGDECL([], [prelink_cmds], [2], +- [Commands necessary for linking programs (against libraries) with templates]) +-_LT_TAGDECL([], [file_list_spec], [1], +- [Specify filename containing input files]) +-dnl FIXME: Not yet implemented +-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +-dnl [Compiler flag to generate thread safe objects]) +-])# _LT_LINKER_SHLIBS +- +- +-# _LT_LANG_C_CONFIG([TAG]) +-# ------------------------ +-# Ensure that the configuration variables for a C compiler are suitably +-# defined. These variables are subsequently used by _LT_CONFIG to write +-# the compiler configuration to `libtool'. +-m4_defun([_LT_LANG_C_CONFIG], +-[m4_require([_LT_DECL_EGREP])dnl +-lt_save_CC="$CC" +-AC_LANG_PUSH(C) +- +-# Source file extension for C test sources. +-ac_ext=c +- +-# Object file extension for compiled C test sources. +-objext=o +-_LT_TAGVAR(objext, $1)=$objext +- +-# Code to be used in simple compile tests +-lt_simple_compile_test_code="int some_variable = 0;" +- +-# Code to be used in simple link tests +-lt_simple_link_test_code='int main(){return(0);}' +- +-_LT_TAG_COMPILER +-# Save the default compiler, since it gets overwritten when the other +-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +-compiler_DEFAULT=$CC +- +-# save warnings/boilerplate of simple test code +-_LT_COMPILER_BOILERPLATE +-_LT_LINKER_BOILERPLATE +- +-if test -n "$compiler"; then +- _LT_COMPILER_NO_RTTI($1) +- _LT_COMPILER_PIC($1) +- _LT_COMPILER_C_O($1) +- _LT_COMPILER_FILE_LOCKS($1) +- _LT_LINKER_SHLIBS($1) +- _LT_SYS_DYNAMIC_LINKER($1) +- _LT_LINKER_HARDCODE_LIBPATH($1) +- LT_SYS_DLOPEN_SELF +- _LT_CMD_STRIPLIB +- +- # Report which library types will actually be built +- AC_MSG_CHECKING([if libtool supports shared libraries]) +- AC_MSG_RESULT([$can_build_shared]) +- +- AC_MSG_CHECKING([whether to build shared libraries]) +- test "$can_build_shared" = "no" && enable_shared=no +- +- # On AIX, shared libraries and static libraries use the same namespace, and +- # are all built from PIC. +- case $host_os in +- aix3*) +- test "$enable_shared" = yes && enable_static=no +- if test -n "$RANLIB"; then +- archive_cmds="$archive_cmds~\$RANLIB \$lib" +- postinstall_cmds='$RANLIB $lib' +- fi +- ;; +- +- aix[[4-9]]*) +- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then +- test "$enable_shared" = yes && enable_static=no +- fi +- ;; +- esac +- AC_MSG_RESULT([$enable_shared]) +- +- AC_MSG_CHECKING([whether to build static libraries]) +- # Make sure either enable_shared or enable_static is yes. +- test "$enable_shared" = yes || enable_static=yes +- AC_MSG_RESULT([$enable_static]) +- +- _LT_CONFIG($1) +-fi +-AC_LANG_POP +-CC="$lt_save_CC" +-])# _LT_LANG_C_CONFIG +- +- +-# _LT_PROG_CXX +-# ------------ +-# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +-# compiler, we have our own version here. +-m4_defun([_LT_PROG_CXX], +-[ +-pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +-AC_PROG_CXX +-if test -n "$CXX" && ( test "X$CXX" != "Xno" && +- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || +- (test "X$CXX" != "Xg++"))) ; then +- AC_PROG_CXXCPP +-else +- _lt_caught_CXX_error=yes +-fi +-popdef([AC_MSG_ERROR]) +-])# _LT_PROG_CXX +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([_LT_PROG_CXX], []) +- +- +-# _LT_LANG_CXX_CONFIG([TAG]) +-# -------------------------- +-# Ensure that the configuration variables for a C++ compiler are suitably +-# defined. These variables are subsequently used by _LT_CONFIG to write +-# the compiler configuration to `libtool'. +-m4_defun([_LT_LANG_CXX_CONFIG], +-[AC_REQUIRE([_LT_PROG_CXX])dnl +-m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_EGREP])dnl +- +-AC_LANG_PUSH(C++) +-_LT_TAGVAR(archive_cmds_need_lc, $1)=no +-_LT_TAGVAR(allow_undefined_flag, $1)= +-_LT_TAGVAR(always_export_symbols, $1)=no +-_LT_TAGVAR(archive_expsym_cmds, $1)= +-_LT_TAGVAR(compiler_needs_object, $1)=no +-_LT_TAGVAR(export_dynamic_flag_spec, $1)= +-_LT_TAGVAR(hardcode_direct, $1)=no +-_LT_TAGVAR(hardcode_direct_absolute, $1)=no +-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +-_LT_TAGVAR(hardcode_libdir_separator, $1)= +-_LT_TAGVAR(hardcode_minus_L, $1)=no +-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +-_LT_TAGVAR(hardcode_automatic, $1)=no +-_LT_TAGVAR(inherit_rpath, $1)=no +-_LT_TAGVAR(module_cmds, $1)= +-_LT_TAGVAR(module_expsym_cmds, $1)= +-_LT_TAGVAR(link_all_deplibs, $1)=unknown +-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +-_LT_TAGVAR(no_undefined_flag, $1)= +-_LT_TAGVAR(whole_archive_flag_spec, $1)= +-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no +- +-# Source file extension for C++ test sources. +-ac_ext=cpp +- +-# Object file extension for compiled C++ test sources. +-objext=o +-_LT_TAGVAR(objext, $1)=$objext +- +-# No sense in running all these tests if we already determined that +-# the CXX compiler isn't working. Some variables (like enable_shared) +-# are currently assumed to apply to all compilers on this platform, +-# and will be corrupted by setting them based on a non-working compiler. +-if test "$_lt_caught_CXX_error" != yes; then +- # Code to be used in simple compile tests +- lt_simple_compile_test_code="int some_variable = 0;" +- +- # Code to be used in simple link tests +- lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' +- +- # ltmain only uses $CC for tagged configurations so make sure $CC is set. +- _LT_TAG_COMPILER +- +- # save warnings/boilerplate of simple test code +- _LT_COMPILER_BOILERPLATE +- _LT_LINKER_BOILERPLATE +- +- # Allow CC to be a program name with arguments. +- lt_save_CC=$CC +- lt_save_LD=$LD +- lt_save_GCC=$GCC +- GCC=$GXX +- lt_save_with_gnu_ld=$with_gnu_ld +- lt_save_path_LD=$lt_cv_path_LD +- if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then +- lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +- else +- $as_unset lt_cv_prog_gnu_ld +- fi +- if test -n "${lt_cv_path_LDCXX+set}"; then +- lt_cv_path_LD=$lt_cv_path_LDCXX +- else +- $as_unset lt_cv_path_LD +- fi +- test -z "${LDCXX+set}" || LD=$LDCXX +- CC=${CXX-"c++"} +- compiler=$CC +- _LT_TAGVAR(compiler, $1)=$CC +- _LT_CC_BASENAME([$compiler]) +- +- if test -n "$compiler"; then +- # We don't want -fno-exception when compiling C++ code, so set the +- # no_builtin_flag separately +- if test "$GXX" = yes; then +- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +- else +- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +- fi +- +- if test "$GXX" = yes; then +- # Set up default GNU C++ configuration +- +- LT_PATH_LD +- +- # Check if GNU C++ uses GNU ld as the underlying linker, since the +- # archiving commands below assume that GNU ld is being used. +- if test "$with_gnu_ld" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- +- # If archive_cmds runs LD, not CC, wlarc should be empty +- # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to +- # investigate it a little bit more. (MM) +- wlarc='${wl}' +- +- # ancient GNU ld didn't support --whole-archive et. al. +- if eval "`$CC -print-prog-name=ld` --help 2>&1" | +- $GREP 'no-whole-archive' > /dev/null; then +- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- _LT_TAGVAR(whole_archive_flag_spec, $1)= +- fi +- else +- with_gnu_ld=no +- wlarc= +- +- # A generic and very simple default shared library creation +- # command for GNU C++ for the case where it uses the native +- # linker, instead of GNU ld. If possible, this setting should +- # overridden to take advantage of the native linker features on +- # the platform it is being used on. +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' +- fi +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' +- +- else +- GXX=no +- with_gnu_ld=no +- wlarc= +- fi +- +- # PORTME: fill in a description of your system's C++ link characteristics +- AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +- _LT_TAGVAR(ld_shlibs, $1)=yes +- case $host_os in +- aix3*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- aix[[4-9]]*) +- if test "$host_cpu" = ia64; then +- # On IA64, the linker does run time linking by default, so we don't +- # have to do anything special. +- aix_use_runtimelinking=no +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- else +- aix_use_runtimelinking=no +- +- # Test if we are trying to use run time linking or normal +- # AIX style linking. If -brtl is somewhere in LDFLAGS, we +- # need to do runtime linking. +- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) +- for ld_flag in $LDFLAGS; do +- case $ld_flag in +- *-brtl*) +- aix_use_runtimelinking=yes +- break +- ;; +- esac +- done +- ;; +- esac +- +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' +- fi +- +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. +- +- _LT_TAGVAR(archive_cmds, $1)='' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes +- _LT_TAGVAR(hardcode_libdir_separator, $1)=':' +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' +- +- if test "$GXX" = yes; then +- case $host_os in aix4.[[012]]|aix4.[[012]].*) +- # We only want to do this on AIX 4.2 and lower, the check +- # below for broken collect2 doesn't work under 4.3+ +- collect2name=`${CC} -print-prog-name=collect2` +- if test -f "$collect2name" && +- strings "$collect2name" | $GREP resolve_lib_name >/dev/null +- then +- # We have reworked collect2 +- : +- else +- # We have old collect2 +- _LT_TAGVAR(hardcode_direct, $1)=unsupported +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- _LT_TAGVAR(hardcode_minus_L, $1)=yes +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)= +- fi +- esac +- shared_flag='-shared' +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag="$shared_flag "'${wl}-G' +- fi +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release +- # chokes on -Wl,-G. The following line is correct: +- shared_flag='-G' +- else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' +- else +- shared_flag='${wl}-bM:SRE' +- fi +- fi +- fi +- +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' +- # It seems that -bexpall does not export symbols beginning with +- # underscore (_), so it is better to generate a list of symbols to +- # export. +- _LT_TAGVAR(always_export_symbols, $1)=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- _LT_TAGVAR(allow_undefined_flag, $1)='-berok' +- # Determine the default libpath from the value encoded in an empty +- # executable. +- _LT_SYS_MODULE_PATH_AIX +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" +- +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' +- _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" +- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" +- else +- # Determine the default libpath from the value encoded in an +- # empty executable. +- _LT_SYS_MODULE_PATH_AIX +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" +- # Warning - without using the other run time loading flags, +- # -berok will link without error, but may produce a broken library. +- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' +- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' +- # Exported symbols can be pulled into shared objects from archives +- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' +- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes +- # This is similar to how AIX traditionally builds its shared +- # libraries. +- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' +- fi +- fi +- ;; +- +- beos*) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- +- chorus*) +- case $cc_basename in +- *) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, +- # as there is no search path for DLLs. +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- _LT_TAGVAR(always_export_symbols, $1)=no +- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes +- +- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is; otherwise, prepend... +- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname.def; +- else +- echo EXPORTS > $output_objdir/$soname.def; +- cat $export_symbols >> $output_objdir/$soname.def; +- fi~ +- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- darwin* | rhapsody*) +- _LT_DARWIN_LINKER_FEATURES($1) +- ;; +- +- dgux*) +- case $cc_basename in +- ec++*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- ghcx*) +- # Green Hills C++ Compiler +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- ;; +- +- freebsd[[12]]*) +- # C++ shared libraries reported to be fairly broken before +- # switch to ELF +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- +- freebsd-elf*) +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- ;; +- +- freebsd* | dragonfly*) +- # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF +- # conventions +- _LT_TAGVAR(ld_shlibs, $1)=yes +- ;; +- +- gnu*) +- ;; +- +- hpux9*) +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, +- # but as the default +- # location of the library. +- +- case $cc_basename in +- CC*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- aCC*) +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' +- ;; +- *) +- if test "$GXX" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- else +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- esac +- ;; +- +- hpux10*|hpux11*) +- if test $with_gnu_ld = no; then +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- +- case $host_cpu in +- hppa*64*|ia64*) +- ;; +- *) +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- ;; +- esac +- fi +- case $host_cpu in +- hppa*64*|ia64*) +- _LT_TAGVAR(hardcode_direct, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- *) +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes +- _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, +- # but as the default +- # location of the library. +- ;; +- esac +- +- case $cc_basename in +- CC*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- aCC*) +- case $host_cpu in +- hppa*64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- ia64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- esac +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' +- ;; +- *) +- if test "$GXX" = yes; then +- if test $with_gnu_ld = no; then +- case $host_cpu in +- hppa*64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- ia64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- esac +- fi +- else +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- esac +- ;; +- +- interix[[3-9]]*) +- _LT_TAGVAR(hardcode_direct, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. +- # Instead, shared libraries are loaded at an image base (0x10000000 by +- # default) and relocated if they conflict, which is a slow very memory +- # consuming and fragmenting process. To avoid this, we pick a random, +- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link +- # time. Moving up from 0x10000000 also allows more sbrk(2) space. +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- ;; +- irix5* | irix6*) +- case $cc_basename in +- CC*) +- # SGI C++ +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- +- # Archives containing C++ object files must be created using +- # "CC -ar", where "CC" is the IRIX C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' +- ;; +- *) +- if test "$GXX" = yes; then +- if test "$with_gnu_ld" = no; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' +- fi +- fi +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- ;; +- esac +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- _LT_TAGVAR(inherit_rpath, $1)=yes +- ;; +- +- linux* | k*bsd*-gnu) +- case $cc_basename in +- KCC*) +- # Kuck and Associates, Inc. (KAI) C++ Compiler +- +- # KCC will only create a shared library if the output file +- # ends with ".so" (or ".sl" for HP-UX), so rename the library +- # to its proper name (with version) after linking. +- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' +- +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- +- # Archives containing C++ object files must be created using +- # "CC -Bstatic", where "CC" is the KAI C++ compiler. +- _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' +- ;; +- icpc* | ecpc* ) +- # Intel C++ +- with_gnu_ld=yes +- # version 8.0 and above of icpc choke on multiply defined symbols +- # if we add $predep_objects and $postdep_objects, however 7.1 and +- # earlier do not add the objects themselves. +- case `$CC -V 2>&1` in +- *"Version 7."*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- ;; +- *) # Version 8.0 or newer +- tmp_idyn= +- case $host_cpu in +- ia64*) tmp_idyn=' -i_dynamic';; +- esac +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- ;; +- esac +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +- ;; +- pgCC* | pgcpp*) +- # Portland Group C++ compiler +- case `$CC -V` in +- *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) +- _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ +- compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' +- _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ +- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ +- $RANLIB $oldlib' +- _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' +- ;; +- *) # Version 6 will use weak symbols +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' +- ;; +- esac +- +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' +- ;; +- cxx*) +- # Compaq C++ +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' +- +- runpath_var=LD_RUN_PATH +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' +- ;; +- xl*) +- # IBM XL 8.0 on PPC, with GNU ld +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- if test "x$supports_anon_versioning" = xyes; then +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- fi +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' +- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' +- _LT_TAGVAR(compiler_needs_object, $1)=yes +- +- # Not sure whether something based on +- # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 +- # would be better. +- output_verbose_link_cmd='echo' +- +- # Archives containing C++ object files must be created using +- # "CC -xar", where "CC" is the Sun C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' +- ;; +- esac +- ;; +- esac +- ;; +- +- lynxos*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- +- m88k*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- +- mvs*) +- case $cc_basename in +- cxx*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' +- wlarc= +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- fi +- # Workaround some broken pre-1.5 toolchains +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' +- ;; +- +- *nto* | *qnx*) +- _LT_TAGVAR(ld_shlibs, $1)=yes +- ;; +- +- openbsd2*) +- # C++ shared libraries are fairly broken +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- +- openbsd*) +- if test -f /usr/libexec/ld.so; then +- _LT_TAGVAR(hardcode_direct, $1)=yes +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' +- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- fi +- output_verbose_link_cmd=echo +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- +- osf3* | osf4* | osf5*) +- case $cc_basename in +- KCC*) +- # Kuck and Associates, Inc. (KAI) C++ Compiler +- +- # KCC will only create a shared library if the output file +- # ends with ".so" (or ".sl" for HP-UX), so rename the library +- # to its proper name (with version) after linking. +- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' +- +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- +- # Archives containing C++ object files must be created using +- # the KAI C++ compiler. +- case $host in +- osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; +- *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; +- esac +- ;; +- RCC*) +- # Rational C++ 2.4.1 +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- cxx*) +- case $host in +- osf3*) +- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- ;; +- *) +- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ +- echo "-hidden">> $lib.exp~ +- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ +- $RM $lib.exp' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' +- ;; +- esac +- +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' +- ;; +- *) +- if test "$GXX" = yes && test "$with_gnu_ld" = no; then +- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- case $host in +- osf3*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- ;; +- esac +- +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' +- +- else +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- esac +- ;; +- +- psos*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- +- sunos4*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.x +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- lcc*) +- # Lucid +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- ;; +- +- solaris*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.2, 5.x and Centerline C++ +- _LT_TAGVAR(archive_cmds_need_lc,$1)=yes +- _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' +- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- case $host_os in +- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; +- *) +- # The compiler driver will combine and reorder linker options, +- # but understands `-z linker_flag'. +- # Supported since Solaris 2.6 (maybe 2.5.1?) +- _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' +- ;; +- esac +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- +- output_verbose_link_cmd='echo' +- +- # Archives containing C++ object files must be created using +- # "CC -xar", where "CC" is the Sun C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' +- ;; +- gcx*) +- # Green Hills C++ Compiler +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- +- # The C++ compiler must be used to create the archive. +- _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' +- ;; +- *) +- # GNU C++ compiler with Solaris linker +- if test "$GXX" = yes && test "$with_gnu_ld" = no; then +- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' +- if $CC --version | $GREP -v '^2\.7' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' +- else +- # g++ 2.7 appears to require `-G' NOT `-shared' on this +- # platform. +- _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' +- fi +- +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' +- case $host_os in +- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; +- *) +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' +- ;; +- esac +- fi +- ;; +- esac +- ;; +- +- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) +- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- runpath_var='LD_RUN_PATH' +- +- case $cc_basename in +- CC*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- ;; +- +- sysv5* | sco3.2v5* | sco5v6*) +- # Note: We can NOT use -z defs as we might desire, because we do not +- # link with -lc, and that would cause any symbols used from libc to +- # always be unresolved, which means just about no library would +- # ever link correctly. If we're not using GNU ld we use -z text +- # though, which does catch some bad symbols but isn't as heavy-handed +- # as -z defs. +- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' +- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' +- _LT_TAGVAR(hardcode_libdir_separator, $1)=':' +- _LT_TAGVAR(link_all_deplibs, $1)=yes +- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' +- runpath_var='LD_RUN_PATH' +- +- case $cc_basename in +- CC*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- ;; +- +- tandem*) +- case $cc_basename in +- NCC*) +- # NonStop-UX NCC 3.20 +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- ;; +- +- vxworks*) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- +- *) +- # FIXME: insert proper C++ library support +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- +- AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +- test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no +- +- _LT_TAGVAR(GCC, $1)="$GXX" +- _LT_TAGVAR(LD, $1)="$LD" +- +- ## CAVEAT EMPTOR: +- ## There is no encapsulation within the following macros, do not change +- ## the running order or otherwise move them around unless you know exactly +- ## what you are doing... +- _LT_SYS_HIDDEN_LIBDEPS($1) +- _LT_COMPILER_PIC($1) +- _LT_COMPILER_C_O($1) +- _LT_COMPILER_FILE_LOCKS($1) +- _LT_LINKER_SHLIBS($1) +- _LT_SYS_DYNAMIC_LINKER($1) +- _LT_LINKER_HARDCODE_LIBPATH($1) +- +- _LT_CONFIG($1) +- fi # test -n "$compiler" +- +- CC=$lt_save_CC +- LDCXX=$LD +- LD=$lt_save_LD +- GCC=$lt_save_GCC +- with_gnu_ld=$lt_save_with_gnu_ld +- lt_cv_path_LDCXX=$lt_cv_path_LD +- lt_cv_path_LD=$lt_save_path_LD +- lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +- lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +-fi # test "$_lt_caught_CXX_error" != yes +- +-AC_LANG_POP +-])# _LT_LANG_CXX_CONFIG +- +- +-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +-# --------------------------------- +-# Figure out "hidden" library dependencies from verbose +-# compiler output when linking a shared library. +-# Parse the compiler output and extract the necessary +-# objects, libraries and library flags. +-m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-# Dependencies to place before and after the object being linked: +-_LT_TAGVAR(predep_objects, $1)= +-_LT_TAGVAR(postdep_objects, $1)= +-_LT_TAGVAR(predeps, $1)= +-_LT_TAGVAR(postdeps, $1)= +-_LT_TAGVAR(compiler_lib_search_path, $1)= +- +-dnl we can't use the lt_simple_compile_test_code here, +-dnl because it contains code intended for an executable, +-dnl not a library. It's possible we should let each +-dnl tag define a new lt_????_link_test_code variable, +-dnl but it's only used here... +-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +-int a; +-void foo (void) { a = 0; } +-_LT_EOF +-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +-class Foo +-{ +-public: +- Foo (void) { a = 0; } +-private: +- int a; +-}; +-_LT_EOF +-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF +- subroutine foo +- implicit none +- integer*4 a +- a=0 +- return +- end +-_LT_EOF +-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF +- subroutine foo +- implicit none +- integer a +- a=0 +- return +- end +-_LT_EOF +-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +-public class foo { +- private int a; +- public void bar (void) { +- a = 0; +- } +-}; +-_LT_EOF +-]) +-dnl Parse the compiler output and extract the necessary +-dnl objects, libraries and library flags. +-if AC_TRY_EVAL(ac_compile); then +- # Parse the compiler output and extract the necessary +- # objects, libraries and library flags. +- +- # Sentinel used to keep track of whether or not we are before +- # the conftest object file. +- pre_test_object_deps_done=no +- +- for p in `eval "$output_verbose_link_cmd"`; do +- case $p in +- +- -L* | -R* | -l*) +- # Some compilers place space between "-{L,R}" and the path. +- # Remove the space. +- if test $p = "-L" || +- test $p = "-R"; then +- prev=$p +- continue +- else +- prev= +- fi +- +- if test "$pre_test_object_deps_done" = no; then +- case $p in +- -L* | -R*) +- # Internal compiler library paths should come after those +- # provided the user. The postdeps already come after the +- # user supplied libs so there is no need to process them. +- if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then +- _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" +- else +- _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" +- fi +- ;; +- # The "-l" case would never come before the object being +- # linked, so don't bother handling this case. +- esac +- else +- if test -z "$_LT_TAGVAR(postdeps, $1)"; then +- _LT_TAGVAR(postdeps, $1)="${prev}${p}" +- else +- _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" +- fi +- fi +- ;; +- +- *.$objext) +- # This assumes that the test object file only shows up +- # once in the compiler output. +- if test "$p" = "conftest.$objext"; then +- pre_test_object_deps_done=yes +- continue +- fi +- +- if test "$pre_test_object_deps_done" = no; then +- if test -z "$_LT_TAGVAR(predep_objects, $1)"; then +- _LT_TAGVAR(predep_objects, $1)="$p" +- else +- _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" +- fi +- else +- if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then +- _LT_TAGVAR(postdep_objects, $1)="$p" +- else +- _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" +- fi +- fi +- ;; +- +- *) ;; # Ignore the rest. +- +- esac +- done +- +- # Clean up. +- rm -f a.out a.exe +-else +- echo "libtool.m4: error: problem compiling $1 test program" +-fi +- +-$RM -f confest.$objext +- +-# PORTME: override above test on systems where it is broken +-m4_if([$1], [CXX], +-[case $host_os in +-interix[[3-9]]*) +- # Interix 3.5 installs completely hosed .la files for C++, so rather than +- # hack all around it, let's just trust "g++" to DTRT. +- _LT_TAGVAR(predep_objects,$1)= +- _LT_TAGVAR(postdep_objects,$1)= +- _LT_TAGVAR(postdeps,$1)= +- ;; +- +-linux*) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- +- # The more standards-conforming stlport4 library is +- # incompatible with the Cstd library. Avoid specifying +- # it if it's in CXXFLAGS. Ignore libCrun as +- # -library=stlport4 depends on it. +- case " $CXX $CXXFLAGS " in +- *" -library=stlport4 "*) +- solaris_use_stlport4=yes +- ;; +- esac +- +- if test "$solaris_use_stlport4" != yes; then +- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' +- fi +- ;; +- esac +- ;; +- +-solaris*) +- case $cc_basename in +- CC*) +- # The more standards-conforming stlport4 library is +- # incompatible with the Cstd library. Avoid specifying +- # it if it's in CXXFLAGS. Ignore libCrun as +- # -library=stlport4 depends on it. +- case " $CXX $CXXFLAGS " in +- *" -library=stlport4 "*) +- solaris_use_stlport4=yes +- ;; +- esac +- +- # Adding this requires a known-good setup of shared libraries for +- # Sun compiler versions before 5.6, else PIC objects from an old +- # archive will be linked into the output, leading to subtle bugs. +- if test "$solaris_use_stlport4" != yes; then +- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' +- fi +- ;; +- esac +- ;; +-esac +-]) +- +-case " $_LT_TAGVAR(postdeps, $1) " in +-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +-esac +- _LT_TAGVAR(compiler_lib_search_dirs, $1)= +-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then +- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +-fi +-_LT_TAGDECL([], [compiler_lib_search_dirs], [1], +- [The directories searched by this compiler when creating a shared library]) +-_LT_TAGDECL([], [predep_objects], [1], +- [Dependencies to place before and after the objects being linked to +- create a shared library]) +-_LT_TAGDECL([], [postdep_objects], [1]) +-_LT_TAGDECL([], [predeps], [1]) +-_LT_TAGDECL([], [postdeps], [1]) +-_LT_TAGDECL([], [compiler_lib_search_path], [1], +- [The library search path used internally by the compiler when linking +- a shared library]) +-])# _LT_SYS_HIDDEN_LIBDEPS +- +- +-# _LT_PROG_F77 +-# ------------ +-# Since AC_PROG_F77 is broken, in that it returns the empty string +-# if there is no fortran compiler, we have our own version here. +-m4_defun([_LT_PROG_F77], +-[ +-pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +-AC_PROG_F77 +-if test -z "$F77" || test "X$F77" = "Xno"; then +- _lt_disable_F77=yes +-fi +-popdef([AC_MSG_ERROR]) +-])# _LT_PROG_F77 +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([_LT_PROG_F77], []) +- +- +-# _LT_LANG_F77_CONFIG([TAG]) +-# -------------------------- +-# Ensure that the configuration variables for a Fortran 77 compiler are +-# suitably defined. These variables are subsequently used by _LT_CONFIG +-# to write the compiler configuration to `libtool'. +-m4_defun([_LT_LANG_F77_CONFIG], +-[AC_REQUIRE([_LT_PROG_F77])dnl +-AC_LANG_PUSH(Fortran 77) +- +-_LT_TAGVAR(archive_cmds_need_lc, $1)=no +-_LT_TAGVAR(allow_undefined_flag, $1)= +-_LT_TAGVAR(always_export_symbols, $1)=no +-_LT_TAGVAR(archive_expsym_cmds, $1)= +-_LT_TAGVAR(export_dynamic_flag_spec, $1)= +-_LT_TAGVAR(hardcode_direct, $1)=no +-_LT_TAGVAR(hardcode_direct_absolute, $1)=no +-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +-_LT_TAGVAR(hardcode_libdir_separator, $1)= +-_LT_TAGVAR(hardcode_minus_L, $1)=no +-_LT_TAGVAR(hardcode_automatic, $1)=no +-_LT_TAGVAR(inherit_rpath, $1)=no +-_LT_TAGVAR(module_cmds, $1)= +-_LT_TAGVAR(module_expsym_cmds, $1)= +-_LT_TAGVAR(link_all_deplibs, $1)=unknown +-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +-_LT_TAGVAR(no_undefined_flag, $1)= +-_LT_TAGVAR(whole_archive_flag_spec, $1)= +-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no +- +-# Source file extension for f77 test sources. +-ac_ext=f +- +-# Object file extension for compiled f77 test sources. +-objext=o +-_LT_TAGVAR(objext, $1)=$objext +- +-# No sense in running all these tests if we already determined that +-# the F77 compiler isn't working. Some variables (like enable_shared) +-# are currently assumed to apply to all compilers on this platform, +-# and will be corrupted by setting them based on a non-working compiler. +-if test "$_lt_disable_F77" != yes; then +- # Code to be used in simple compile tests +- lt_simple_compile_test_code="\ +- subroutine t +- return +- end +-" +- +- # Code to be used in simple link tests +- lt_simple_link_test_code="\ +- program t +- end +-" +- +- # ltmain only uses $CC for tagged configurations so make sure $CC is set. +- _LT_TAG_COMPILER +- +- # save warnings/boilerplate of simple test code +- _LT_COMPILER_BOILERPLATE +- _LT_LINKER_BOILERPLATE +- +- # Allow CC to be a program name with arguments. +- lt_save_CC="$CC" +- lt_save_GCC=$GCC +- CC=${F77-"f77"} +- compiler=$CC +- _LT_TAGVAR(compiler, $1)=$CC +- _LT_CC_BASENAME([$compiler]) +- GCC=$G77 +- if test -n "$compiler"; then +- AC_MSG_CHECKING([if libtool supports shared libraries]) +- AC_MSG_RESULT([$can_build_shared]) +- +- AC_MSG_CHECKING([whether to build shared libraries]) +- test "$can_build_shared" = "no" && enable_shared=no +- +- # On AIX, shared libraries and static libraries use the same namespace, and +- # are all built from PIC. +- case $host_os in +- aix3*) +- test "$enable_shared" = yes && enable_static=no +- if test -n "$RANLIB"; then +- archive_cmds="$archive_cmds~\$RANLIB \$lib" +- postinstall_cmds='$RANLIB $lib' +- fi +- ;; +- aix[[4-9]]*) +- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then +- test "$enable_shared" = yes && enable_static=no +- fi +- ;; +- esac +- AC_MSG_RESULT([$enable_shared]) +- +- AC_MSG_CHECKING([whether to build static libraries]) +- # Make sure either enable_shared or enable_static is yes. +- test "$enable_shared" = yes || enable_static=yes +- AC_MSG_RESULT([$enable_static]) +- +- _LT_TAGVAR(GCC, $1)="$G77" +- _LT_TAGVAR(LD, $1)="$LD" +- +- ## CAVEAT EMPTOR: +- ## There is no encapsulation within the following macros, do not change +- ## the running order or otherwise move them around unless you know exactly +- ## what you are doing... +- _LT_COMPILER_PIC($1) +- _LT_COMPILER_C_O($1) +- _LT_COMPILER_FILE_LOCKS($1) +- _LT_LINKER_SHLIBS($1) +- _LT_SYS_DYNAMIC_LINKER($1) +- _LT_LINKER_HARDCODE_LIBPATH($1) +- +- _LT_CONFIG($1) +- fi # test -n "$compiler" +- +- GCC=$lt_save_GCC +- CC="$lt_save_CC" +-fi # test "$_lt_disable_F77" != yes +- +-AC_LANG_POP +-])# _LT_LANG_F77_CONFIG +- +- +-# _LT_PROG_FC +-# ----------- +-# Since AC_PROG_FC is broken, in that it returns the empty string +-# if there is no fortran compiler, we have our own version here. +-m4_defun([_LT_PROG_FC], +-[ +-pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +-AC_PROG_FC +-if test -z "$FC" || test "X$FC" = "Xno"; then +- _lt_disable_FC=yes +-fi +-popdef([AC_MSG_ERROR]) +-])# _LT_PROG_FC +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([_LT_PROG_FC], []) +- +- +-# _LT_LANG_FC_CONFIG([TAG]) +-# ------------------------- +-# Ensure that the configuration variables for a Fortran compiler are +-# suitably defined. These variables are subsequently used by _LT_CONFIG +-# to write the compiler configuration to `libtool'. +-m4_defun([_LT_LANG_FC_CONFIG], +-[AC_REQUIRE([_LT_PROG_FC])dnl +-AC_LANG_PUSH(Fortran) +- +-_LT_TAGVAR(archive_cmds_need_lc, $1)=no +-_LT_TAGVAR(allow_undefined_flag, $1)= +-_LT_TAGVAR(always_export_symbols, $1)=no +-_LT_TAGVAR(archive_expsym_cmds, $1)= +-_LT_TAGVAR(export_dynamic_flag_spec, $1)= +-_LT_TAGVAR(hardcode_direct, $1)=no +-_LT_TAGVAR(hardcode_direct_absolute, $1)=no +-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +-_LT_TAGVAR(hardcode_libdir_separator, $1)= +-_LT_TAGVAR(hardcode_minus_L, $1)=no +-_LT_TAGVAR(hardcode_automatic, $1)=no +-_LT_TAGVAR(inherit_rpath, $1)=no +-_LT_TAGVAR(module_cmds, $1)= +-_LT_TAGVAR(module_expsym_cmds, $1)= +-_LT_TAGVAR(link_all_deplibs, $1)=unknown +-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +-_LT_TAGVAR(no_undefined_flag, $1)= +-_LT_TAGVAR(whole_archive_flag_spec, $1)= +-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no +- +-# Source file extension for fc test sources. +-ac_ext=${ac_fc_srcext-f} +- +-# Object file extension for compiled fc test sources. +-objext=o +-_LT_TAGVAR(objext, $1)=$objext +- +-# No sense in running all these tests if we already determined that +-# the FC compiler isn't working. Some variables (like enable_shared) +-# are currently assumed to apply to all compilers on this platform, +-# and will be corrupted by setting them based on a non-working compiler. +-if test "$_lt_disable_FC" != yes; then +- # Code to be used in simple compile tests +- lt_simple_compile_test_code="\ +- subroutine t +- return +- end +-" +- +- # Code to be used in simple link tests +- lt_simple_link_test_code="\ +- program t +- end +-" +- +- # ltmain only uses $CC for tagged configurations so make sure $CC is set. +- _LT_TAG_COMPILER +- +- # save warnings/boilerplate of simple test code +- _LT_COMPILER_BOILERPLATE +- _LT_LINKER_BOILERPLATE +- +- # Allow CC to be a program name with arguments. +- lt_save_CC="$CC" +- lt_save_GCC=$GCC +- CC=${FC-"f95"} +- compiler=$CC +- GCC=$ac_cv_fc_compiler_gnu +- +- _LT_TAGVAR(compiler, $1)=$CC +- _LT_CC_BASENAME([$compiler]) +- +- if test -n "$compiler"; then +- AC_MSG_CHECKING([if libtool supports shared libraries]) +- AC_MSG_RESULT([$can_build_shared]) +- +- AC_MSG_CHECKING([whether to build shared libraries]) +- test "$can_build_shared" = "no" && enable_shared=no +- +- # On AIX, shared libraries and static libraries use the same namespace, and +- # are all built from PIC. +- case $host_os in +- aix3*) +- test "$enable_shared" = yes && enable_static=no +- if test -n "$RANLIB"; then +- archive_cmds="$archive_cmds~\$RANLIB \$lib" +- postinstall_cmds='$RANLIB $lib' +- fi +- ;; +- aix[[4-9]]*) +- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then +- test "$enable_shared" = yes && enable_static=no +- fi +- ;; +- esac +- AC_MSG_RESULT([$enable_shared]) +- +- AC_MSG_CHECKING([whether to build static libraries]) +- # Make sure either enable_shared or enable_static is yes. +- test "$enable_shared" = yes || enable_static=yes +- AC_MSG_RESULT([$enable_static]) +- +- _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" +- _LT_TAGVAR(LD, $1)="$LD" +- +- ## CAVEAT EMPTOR: +- ## There is no encapsulation within the following macros, do not change +- ## the running order or otherwise move them around unless you know exactly +- ## what you are doing... +- _LT_SYS_HIDDEN_LIBDEPS($1) +- _LT_COMPILER_PIC($1) +- _LT_COMPILER_C_O($1) +- _LT_COMPILER_FILE_LOCKS($1) +- _LT_LINKER_SHLIBS($1) +- _LT_SYS_DYNAMIC_LINKER($1) +- _LT_LINKER_HARDCODE_LIBPATH($1) +- +- _LT_CONFIG($1) +- fi # test -n "$compiler" +- +- GCC=$lt_save_GCC +- CC="$lt_save_CC" +-fi # test "$_lt_disable_FC" != yes +- +-AC_LANG_POP +-])# _LT_LANG_FC_CONFIG +- +- +-# _LT_LANG_GCJ_CONFIG([TAG]) +-# -------------------------- +-# Ensure that the configuration variables for the GNU Java Compiler compiler +-# are suitably defined. These variables are subsequently used by _LT_CONFIG +-# to write the compiler configuration to `libtool'. +-m4_defun([_LT_LANG_GCJ_CONFIG], +-[AC_REQUIRE([LT_PROG_GCJ])dnl +-AC_LANG_SAVE +- +-# Source file extension for Java test sources. +-ac_ext=java +- +-# Object file extension for compiled Java test sources. +-objext=o +-_LT_TAGVAR(objext, $1)=$objext +- +-# Code to be used in simple compile tests +-lt_simple_compile_test_code="class foo {}" +- +-# Code to be used in simple link tests +-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' +- +-# ltmain only uses $CC for tagged configurations so make sure $CC is set. +-_LT_TAG_COMPILER +- +-# save warnings/boilerplate of simple test code +-_LT_COMPILER_BOILERPLATE +-_LT_LINKER_BOILERPLATE +- +-# Allow CC to be a program name with arguments. +-lt_save_CC="$CC" +-lt_save_GCC=$GCC +-GCC=yes +-CC=${GCJ-"gcj"} +-compiler=$CC +-_LT_TAGVAR(compiler, $1)=$CC +-_LT_TAGVAR(LD, $1)="$LD" +-_LT_CC_BASENAME([$compiler]) +- +-# GCJ did not exist at the time GCC didn't implicitly link libc in. +-_LT_TAGVAR(archive_cmds_need_lc, $1)=no +- +-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +- +-if test -n "$compiler"; then +- _LT_COMPILER_NO_RTTI($1) +- _LT_COMPILER_PIC($1) +- _LT_COMPILER_C_O($1) +- _LT_COMPILER_FILE_LOCKS($1) +- _LT_LINKER_SHLIBS($1) +- _LT_LINKER_HARDCODE_LIBPATH($1) +- +- _LT_CONFIG($1) +-fi +- +-AC_LANG_RESTORE +- +-GCC=$lt_save_GCC +-CC="$lt_save_CC" +-])# _LT_LANG_GCJ_CONFIG +- +- +-# _LT_LANG_RC_CONFIG([TAG]) +-# ------------------------- +-# Ensure that the configuration variables for the Windows resource compiler +-# are suitably defined. These variables are subsequently used by _LT_CONFIG +-# to write the compiler configuration to `libtool'. +-m4_defun([_LT_LANG_RC_CONFIG], +-[AC_REQUIRE([LT_PROG_RC])dnl +-AC_LANG_SAVE +- +-# Source file extension for RC test sources. +-ac_ext=rc +- +-# Object file extension for compiled RC test sources. +-objext=o +-_LT_TAGVAR(objext, $1)=$objext +- +-# Code to be used in simple compile tests +-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' +- +-# Code to be used in simple link tests +-lt_simple_link_test_code="$lt_simple_compile_test_code" +- +-# ltmain only uses $CC for tagged configurations so make sure $CC is set. +-_LT_TAG_COMPILER +- +-# save warnings/boilerplate of simple test code +-_LT_COMPILER_BOILERPLATE +-_LT_LINKER_BOILERPLATE +- +-# Allow CC to be a program name with arguments. +-lt_save_CC="$CC" +-lt_save_GCC=$GCC +-GCC= +-CC=${RC-"windres"} +-compiler=$CC +-_LT_TAGVAR(compiler, $1)=$CC +-_LT_CC_BASENAME([$compiler]) +-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes +- +-if test -n "$compiler"; then +- : +- _LT_CONFIG($1) +-fi +- +-GCC=$lt_save_GCC +-AC_LANG_RESTORE +-CC="$lt_save_CC" +-])# _LT_LANG_RC_CONFIG +- +- +-# LT_PROG_GCJ +-# ----------- +-AC_DEFUN([LT_PROG_GCJ], +-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], +- [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], +- [AC_CHECK_TOOL(GCJ, gcj,) +- test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" +- AC_SUBST(GCJFLAGS)])])[]dnl +-]) +- +-# Old name: +-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([LT_AC_PROG_GCJ], []) +- +- +-# LT_PROG_RC +-# ---------- +-AC_DEFUN([LT_PROG_RC], +-[AC_CHECK_TOOL(RC, windres,) +-]) +- +-# Old name: +-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([LT_AC_PROG_RC], []) +- +- +-# _LT_DECL_EGREP +-# -------------- +-# If we don't have a new enough Autoconf to choose the best grep +-# available, choose the one first in the user's PATH. +-m4_defun([_LT_DECL_EGREP], +-[AC_REQUIRE([AC_PROG_EGREP])dnl +-AC_REQUIRE([AC_PROG_FGREP])dnl +-test -z "$GREP" && GREP=grep +-_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +-_LT_DECL([], [EGREP], [1], [An ERE matcher]) +-_LT_DECL([], [FGREP], [1], [A literal string matcher]) +-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +-AC_SUBST([GREP]) +-]) +- +- +-# _LT_DECL_OBJDUMP +-# -------------- +-# If we don't have a new enough Autoconf to choose the best objdump +-# available, choose the one first in the user's PATH. +-m4_defun([_LT_DECL_OBJDUMP], +-[AC_CHECK_TOOL(OBJDUMP, objdump, false) +-test -z "$OBJDUMP" && OBJDUMP=objdump +-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +-AC_SUBST([OBJDUMP]) +-]) +- +- +-# _LT_DECL_SED +-# ------------ +-# Check for a fully-functional sed program, that truncates +-# as few characters as possible. Prefer GNU sed if found. +-m4_defun([_LT_DECL_SED], +-[AC_PROG_SED +-test -z "$SED" && SED=sed +-Xsed="$SED -e 1s/^X//" +-_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], +- [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +-])# _LT_DECL_SED +- +-m4_ifndef([AC_PROG_SED], [ +-# NOTE: This macro has been submitted for inclusion into # +-# GNU Autoconf as AC_PROG_SED. When it is available in # +-# a released version of Autoconf we should remove this # +-# macro and use it instead. # +- +-m4_defun([AC_PROG_SED], +-[AC_MSG_CHECKING([for a sed that does not truncate output]) +-AC_CACHE_VAL(lt_cv_path_SED, +-[# Loop through the user's path and test for sed and gsed. +-# Then use that list of sed's as ones to test for truncation. +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for lt_ac_prog in sed gsed; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then +- lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" +- fi +- done +- done +-done +-IFS=$as_save_IFS +-lt_ac_max=0 +-lt_ac_count=0 +-# Add /usr/xpg4/bin/sed as it is typically found on Solaris +-# along with /bin/sed that truncates output. +-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do +- test ! -f $lt_ac_sed && continue +- cat /dev/null > conftest.in +- lt_ac_count=0 +- echo $ECHO_N "0123456789$ECHO_C" >conftest.in +- # Check for GNU sed and select it if it is found. +- if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then +- lt_cv_path_SED=$lt_ac_sed +- break +- fi +- while true; do +- cat conftest.in conftest.in >conftest.tmp +- mv conftest.tmp conftest.in +- cp conftest.in conftest.nl +- echo >>conftest.nl +- $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break +- cmp -s conftest.out conftest.nl || break +- # 10000 chars as input seems more than enough +- test $lt_ac_count -gt 10 && break +- lt_ac_count=`expr $lt_ac_count + 1` +- if test $lt_ac_count -gt $lt_ac_max; then +- lt_ac_max=$lt_ac_count +- lt_cv_path_SED=$lt_ac_sed +- fi +- done +-done +-]) +-SED=$lt_cv_path_SED +-AC_SUBST([SED]) +-AC_MSG_RESULT([$SED]) +-])#AC_PROG_SED +-])#m4_ifndef +- +-# Old name: +-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([LT_AC_PROG_SED], []) +- +- +-# _LT_CHECK_SHELL_FEATURES +-# ------------------------ +-# Find out whether the shell is Bourne or XSI compatible, +-# or has some other useful features. +-m4_defun([_LT_CHECK_SHELL_FEATURES], +-[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +-# Try some XSI features +-xsi_shell=no +-( _lt_dummy="a/b/c" +- test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ +- = c,a/b,, \ +- && eval 'test $(( 1 + 1 )) -eq 2 \ +- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ +- && xsi_shell=yes +-AC_MSG_RESULT([$xsi_shell]) +-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) +- +-AC_MSG_CHECKING([whether the shell understands "+="]) +-lt_shell_append=no +-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ +- >/dev/null 2>&1 \ +- && lt_shell_append=yes +-AC_MSG_RESULT([$lt_shell_append]) +-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) +- +-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +- lt_unset=unset +-else +- lt_unset=false +-fi +-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl +- +-# test EBCDIC or ASCII +-case `echo X|tr X '\101'` in +- A) # ASCII based system +- # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr +- lt_SP2NL='tr \040 \012' +- lt_NL2SP='tr \015\012 \040\040' +- ;; +- *) # EBCDIC based system +- lt_SP2NL='tr \100 \n' +- lt_NL2SP='tr \r\n \100\100' +- ;; +-esac +-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +-])# _LT_CHECK_SHELL_FEATURES +- +- +-# _LT_PROG_XSI_SHELLFNS +-# --------------------- +-# Bourne and XSI compatible variants of some useful shell functions. +-m4_defun([_LT_PROG_XSI_SHELLFNS], +-[case $xsi_shell in +- yes) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_dirname file append nondir_replacement +-# Compute the dirname of FILE. If nonempty, add APPEND to the result, +-# otherwise set result to NONDIR_REPLACEMENT. +-func_dirname () +-{ +- case ${1} in +- */*) func_dirname_result="${1%/*}${2}" ;; +- * ) func_dirname_result="${3}" ;; +- esac +-} +- +-# func_basename file +-func_basename () +-{ +- func_basename_result="${1##*/}" +-} +- +-# func_dirname_and_basename file append nondir_replacement +-# perform func_basename and func_dirname in a single function +-# call: +-# dirname: Compute the dirname of FILE. If nonempty, +-# add APPEND to the result, otherwise set result +-# to NONDIR_REPLACEMENT. +-# value returned in "$func_dirname_result" +-# basename: Compute filename of FILE. +-# value retuned in "$func_basename_result" +-# Implementation must be kept synchronized with func_dirname +-# and func_basename. For efficiency, we do not delegate to +-# those functions but instead duplicate the functionality here. +-func_dirname_and_basename () +-{ +- case ${1} in +- */*) func_dirname_result="${1%/*}${2}" ;; +- * ) func_dirname_result="${3}" ;; +- esac +- func_basename_result="${1##*/}" +-} +- +-# func_stripname prefix suffix name +-# strip PREFIX and SUFFIX off of NAME. +-# PREFIX and SUFFIX must not contain globbing or regex special +-# characters, hashes, percent signs, but SUFFIX may contain a leading +-# dot (in which case that matches only a dot). +-func_stripname () +-{ +- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are +- # positional parameters, so assign one to ordinary parameter first. +- func_stripname_result=${3} +- func_stripname_result=${func_stripname_result#"${1}"} +- func_stripname_result=${func_stripname_result%"${2}"} +-} +- +-# func_opt_split +-func_opt_split () +-{ +- func_opt_split_opt=${1%%=*} +- func_opt_split_arg=${1#*=} +-} +- +-# func_lo2o object +-func_lo2o () +-{ +- case ${1} in +- *.lo) func_lo2o_result=${1%.lo}.${objext} ;; +- *) func_lo2o_result=${1} ;; +- esac +-} +- +-# func_xform libobj-or-source +-func_xform () +-{ +- func_xform_result=${1%.*}.lo +-} +- +-# func_arith arithmetic-term... +-func_arith () +-{ +- func_arith_result=$(( $[*] )) +-} +- +-# func_len string +-# STRING may not start with a hyphen. +-func_len () +-{ +- func_len_result=${#1} +-} +- +-_LT_EOF +- ;; +- *) # Bourne compatible functions. +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_dirname file append nondir_replacement +-# Compute the dirname of FILE. If nonempty, add APPEND to the result, +-# otherwise set result to NONDIR_REPLACEMENT. +-func_dirname () +-{ +- # Extract subdirectory from the argument. +- func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` +- if test "X$func_dirname_result" = "X${1}"; then +- func_dirname_result="${3}" +- else +- func_dirname_result="$func_dirname_result${2}" +- fi +-} +- +-# func_basename file +-func_basename () +-{ +- func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +-} +- +-dnl func_dirname_and_basename +-dnl A portable version of this function is already defined in general.m4sh +-dnl so there is no need for it here. +- +-# func_stripname prefix suffix name +-# strip PREFIX and SUFFIX off of NAME. +-# PREFIX and SUFFIX must not contain globbing or regex special +-# characters, hashes, percent signs, but SUFFIX may contain a leading +-# dot (in which case that matches only a dot). +-# func_strip_suffix prefix name +-func_stripname () +-{ +- case ${2} in +- .*) func_stripname_result=`$ECHO "X${3}" \ +- | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; +- *) func_stripname_result=`$ECHO "X${3}" \ +- | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; +- esac +-} +- +-# sed scripts: +-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +-my_sed_long_arg='1s/^-[[^=]]*=//' +- +-# func_opt_split +-func_opt_split () +-{ +- func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` +- func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +-} +- +-# func_lo2o object +-func_lo2o () +-{ +- func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +-} +- +-# func_xform libobj-or-source +-func_xform () +-{ +- func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +-} +- +-# func_arith arithmetic-term... +-func_arith () +-{ +- func_arith_result=`expr "$[@]"` +-} +- +-# func_len string +-# STRING may not start with a hyphen. +-func_len () +-{ +- func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +-} +- +-_LT_EOF +-esac +- +-case $lt_shell_append in +- yes) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_append var value +-# Append VALUE to the end of shell variable VAR. +-func_append () +-{ +- eval "$[1]+=\$[2]" +-} +-_LT_EOF +- ;; +- *) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_append var value +-# Append VALUE to the end of shell variable VAR. +-func_append () +-{ +- eval "$[1]=\$$[1]\$[2]" +-} +- +-_LT_EOF +- ;; +- esac +-]) ++To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + + # ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- + # +-# Copyright (C) 1999-2006, 2007, 2008 Free Software Foundation, Inc. ++# Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc. + # Written by Thomas Tanner, 1999 + # + # This file is free software; the Free Software Foundation gives + # unlimited permission to copy and/or distribute it, with or without + # modifications, as long as this notice is preserved. + +-# serial 17 LTDL_INIT ++# serial 18 LTDL_INIT + + # LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE]) + # ------------------------------------------ + # DIRECTORY contains the libltdl sources. It is okay to call this + # function multiple times, as long as the same DIRECTORY is always given. + AC_DEFUN([LT_CONFIG_LTDL_DIR], + [AC_BEFORE([$0], [LTDL_INIT]) + _$0($*) +@@ -7774,20 +424,26 @@ m4_ifset([AH_HEADER], + AC_SUBST([LT_CONFIG_H]) + + AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], + [], [], [AC_INCLUDES_DEFAULT]) + + AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) + AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) + ++m4_pattern_allow([LT_LIBEXT])dnl + AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) + ++name= ++eval "lt_libprefix=\"$libname_spec\"" ++m4_pattern_allow([LT_LIBPREFIX])dnl ++AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) ++ + name=ltdl +-LTDLOPEN=`eval "\\$ECHO \"$libname_spec\""` ++eval "LTDLOPEN=\"$libname_spec\"" + AC_SUBST([LTDLOPEN]) + ])# _LTDL_SETUP + + + # _LT_ENABLE_INSTALL + # ------------------ + m4_define([_LT_ENABLE_INSTALL], + [AC_ARG_ENABLE([ltdl-install], +@@ -7834,17 +490,17 @@ AC_CACHE_CHECK([whether deplibs are load + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + lt_cv_sys_dlopen_deplibs=yes + ;; + freebsd* | dragonfly*) + lt_cv_sys_dlopen_deplibs=yes + ;; +- gnu* | linux* | k*bsd*-gnu) ++ gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + lt_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + lt_cv_sys_dlopen_deplibs=yes + ;; + interix*) + lt_cv_sys_dlopen_deplibs=yes +@@ -7914,22 +570,29 @@ dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS + # ----------------- + AC_DEFUN([LT_SYS_MODULE_EXT], + [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl + AC_CACHE_CHECK([which extension is used for runtime loadable modules], + [libltdl_cv_shlibext], + [ + module=yes + eval libltdl_cv_shlibext=$shrext_cmds ++module=no ++eval libltdl_cv_shrext=$shrext_cmds + ]) + if test -n "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_MODULE_EXT])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], + [Define to the extension used for runtime loadable modules, say, ".so".]) + fi ++if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then ++ m4_pattern_allow([LT_SHARED_EXT])dnl ++ AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], ++ [Define to the shared library suffix, say, ".dylib".]) ++fi + ])# LT_SYS_MODULE_EXT + + # Old name: + AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT]) + dnl aclocal-1.4 backwards compatibility: + dnl AC_DEFUN([AC_LTDL_SHLIBEXT], []) + + +@@ -8170,689 +833,83 @@ if test x"$libltdl_cv_need_uscore" = xye + fi + ])# LT_FUNC_DLSYM_USCORE + + # Old name: + AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE]) + dnl aclocal-1.4 backwards compatibility: + dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], []) + +-# Helper functions for option handling. -*- Autoconf -*- +-# +-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +-# Written by Gary V. Vaughan, 2004 +-# +-# This file is free software; the Free Software Foundation gives +-# unlimited permission to copy and/or distribute it, with or without +-# modifications, as long as this notice is preserved. +- +-# serial 6 ltoptions.m4 +- +-# This is to help aclocal find these macros, as it can't see m4_define. +-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) +- +- +-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +-# ------------------------------------------ +-m4_define([_LT_MANGLE_OPTION], +-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) +- +- +-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +-# --------------------------------------- +-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +-# matching handler defined, dispatch to it. Other OPTION-NAMEs are +-# saved as a flag. +-m4_define([_LT_SET_OPTION], +-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), +- _LT_MANGLE_DEFUN([$1], [$2]), +- [m4_warning([Unknown $1 option `$2'])])[]dnl +-]) +- +- +-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +-# ------------------------------------------------------------ +-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +-m4_define([_LT_IF_OPTION], +-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) +- +- +-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +-# ------------------------------------------------------- +-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +-# are set. +-m4_define([_LT_UNLESS_OPTIONS], +-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), +- [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), +- [m4_define([$0_found])])])[]dnl +-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +-])[]dnl +-]) +- +- +-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +-# ---------------------------------------- +-# OPTION-LIST is a space-separated list of Libtool options associated +-# with MACRO-NAME. If any OPTION has a matching handler declared with +-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +-# the unknown option and exit. +-m4_defun([_LT_SET_OPTIONS], +-[# Set options +-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), +- [_LT_SET_OPTION([$1], _LT_Option)]) +- +-m4_if([$1],[LT_INIT],[ +- dnl +- dnl Simply set some default values (i.e off) if boolean options were not +- dnl specified: +- _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no +- ]) +- _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no +- ]) +- dnl +- dnl If no reference was made to various pairs of opposing options, then +- dnl we run the default mode handler for the pair. For example, if neither +- dnl `shared' nor `disable-shared' was passed, we enable building of shared +- dnl archives by default: +- _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) +- _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) +- _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) +- _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], +- [_LT_ENABLE_FAST_INSTALL]) +- ]) +-])# _LT_SET_OPTIONS +- +- +- +-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +-# ----------------------------------------- +-m4_define([_LT_MANGLE_DEFUN], +-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) +- +- +-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +-# ----------------------------------------------- +-m4_define([LT_OPTION_DEFINE], +-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +-])# LT_OPTION_DEFINE +- +- +-# dlopen +-# ------ +-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +-]) +- +-AU_DEFUN([AC_LIBTOOL_DLOPEN], +-[_LT_SET_OPTION([LT_INIT], [dlopen]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `dlopen' option into LT_INIT's first parameter.]) +-]) +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) +- +- +-# win32-dll +-# --------- +-# Declare package support for building win32 dll's. +-LT_OPTION_DEFINE([LT_INIT], [win32-dll], +-[enable_win32_dll=yes +- +-case $host in +-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) +- AC_CHECK_TOOL(AS, as, false) +- AC_CHECK_TOOL(DLLTOOL, dlltool, false) +- AC_CHECK_TOOL(OBJDUMP, objdump, false) +- ;; +-esac +- +-test -z "$AS" && AS=as +-_LT_DECL([], [AS], [0], [Assembler program])dnl +- +-test -z "$DLLTOOL" && DLLTOOL=dlltool +-_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl +- +-test -z "$OBJDUMP" && OBJDUMP=objdump +-_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +-])# win32-dll +- +-AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +-[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-_LT_SET_OPTION([LT_INIT], [win32-dll]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `win32-dll' option into LT_INIT's first parameter.]) +-]) +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) +- +- +-# _LT_ENABLE_SHARED([DEFAULT]) +-# ---------------------------- +-# implement the --enable-shared flag, and supports the `shared' and +-# `disable-shared' LT_INIT options. +-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +-m4_define([_LT_ENABLE_SHARED], +-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +-AC_ARG_ENABLE([shared], +- [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], +- [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], +- [p=${PACKAGE-default} +- case $enableval in +- yes) enable_shared=yes ;; +- no) enable_shared=no ;; +- *) +- enable_shared=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_shared=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac], +- [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) +- +- _LT_DECL([build_libtool_libs], [enable_shared], [0], +- [Whether or not to build shared libraries]) +-])# _LT_ENABLE_SHARED +- +-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) +- +-# Old names: +-AC_DEFUN([AC_ENABLE_SHARED], +-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +-]) +- +-AC_DEFUN([AC_DISABLE_SHARED], +-[_LT_SET_OPTION([LT_INIT], [disable-shared]) +-]) +- +-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AM_ENABLE_SHARED], []) +-dnl AC_DEFUN([AM_DISABLE_SHARED], []) +- +- +- +-# _LT_ENABLE_STATIC([DEFAULT]) +-# ---------------------------- +-# implement the --enable-static flag, and support the `static' and +-# `disable-static' LT_INIT options. +-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +-m4_define([_LT_ENABLE_STATIC], +-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +-AC_ARG_ENABLE([static], +- [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], +- [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], +- [p=${PACKAGE-default} +- case $enableval in +- yes) enable_static=yes ;; +- no) enable_static=no ;; +- *) +- enable_static=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_static=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac], +- [enable_static=]_LT_ENABLE_STATIC_DEFAULT) +- +- _LT_DECL([build_old_libs], [enable_static], [0], +- [Whether or not to build static libraries]) +-])# _LT_ENABLE_STATIC +- +-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) +- +-# Old names: +-AC_DEFUN([AC_ENABLE_STATIC], +-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +-]) +- +-AC_DEFUN([AC_DISABLE_STATIC], +-[_LT_SET_OPTION([LT_INIT], [disable-static]) +-]) +- +-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AM_ENABLE_STATIC], []) +-dnl AC_DEFUN([AM_DISABLE_STATIC], []) +- +- +- +-# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +-# ---------------------------------- +-# implement the --enable-fast-install flag, and support the `fast-install' +-# and `disable-fast-install' LT_INIT options. +-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +-m4_define([_LT_ENABLE_FAST_INSTALL], +-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +-AC_ARG_ENABLE([fast-install], +- [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], +- [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], +- [p=${PACKAGE-default} +- case $enableval in +- yes) enable_fast_install=yes ;; +- no) enable_fast_install=no ;; +- *) +- enable_fast_install=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_fast_install=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac], +- [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) +- +-_LT_DECL([fast_install], [enable_fast_install], [0], +- [Whether or not to optimize for fast installation])dnl +-])# _LT_ENABLE_FAST_INSTALL +- +-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) +- +-# Old names: +-AU_DEFUN([AC_ENABLE_FAST_INSTALL], +-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you put +-the `fast-install' option into LT_INIT's first parameter.]) +-]) +- +-AU_DEFUN([AC_DISABLE_FAST_INSTALL], +-[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you put +-the `disable-fast-install' option into LT_INIT's first parameter.]) +-]) +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) +- +- +-# _LT_WITH_PIC([MODE]) +-# -------------------- +-# implement the --with-pic flag, and support the `pic-only' and `no-pic' +-# LT_INIT options. +-# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +-m4_define([_LT_WITH_PIC], +-[AC_ARG_WITH([pic], +- [AS_HELP_STRING([--with-pic], +- [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], +- [pic_mode="$withval"], +- [pic_mode=default]) +- +-test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) +- +-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +-])# _LT_WITH_PIC +- +-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) +- +-# Old name: +-AU_DEFUN([AC_LIBTOOL_PICMODE], +-[_LT_SET_OPTION([LT_INIT], [pic-only]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `pic-only' option into LT_INIT's first parameter.]) +-]) +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) +- +- +-m4_define([_LTDL_MODE], []) +-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], +- [m4_define([_LTDL_MODE], [nonrecursive])]) +-LT_OPTION_DEFINE([LTDL_INIT], [recursive], +- [m4_define([_LTDL_MODE], [recursive])]) +-LT_OPTION_DEFINE([LTDL_INIT], [subproject], +- [m4_define([_LTDL_MODE], [subproject])]) +- +-m4_define([_LTDL_TYPE], []) +-LT_OPTION_DEFINE([LTDL_INIT], [installable], +- [m4_define([_LTDL_TYPE], [installable])]) +-LT_OPTION_DEFINE([LTDL_INIT], [convenience], +- [m4_define([_LTDL_TYPE], [convenience])]) +- +-# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +-# +-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +-# Written by Gary V. Vaughan, 2004 +-# +-# This file is free software; the Free Software Foundation gives +-# unlimited permission to copy and/or distribute it, with or without +-# modifications, as long as this notice is preserved. +- +-# serial 6 ltsugar.m4 +- +-# This is to help aclocal find these macros, as it can't see m4_define. +-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) +- +- +-# lt_join(SEP, ARG1, [ARG2...]) +-# ----------------------------- +-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +-# associated separator. +-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +-# versions in m4sugar had bugs. +-m4_define([lt_join], +-[m4_if([$#], [1], [], +- [$#], [2], [[$2]], +- [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +-m4_define([_lt_join], +-[m4_if([$#$2], [2], [], +- [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) +- +- +-# lt_car(LIST) +-# lt_cdr(LIST) +-# ------------ +-# Manipulate m4 lists. +-# These macros are necessary as long as will still need to support +-# Autoconf-2.59 which quotes differently. +-m4_define([lt_car], [[$1]]) +-m4_define([lt_cdr], +-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], +- [$#], 1, [], +- [m4_dquote(m4_shift($@))])]) +-m4_define([lt_unquote], $1) +- +- +-# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +-# ------------------------------------------ +-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +-# Note that neither SEPARATOR nor STRING are expanded; they are appended +-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +-# No SEPARATOR is output if MACRO-NAME was previously undefined (different +-# than defined and empty). +-# +-# This macro is needed until we can rely on Autoconf 2.62, since earlier +-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +-m4_define([lt_append], +-[m4_define([$1], +- m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) +- +- +- +-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +-# ---------------------------------------------------------- +-# Produce a SEP delimited list of all paired combinations of elements of +-# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +-# has the form PREFIXmINFIXSUFFIXn. +-# Needed until we can rely on m4_combine added in Autoconf 2.62. +-m4_define([lt_combine], +-[m4_if(m4_eval([$# > 3]), [1], +- [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +-[[m4_foreach([_Lt_prefix], [$2], +- [m4_foreach([_Lt_suffix], +- ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, +- [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) +- +- +-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +-# ----------------------------------------------------------------------- +-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +-m4_define([lt_if_append_uniq], +-[m4_ifdef([$1], +- [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], +- [lt_append([$1], [$2], [$3])$4], +- [$5])], +- [lt_append([$1], [$2], [$3])$4])]) +- +- +-# lt_dict_add(DICT, KEY, VALUE) +-# ----------------------------- +-m4_define([lt_dict_add], +-[m4_define([$1($2)], [$3])]) +- +- +-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +-# -------------------------------------------- +-m4_define([lt_dict_add_subkey], +-[m4_define([$1($2:$3)], [$4])]) +- +- +-# lt_dict_fetch(DICT, KEY, [SUBKEY]) +-# ---------------------------------- +-m4_define([lt_dict_fetch], +-[m4_ifval([$3], +- m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), +- m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) +- +- +-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +-# ----------------------------------------------------------------- +-m4_define([lt_if_dict_fetch], +-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], +- [$5], +- [$6])]) +- +- +-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +-# -------------------------------------------------------------- +-m4_define([lt_dict_filter], +-[m4_if([$5], [], [], +- [lt_join(m4_quote(m4_default([$4], [[, ]])), +- lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), +- [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +-]) +- +-# ltversion.m4 -- version numbers -*- Autoconf -*- +-# +-# Copyright (C) 2004 Free Software Foundation, Inc. +-# Written by Scott James Remnant, 2004 +-# +-# This file is free software; the Free Software Foundation gives +-# unlimited permission to copy and/or distribute it, with or without +-# modifications, as long as this notice is preserved. +- +-# Generated from ltversion.in. +- +-# serial 3017 ltversion.m4 +-# This file is part of GNU Libtool +- +-m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +-m4_define([LT_PACKAGE_REVISION], [1.3017]) +- +-AC_DEFUN([LTVERSION_VERSION], +-[macro_version='2.2.6b' +-macro_revision='1.3017' +-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +-_LT_DECL(, macro_revision, 0) +-]) +- +-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +-# +-# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +-# Written by Scott James Remnant, 2004. +-# +-# This file is free software; the Free Software Foundation gives +-# unlimited permission to copy and/or distribute it, with or without +-# modifications, as long as this notice is preserved. +- +-# serial 4 lt~obsolete.m4 +- +-# These exist entirely to fool aclocal when bootstrapping libtool. +-# +-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +-# which have later been changed to m4_define as they aren't part of the +-# exported API, or moved to Autoconf or Automake where they belong. +-# +-# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +-# using a macro with the same name in our local m4/libtool.m4 it'll +-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +-# and doesn't know about Autoconf macros at all.) +-# +-# So we provide this file, which has a silly filename so it's always +-# included after everything else. This provides aclocal with the +-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +-# because those macros already exist, or will be overwritten later. +-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +-# +-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +-# Yes, that means every name once taken will need to remain here until +-# we give up compatibility with versions before 1.7, at which point +-# we need to keep only those names which we still refer to. +- +-# This is to help aclocal find these macros, as it can't see m4_define. +-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) +- +-m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +-m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +-m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +-m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +-m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +-m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +-m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +-m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +-m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +-m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +-m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +-m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +-m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +-m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +-m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +-m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +-m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +-m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +-m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +-m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +-m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +-m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +-m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +-m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +-m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +-m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +-m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +-m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +-m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +-m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +-m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +-m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +-m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +-m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +-m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +- +-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ++# Copyright (C) 2002-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # AM_AUTOMAKE_VERSION(VERSION) + # ---------------------------- + # Automake X.Y traces this macro to ensure aclocal.m4 has been + # generated from the m4 files accompanying Automake X.Y. + # (This private macro should not be called outside this file.) + AC_DEFUN([AM_AUTOMAKE_VERSION], +-[am__api_version='1.11' ++[am__api_version='1.13' + dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to + dnl require some minimum version. Point them to the right macro. +-m4_if([$1], [1.11.1], [], ++m4_if([$1], [1.13.4], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl + ]) + + # _AM_AUTOCONF_VERSION(VERSION) + # ----------------------------- + # aclocal traces this macro to find the Autoconf version. + # This is a private macro too. Using m4_define simplifies + # the logic in aclocal, which can simply ignore this definition. + m4_define([_AM_AUTOCONF_VERSION], []) + + # AM_SET_CURRENT_AUTOMAKE_VERSION + # ------------------------------- + # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. + # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. + AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +-[AM_AUTOMAKE_VERSION([1.11.1])dnl ++[AM_AUTOMAKE_VERSION([1.13.4])dnl + m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl + _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + + # Figure out how to run the assembler. -*- Autoconf -*- + +-# Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ++# Copyright (C) 2001-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 5 +- + # AM_PROG_AS + # ---------- + AC_DEFUN([AM_PROG_AS], + [# By default we simply use the C compiler to build assembly code. + AC_REQUIRE([AC_PROG_CC]) + test "${CCAS+set}" = set || CCAS=$CC + test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS + AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) + AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) + _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl + ]) + + # AM_AUX_DIR_EXPAND -*- Autoconf -*- + +-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# Copyright (C) 2001-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +-# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +-# `$srcdir', `$srcdir/..', or `$srcdir/../..'. ++# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to ++# '$srcdir', '$srcdir/..', or '$srcdir/../..'. + # + # Of course, Automake must honor this variable whenever it calls a + # tool from the auxiliary directory. The problem is that $srcdir (and + # therefore $ac_aux_dir as well) can be either absolute or relative, + # depending on how configure is run. This is pretty annoying, since + # it makes $ac_aux_dir quite unusable in subdirectories: in the top + # source directory, any form will work fine, but in subdirectories a + # relative path needs to be adjusted first. +@@ -8861,17 +918,17 @@ AC_ARG_VAR([CCASFLAGS], [assembler compi + # fails when called from a subdirectory if $ac_aux_dir is relative + # $top_srcdir/$ac_aux_dir/missing + # fails if $ac_aux_dir is absolute, + # fails when called from a subdirectory in a VPATH build with + # a relative $ac_aux_dir + # + # The reason of the latter failure is that $top_srcdir and $ac_aux_dir + # are both prefixed by $srcdir. In an in-source build this is usually +-# harmless because $srcdir is `.', but things will broke when you ++# harmless because $srcdir is '.', but things will broke when you + # start a VPATH build or use an absolute $srcdir. + # + # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, + # iff we strip the leading $srcdir from $ac_aux_dir. That would be: + # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` + # and then we would define $MISSING as + # MISSING="\${SHELL} $am_aux_dir/missing" + # This will work as long as MISSING is not called from configure, because +@@ -8887,32 +944,29 @@ AC_DEFUN([AM_AUX_DIR_EXPAND], + [dnl Rely on autoconf to set up CDPATH properly. + AC_PREREQ([2.50])dnl + # expand $ac_aux_dir to an absolute path + am_aux_dir=`cd $ac_aux_dir && pwd` + ]) + + # AM_CONDITIONAL -*- Autoconf -*- + +-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +-# Free Software Foundation, Inc. ++# Copyright (C) 1997-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 9 +- + # AM_CONDITIONAL(NAME, SHELL-CONDITION) + # ------------------------------------- + # Define a conditional. + AC_DEFUN([AM_CONDITIONAL], +-[AC_PREREQ(2.52)dnl +- ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], +- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl ++[AC_PREREQ([2.52])dnl ++ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], ++ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl + AC_SUBST([$1_TRUE])dnl + AC_SUBST([$1_FALSE])dnl + _AM_SUBST_NOTMAKE([$1_TRUE])dnl + _AM_SUBST_NOTMAKE([$1_FALSE])dnl + m4_define([_AM_COND_VALUE_$1], [$2])dnl + if $2; then + $1_TRUE= + $1_FALSE='#' +@@ -8921,63 +975,63 @@ else + $1_FALSE= + fi + AC_CONFIG_COMMANDS_PRE( + [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. + Usually this means the macro was only invoked conditionally.]]) + fi])]) + +-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +-# Free Software Foundation, Inc. ++# Copyright (C) 1999-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 10 + +-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be ++# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be + # written in clear, in which case automake, when reading aclocal.m4, + # will think it sees a *use*, and therefore will trigger all it's + # C support machinery. Also note that it means that autoscan, seeing + # CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + # _AM_DEPENDENCIES(NAME) + # ---------------------- + # See how the compiler implements dependency checking. +-# NAME is "CC", "CXX", "GCJ", or "OBJC". ++# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". + # We try a few techniques and use that to set a single cache variable. + # + # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was + # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular + # dependency, and given that the user is not expected to run this macro, + # just rely on AC_PROG_CC. + AC_DEFUN([_AM_DEPENDENCIES], + [AC_REQUIRE([AM_SET_DEPDIR])dnl + AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl + AC_REQUIRE([AM_MAKE_INCLUDE])dnl + AC_REQUIRE([AM_DEP_TRACK])dnl + +-ifelse([$1], CC, [depcc="$CC" am_compiler_list=], +- [$1], CXX, [depcc="$CXX" am_compiler_list=], +- [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], +- [$1], UPC, [depcc="$UPC" am_compiler_list=], +- [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], +- [depcc="$$1" am_compiler_list=]) ++m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], ++ [$1], [CXX], [depcc="$CXX" am_compiler_list=], ++ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], ++ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], ++ [$1], [UPC], [depcc="$UPC" am_compiler_list=], ++ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], ++ [depcc="$$1" am_compiler_list=]) + + AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], + [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up +- # making a dummy file named `D' -- because `-MD' means `put the output +- # in D'. ++ # making a dummy file named 'D' -- because '-MD' means "put the output ++ # in D". ++ rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a +@@ -9006,44 +1060,44 @@ AC_CACHE_CHECK([dependency style of $dep + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c +- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with +- # Solaris 8's {/usr,}/bin/sh. +- touch sub/conftst$i.h ++ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with ++ # Solaris 10 /bin/sh. ++ echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + +- # We check with `-c' and `-o' for the sake of the "dashmstdout" ++ # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly +- # handle `-M -o', and we need to detect this. Also, some Intel +- # versions had trouble with output in subdirs ++ # handle '-M -o', and we need to detect this. Also, some Intel ++ # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) +- # after this tag, mechanisms are not by side-effect, so they'll +- # only be used when explicitly requested ++ # After this tag, mechanisms are not by side-effect, so they'll ++ # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; +- msvisualcpp | msvcmsys) +- # This compiler won't grok `-c -o', but also, the minuso test has ++ msvc7 | msvc7msys | msvisualcpp | msvcmsys) ++ # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ +@@ -9081,93 +1135,96 @@ AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) + ]) + + + # AM_SET_DEPDIR + # ------------- + # Choose a directory name for dependency files. +-# This macro is AC_REQUIREd in _AM_DEPENDENCIES ++# This macro is AC_REQUIREd in _AM_DEPENDENCIES. + AC_DEFUN([AM_SET_DEPDIR], + [AC_REQUIRE([AM_SET_LEADING_DOT])dnl + AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl + ]) + + + # AM_DEP_TRACK + # ------------ + AC_DEFUN([AM_DEP_TRACK], +-[AC_ARG_ENABLE(dependency-tracking, +-[ --disable-dependency-tracking speeds up one-time build +- --enable-dependency-tracking do not reject slow dependency extractors]) ++[AC_ARG_ENABLE([dependency-tracking], [dnl ++AS_HELP_STRING( ++ [--enable-dependency-tracking], ++ [do not reject slow dependency extractors]) ++AS_HELP_STRING( ++ [--disable-dependency-tracking], ++ [speeds up one-time build])]) + if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' ++ am__nodep='_no' + fi + AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) + AC_SUBST([AMDEPBACKSLASH])dnl + _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ++AC_SUBST([am__nodep])dnl ++_AM_SUBST_NOTMAKE([am__nodep])dnl + ]) + + # Generate code to set up dependency tracking. -*- Autoconf -*- + +-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +-# Free Software Foundation, Inc. ++# Copyright (C) 1999-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-#serial 5 + + # _AM_OUTPUT_DEPENDENCY_COMMANDS + # ------------------------------ + AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], + [{ +- # Autoconf 2.62 quotes --file arguments for eval, but not when files ++ # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. +- # We used to match only the files named `Makefile.in', but ++ # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote +- # from the Makefile without running `make'. ++ # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` +- test -z "am__include" && continue ++ test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` +- # When using ansi2knr, U may be empty or an underscore; expand it +- U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ +- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do ++ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +@@ -9175,51 +1232,48 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS + ])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + + # AM_OUTPUT_DEPENDENCY_COMMANDS + # ----------------------------- + # This macro should only be invoked once -- use via AC_REQUIRE. + # + # This code is only required when automatic dependency tracking +-# is enabled. FIXME. This creates each `.P' file that we will ++# is enabled. FIXME. This creates each '.P' file that we will + # need in order to bootstrap the dependency handling code. + AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], + [AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) + ]) + + # Do all the work for Automake. -*- Autoconf -*- + +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. ++# Copyright (C) 1996-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 16 +- + # This macro actually does too much. Some checks are only needed if + # your package does certain things. But this isn't really a big deal. + + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) + # AM_INIT_AUTOMAKE([OPTIONS]) + # ----------------------------------------------- + # The call with PACKAGE and VERSION arguments is the old style + # call (pre autoconf-2.50), which is being phased out. PACKAGE + # and VERSION should now be passed to AC_INIT and removed from + # the call to AM_INIT_AUTOMAKE. + # We support both call styles for the transition. After + # the next Automake release, Autoconf can make the AC_INIT + # arguments mandatory, and then we can depend on a new Autoconf + # release and drop the old call support. + AC_DEFUN([AM_INIT_AUTOMAKE], +-[AC_PREREQ([2.62])dnl ++[AC_PREREQ([2.65])dnl + dnl Autoconf wants to disallow AM_ names. We explicitly allow + dnl the ones we care about. + m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." +@@ -9238,73 +1292,86 @@ if test -z "$CYGPATH_W"; then + CYGPATH_W=echo + fi + fi + AC_SUBST([CYGPATH_W]) + + # Define the identity of the package. + dnl Distinguish between old-style and new-style calls. + m4_ifval([$2], +-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl ++[AC_DIAGNOSE([obsolete], ++ [$0: two- and three-arguments forms are deprecated.]) ++m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], + [_AM_SET_OPTIONS([$1])dnl + dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, ++m4_if( ++ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), ++ [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + + _AM_IF_OPTION([no-define],, +-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl ++[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) ++ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + + # Some tools Automake needs. + AC_REQUIRE([AM_SANITY_CHECK])dnl + AC_REQUIRE([AC_ARG_PROGRAM])dnl +-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +-AM_MISSING_PROG(AUTOCONF, autoconf) +-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +-AM_MISSING_PROG(AUTOHEADER, autoheader) +-AM_MISSING_PROG(MAKEINFO, makeinfo) ++AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) ++AM_MISSING_PROG([AUTOCONF], [autoconf]) ++AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) ++AM_MISSING_PROG([AUTOHEADER], [autoheader]) ++AM_MISSING_PROG([MAKEINFO], [makeinfo]) + AC_REQUIRE([AM_PROG_INSTALL_SH])dnl + AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +-AC_REQUIRE([AM_PROG_MKDIR_P])dnl ++AC_REQUIRE([AC_PROG_MKDIR_P])dnl ++# For better backward compatibility. To be removed once Automake 1.9.x ++# dies out for good. For more background, see: ++# ++# ++AC_SUBST([mkdir_p], ['$(MKDIR_P)']) + # We need awk for the "check" target. The system "awk" is bad on + # some platforms. + AC_REQUIRE([AC_PROG_AWK])dnl + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AM_SET_LEADING_DOT])dnl + _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) + _AM_IF_OPTION([no-dependencies],, + [AC_PROVIDE_IFELSE([AC_PROG_CC], +- [_AM_DEPENDENCIES(CC)], +- [define([AC_PROG_CC], +- defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl ++ [_AM_DEPENDENCIES([CC])], ++ [m4_define([AC_PROG_CC], ++ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl + AC_PROVIDE_IFELSE([AC_PROG_CXX], +- [_AM_DEPENDENCIES(CXX)], +- [define([AC_PROG_CXX], +- defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ++ [_AM_DEPENDENCIES([CXX])], ++ [m4_define([AC_PROG_CXX], ++ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl + AC_PROVIDE_IFELSE([AC_PROG_OBJC], +- [_AM_DEPENDENCIES(OBJC)], +- [define([AC_PROG_OBJC], +- defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ++ [_AM_DEPENDENCIES([OBJC])], ++ [m4_define([AC_PROG_OBJC], ++ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl ++AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], ++ [_AM_DEPENDENCIES([OBJCXX])], ++ [m4_define([AC_PROG_OBJCXX], ++ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl + ]) +-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. ++AC_REQUIRE([AM_SILENT_RULES])dnl ++dnl The testsuite driver may need to know about EXEEXT, so add the ++dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This ++dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. + AC_CONFIG_COMMANDS_PRE(dnl + [m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + ]) + +-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not ++dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not + dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further + dnl mangled by Autoconf and run in a shell conditional statement. + m4_define([_AC_COMPILER_EXEEXT], + m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + + # When config.status generates a header, we must update the stamp-h file. + # This file resides in the same directory as the config header +@@ -9322,17 +1389,17 @@ for _am_header in $config_headers :; do + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac + done + echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +-# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. ++# Copyright (C) 2001-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # AM_PROG_INSTALL_SH + # ------------------ + # Define $install_sh. +@@ -9341,89 +1408,81 @@ AC_DEFUN([AM_PROG_INSTALL_SH], + if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac + fi +-AC_SUBST(install_sh)]) ++AC_SUBST([install_sh])]) + +-# Copyright (C) 2003, 2005 Free Software Foundation, Inc. ++# Copyright (C) 2003-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 2 +- + # Check whether the underlying file-system supports filenames + # with a leading dot. For instance MS-DOS doesn't. + AC_DEFUN([AM_SET_LEADING_DOT], + [rm -rf .tst 2>/dev/null + mkdir .tst 2>/dev/null + if test -d .tst; then + am__leading_dot=. + else + am__leading_dot=_ + fi + rmdir .tst 2>/dev/null + AC_SUBST([am__leading_dot])]) + + # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- + # From Jim Meyering + +-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +-# Free Software Foundation, Inc. ++# Copyright (C) 1996-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 5 +- + # AM_MAINTAINER_MODE([DEFAULT-MODE]) + # ---------------------------------- + # Control maintainer-specific portions of Makefiles. +-# Default is to disable them, unless `enable' is passed literally. +-# For symmetry, `disable' may be passed as well. Anyway, the user ++# Default is to disable them, unless 'enable' is passed literally. ++# For symmetry, 'disable' may be passed as well. Anyway, the user + # can override the default with the --enable/--disable switch. + AC_DEFUN([AM_MAINTAINER_MODE], + [m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +-AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles]) ++AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], +-[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful +- (and sometimes confusing) to the casual installer], +- [USE_MAINTAINER_MODE=$enableval], +- [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) ++ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], ++ am_maintainer_other[ make rules and dependencies not useful ++ (and sometimes confusing) to the casual installer])], ++ [USE_MAINTAINER_MODE=$enableval], ++ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl + ] + ) + +-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) +- + # Check to see how 'make' treats includes. -*- Autoconf -*- + +-# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. ++# Copyright (C) 2001-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 4 +- + # AM_MAKE_INCLUDE() + # ----------------- + # Check to see how make treats includes. + AC_DEFUN([AM_MAKE_INCLUDE], + [am_make=${MAKE-make} + cat > confinc << 'END' + am__doit: + @echo this is the am__doit target +@@ -9431,17 +1490,17 @@ am__doit: + END + # If we don't find an include directive, just comment out the code. + AC_MSG_CHECKING([for style of include used by $am_make]) + am__include="#" + am__quote= + _am_result=none + # First try GNU make style include. + echo "include confinc" > confmf +-# Ignore all kinds of additional output from `make'. ++# Ignore all kinds of additional output from 'make'. + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; + esac + # Now try BSD make style include. +@@ -9456,25 +1515,22 @@ if test "$am__include" = "#"; then + esac + fi + AC_SUBST([am__include]) + AC_SUBST([am__quote]) + AC_MSG_RESULT([$_am_result]) + rm -f confinc confmf + ]) + +-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 +-# Free Software Foundation, Inc. ++# Copyright (C) 1999-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 6 +- + # AM_PROG_CC_C_O + # -------------- + # Like AC_PROG_CC_C_O, but changed for automake. + AC_DEFUN([AM_PROG_CC_C_O], + [AC_REQUIRE([AC_PROG_CC_C_O])dnl + AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl + AC_REQUIRE_AUX_FILE([compile])dnl + # FIXME: we rely on the cache variable name because +@@ -9493,317 +1549,413 @@ fi + dnl Make sure AC_PROG_CC is never called again, or it will override our + dnl setting of CC. + m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) + ]) + + # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +-# Free Software Foundation, Inc. ++# Copyright (C) 1997-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 6 +- + # AM_MISSING_PROG(NAME, PROGRAM) + # ------------------------------ + AC_DEFUN([AM_MISSING_PROG], + [AC_REQUIRE([AM_MISSING_HAS_RUN]) + $1=${$1-"${am_missing_run}$2"} + AC_SUBST($1)]) + +- + # AM_MISSING_HAS_RUN + # ------------------ +-# Define MISSING if not defined so far and test if it supports --run. +-# If it does, set am_missing_run to use it, otherwise, to nothing. ++# Define MISSING if not defined so far and test if it is modern enough. ++# If it is, set am_missing_run to use it, otherwise, to nothing. + AC_DEFUN([AM_MISSING_HAS_RUN], + [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl + AC_REQUIRE_AUX_FILE([missing])dnl + if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac + fi + # Use eval to expand $SHELL +-if eval "$MISSING --run true"; then +- am_missing_run="$MISSING --run " ++if eval "$MISSING --is-lightweight"; then ++ am_missing_run="$MISSING " + else + am_missing_run= +- AC_MSG_WARN([`missing' script is too old or missing]) ++ AC_MSG_WARN(['missing' script is too old or missing]) + fi + ]) + +-# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ++# Helper functions for option handling. -*- Autoconf -*- ++ ++# Copyright (C) 2001-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# AM_PROG_MKDIR_P +-# --------------- +-# Check for `mkdir -p'. +-AC_DEFUN([AM_PROG_MKDIR_P], +-[AC_PREREQ([2.60])dnl +-AC_REQUIRE([AC_PROG_MKDIR_P])dnl +-dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +-dnl while keeping a definition of mkdir_p for backward compatibility. +-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +-dnl Makefile.ins that do not define MKDIR_P, so we do our own +-dnl adjustment using top_builddir (which is defined more often than +-dnl MKDIR_P). +-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +-case $mkdir_p in +- [[\\/$]]* | ?:[[\\/]]*) ;; +- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +-esac +-]) +- +-# Helper functions for option handling. -*- Autoconf -*- +- +-# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +-# +-# This file is free software; the Free Software Foundation +-# gives unlimited permission to copy and/or distribute it, +-# with or without modifications, as long as this notice is preserved. +- +-# serial 4 +- + # _AM_MANGLE_OPTION(NAME) + # ----------------------- + AC_DEFUN([_AM_MANGLE_OPTION], + [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + + # _AM_SET_OPTION(NAME) +-# ------------------------------ ++# -------------------- + # Set option NAME. Presently that only means defining a flag for this option. + AC_DEFUN([_AM_SET_OPTION], +-[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) ++[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + + # _AM_SET_OPTIONS(OPTIONS) +-# ---------------------------------- ++# ------------------------ + # OPTIONS is a space-separated list of Automake options. + AC_DEFUN([_AM_SET_OPTIONS], + [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + + # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) + # ------------------------------------------- + # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. + AC_DEFUN([_AM_IF_OPTION], + [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + + # Check to make sure that the build environment is sane. -*- Autoconf -*- + +-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +-# Free Software Foundation, Inc. ++# Copyright (C) 1996-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 5 +- + # AM_SANITY_CHECK + # --------------- + AC_DEFUN([AM_SANITY_CHECK], + [AC_MSG_CHECKING([whether build environment is sane]) +-# Just in case +-sleep 1 +-echo timestamp > conftest.file + # Reject unsafe characters in $srcdir or the absolute working directory + # name. Accept space and tab only in the latter. + am_lf=' + ' + case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; + esac + case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) +- AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; ++ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; + esac + +-# Do `set' in a subshell so we don't clobber the current shell's ++# Do 'set' in a subshell so we don't clobber the current shell's + # arguments. Must try -L first in case configure is actually a + # symlink; some systems play weird games with the mod time of symlinks + # (eg FreeBSD returns the mod time of the symlink's containing + # directory). + if ( +- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` +- if test "$[*]" = "X"; then +- # -L didn't work. +- set X `ls -t "$srcdir/configure" conftest.file` +- fi +- rm -f conftest.file +- if test "$[*]" != "X $srcdir/configure conftest.file" \ +- && test "$[*]" != "X conftest.file $srcdir/configure"; then ++ am_has_slept=no ++ for am_try in 1 2; do ++ echo "timestamp, slept: $am_has_slept" > conftest.file ++ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` ++ if test "$[*]" = "X"; then ++ # -L didn't work. ++ set X `ls -t "$srcdir/configure" conftest.file` ++ fi ++ if test "$[*]" != "X $srcdir/configure conftest.file" \ ++ && test "$[*]" != "X conftest.file $srcdir/configure"; then + +- # If neither matched, then we have a broken ls. This can happen +- # if, for instance, CONFIG_SHELL is bash and it inherits a +- # broken ls alias from the environment. This has actually +- # happened. Such a system could not be considered "sane". +- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +-alias in your environment]) +- fi +- ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken ++ alias in your environment]) ++ fi ++ if test "$[2]" = conftest.file || test $am_try -eq 2; then ++ break ++ fi ++ # Just in case. ++ sleep 1 ++ am_has_slept=yes ++ done + test "$[2]" = conftest.file + ) + then + # Ok. + : + else + AC_MSG_ERROR([newly created file is older than distributed files! + Check your system clock]) + fi +-AC_MSG_RESULT(yes)]) ++AC_MSG_RESULT([yes]) ++# If we didn't sleep, we still need to ensure time stamps of config.status and ++# generated files are strictly newer. ++am_sleep_pid= ++if grep 'slept: no' conftest.file >/dev/null 2>&1; then ++ ( sleep 1 ) & ++ am_sleep_pid=$! ++fi ++AC_CONFIG_COMMANDS_PRE( ++ [AC_MSG_CHECKING([that generated files are newer than configure]) ++ if test -n "$am_sleep_pid"; then ++ # Hide warnings about reused PIDs. ++ wait $am_sleep_pid 2>/dev/null ++ fi ++ AC_MSG_RESULT([done])]) ++rm -f conftest.file ++]) + +-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# Copyright (C) 2009-2013 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# AM_SILENT_RULES([DEFAULT]) ++# -------------------------- ++# Enable less verbose build rules; with the default set to DEFAULT ++# ("yes" being less verbose, "no" or empty being verbose). ++AC_DEFUN([AM_SILENT_RULES], ++[AC_ARG_ENABLE([silent-rules], [dnl ++AS_HELP_STRING( ++ [--enable-silent-rules], ++ [less verbose build output (undo: "make V=1")]) ++AS_HELP_STRING( ++ [--disable-silent-rules], ++ [verbose build output (undo: "make V=0")])dnl ++]) ++case $enable_silent_rules in @%:@ ((( ++ yes) AM_DEFAULT_VERBOSITY=0;; ++ no) AM_DEFAULT_VERBOSITY=1;; ++ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; ++esac ++dnl ++dnl A few 'make' implementations (e.g., NonStop OS and NextStep) ++dnl do not support nested variable expansions. ++dnl See automake bug#9928 and bug#10237. ++am_make=${MAKE-make} ++AC_CACHE_CHECK([whether $am_make supports nested variables], ++ [am_cv_make_support_nested_variables], ++ [if AS_ECHO([['TRUE=$(BAR$(V)) ++BAR0=false ++BAR1=true ++V=1 ++am__doit: ++ @$(TRUE) ++.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then ++ am_cv_make_support_nested_variables=yes ++else ++ am_cv_make_support_nested_variables=no ++fi]) ++if test $am_cv_make_support_nested_variables = yes; then ++ dnl Using '$V' instead of '$(V)' breaks IRIX make. ++ AM_V='$(V)' ++ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' ++else ++ AM_V=$AM_DEFAULT_VERBOSITY ++ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY ++fi ++AC_SUBST([AM_V])dnl ++AM_SUBST_NOTMAKE([AM_V])dnl ++AC_SUBST([AM_DEFAULT_V])dnl ++AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl ++AC_SUBST([AM_DEFAULT_VERBOSITY])dnl ++AM_BACKSLASH='\' ++AC_SUBST([AM_BACKSLASH])dnl ++_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ++]) ++ ++# Copyright (C) 2001-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # AM_PROG_INSTALL_STRIP + # --------------------- +-# One issue with vendor `install' (even GNU) is that you can't ++# One issue with vendor 'install' (even GNU) is that you can't + # specify the program used to strip binaries. This is especially + # annoying in cross-compiling environments, where the build's strip + # is unlikely to handle the host's binaries. + # Fortunately install-sh will honor a STRIPPROG variable, so we +-# always use install-sh in `make install-strip', and initialize ++# always use install-sh in "make install-strip", and initialize + # STRIPPROG with the value of the STRIP variable (set by the user). + AC_DEFUN([AM_PROG_INSTALL_STRIP], + [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +-# Installed binaries are usually stripped using `strip' when the user +-# run `make install-strip'. However `strip' might not be the right ++# Installed binaries are usually stripped using 'strip' when the user ++# run "make install-strip". However 'strip' might not be the right + # tool to use in cross-compilation environments, therefore Automake +-# will honor the `STRIP' environment variable to overrule this program. +-dnl Don't test for $cross_compiling = yes, because it might be `maybe'. ++# will honor the 'STRIP' environment variable to overrule this program. ++dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. + if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) + fi + INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +-# Copyright (C) 2006, 2008 Free Software Foundation, Inc. ++# Copyright (C) 2006-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 2 +- + # _AM_SUBST_NOTMAKE(VARIABLE) + # --------------------------- + # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. + # This macro is traced by Automake. + AC_DEFUN([_AM_SUBST_NOTMAKE]) + + # AM_SUBST_NOTMAKE(VARIABLE) +-# --------------------------- ++# -------------------------- + # Public sister of _AM_SUBST_NOTMAKE. + AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + + # Check how to create a tarball. -*- Autoconf -*- + +-# Copyright (C) 2004, 2005 Free Software Foundation, Inc. ++# Copyright (C) 2004-2013 Free Software Foundation, Inc. + # + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + +-# serial 2 +- + # _AM_PROG_TAR(FORMAT) + # -------------------- + # Check how to create a tarball in format FORMAT. +-# FORMAT should be one of `v7', `ustar', or `pax'. ++# FORMAT should be one of 'v7', 'ustar', or 'pax'. + # + # Substitute a variable $(am__tar) that is a command + # writing to stdout a FORMAT-tarball containing the directory + # $tardir. + # tardir=directory && $(am__tar) > result.tar + # + # Substitute a variable $(am__untar) that extract such + # a tarball read from stdin. + # $(am__untar) < result.tar ++# + AC_DEFUN([_AM_PROG_TAR], +-[# Always define AMTAR for backward compatibility. +-AM_MISSING_PROG([AMTAR], [tar]) ++[# Always define AMTAR for backward compatibility. Yes, it's still used ++# in the wild :-( We should find a proper way to deprecate it ... ++AC_SUBST([AMTAR], ['$${TAR-tar}']) ++ ++# We'll loop over all known methods to create a tar archive until one works. ++_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' ++ + m4_if([$1], [v7], +- [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], +- [m4_case([$1], [ustar],, [pax],, +- [m4_fatal([Unknown tar format])]) +-AC_MSG_CHECKING([how to create a $1 tar archive]) +-# Loop over all known methods to create a tar archive until one works. +-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +-_am_tools=${am_cv_prog_tar_$1-$_am_tools} +-# Do not fold the above two line into one, because Tru64 sh and +-# Solaris sh will not grok spaces in the rhs of `-'. +-for _am_tool in $_am_tools +-do +- case $_am_tool in +- gnutar) +- for _am_tar in tar gnutar gtar; +- do +- AM_RUN_LOG([$_am_tar --version]) && break +- done +- am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' +- am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' +- am__untar="$_am_tar -xf -" +- ;; +- plaintar) +- # Must skip GNU tar: if it does not support --format= it doesn't create +- # ustar tarball either. +- (tar --version) >/dev/null 2>&1 && continue +- am__tar='tar chf - "$$tardir"' +- am__tar_='tar chf - "$tardir"' +- am__untar='tar xf -' +- ;; +- pax) +- am__tar='pax -L -x $1 -w "$$tardir"' +- am__tar_='pax -L -x $1 -w "$tardir"' +- am__untar='pax -r' +- ;; +- cpio) +- am__tar='find "$$tardir" -print | cpio -o -H $1 -L' +- am__tar_='find "$tardir" -print | cpio -o -H $1 -L' +- am__untar='cpio -i -H $1 -d' +- ;; +- none) +- am__tar=false +- am__tar_=false +- am__untar=false +- ;; +- esac ++ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + +- # If the value was cached, stop now. We just wanted to have am__tar +- # and am__untar set. +- test -n "${am_cv_prog_tar_$1}" && break ++ [m4_case([$1], ++ [ustar], ++ [# The POSIX 1988 'ustar' format is defined with fixed-size fields. ++ # There is notably a 21 bits limit for the UID and the GID. In fact, ++ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 ++ # and bug#13588). ++ am_max_uid=2097151 # 2^21 - 1 ++ am_max_gid=$am_max_uid ++ # The $UID and $GID variables are not portable, so we need to resort ++ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls ++ # below are definitely unexpected, so allow the users to see them ++ # (that is, avoid stderr redirection). ++ am_uid=`id -u || echo unknown` ++ am_gid=`id -g || echo unknown` ++ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) ++ if test $am_uid -le $am_max_uid; then ++ AC_MSG_RESULT([yes]) ++ else ++ AC_MSG_RESULT([no]) ++ _am_tools=none ++ fi ++ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) ++ if test $am_gid -le $am_max_gid; then ++ AC_MSG_RESULT([yes]) ++ else ++ AC_MSG_RESULT([no]) ++ _am_tools=none ++ fi], + +- # tar/untar a dummy directory, and stop if the command works ++ [pax], ++ [], ++ ++ [m4_fatal([Unknown tar format])]) ++ ++ AC_MSG_CHECKING([how to create a $1 tar archive]) ++ ++ # Go ahead even if we have the value already cached. We do so because we ++ # need to set the values for the 'am__tar' and 'am__untar' variables. ++ _am_tools=${am_cv_prog_tar_$1-$_am_tools} ++ ++ for _am_tool in $_am_tools; do ++ case $_am_tool in ++ gnutar) ++ for _am_tar in tar gnutar gtar; do ++ AM_RUN_LOG([$_am_tar --version]) && break ++ done ++ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' ++ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' ++ am__untar="$_am_tar -xf -" ++ ;; ++ plaintar) ++ # Must skip GNU tar: if it does not support --format= it doesn't create ++ # ustar tarball either. ++ (tar --version) >/dev/null 2>&1 && continue ++ am__tar='tar chf - "$$tardir"' ++ am__tar_='tar chf - "$tardir"' ++ am__untar='tar xf -' ++ ;; ++ pax) ++ am__tar='pax -L -x $1 -w "$$tardir"' ++ am__tar_='pax -L -x $1 -w "$tardir"' ++ am__untar='pax -r' ++ ;; ++ cpio) ++ am__tar='find "$$tardir" -print | cpio -o -H $1 -L' ++ am__tar_='find "$tardir" -print | cpio -o -H $1 -L' ++ am__untar='cpio -i -H $1 -d' ++ ;; ++ none) ++ am__tar=false ++ am__tar_=false ++ am__untar=false ++ ;; ++ esac ++ ++ # If the value was cached, stop now. We just wanted to have am__tar ++ # and am__untar set. ++ test -n "${am_cv_prog_tar_$1}" && break ++ ++ # tar/untar a dummy directory, and stop if the command works. ++ rm -rf conftest.dir ++ mkdir conftest.dir ++ echo GrepMe > conftest.dir/file ++ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) ++ rm -rf conftest.dir ++ if test -s conftest.tar; then ++ AM_RUN_LOG([$am__untar /dev/null 2>&1 && break ++ fi ++ done + rm -rf conftest.dir +- mkdir conftest.dir +- echo GrepMe > conftest.dir/file +- AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) +- rm -rf conftest.dir +- if test -s conftest.tar; then +- AM_RUN_LOG([$am__untar /dev/null 2>&1 && break +- fi +-done +-rm -rf conftest.dir + +-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +-AC_MSG_RESULT([$am_cv_prog_tar_$1])]) ++ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) ++ AC_MSG_RESULT([$am_cv_prog_tar_$1])]) ++ + AC_SUBST([am__tar]) + AC_SUBST([am__untar]) + ]) # _AM_PROG_TAR + ++m4_include([m4/asmcfi.m4]) ++m4_include([m4/ax_append_flag.m4]) ++m4_include([m4/ax_cc_maxopt.m4]) ++m4_include([m4/ax_cflags_warn_all.m4]) ++m4_include([m4/ax_check_compile_flag.m4]) ++m4_include([m4/ax_compiler_vendor.m4]) ++m4_include([m4/ax_configure_args.m4]) ++m4_include([m4/ax_enable_builddir.m4]) ++m4_include([m4/ax_gcc_archflag.m4]) ++m4_include([m4/ax_gcc_x86_cpuid.m4]) ++m4_include([m4/libtool.m4]) ++m4_include([m4/ltoptions.m4]) ++m4_include([m4/ltsugar.m4]) ++m4_include([m4/ltversion.m4]) ++m4_include([m4/lt~obsolete.m4]) + m4_include([acinclude.m4]) +diff --git a/js/src/ctypes/libffi/compile b/js/src/ctypes/libffi/compile +--- a/js/src/ctypes/libffi/compile ++++ b/js/src/ctypes/libffi/compile +@@ -1,78 +1,282 @@ + #! /bin/sh +-# Wrapper for compilers which do not understand `-c -o'. ++# Wrapper for compilers which do not understand '-c -o'. + +-scriptversion=2005-05-14.22 ++scriptversion=2012-10-14.11; # UTC + +-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. ++# Copyright (C) 1999-2013 Free Software Foundation, Inc. + # Written by Tom Tromey . + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2, or (at your option) + # any later version. + # + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ++# along with this program. If not, see . + + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # This file is maintained in Automake, please report + # bugs to or send patches to + # . + ++nl=' ++' ++ ++# We need space, tab and new line, in precisely that order. Quoting is ++# there to prevent tools from complaining about whitespace usage. ++IFS=" "" $nl" ++ ++file_conv= ++ ++# func_file_conv build_file lazy ++# Convert a $build file to $host form and store it in $file ++# Currently only supports Windows hosts. If the determined conversion ++# type is listed in (the comma separated) LAZY, no conversion will ++# take place. ++func_file_conv () ++{ ++ file=$1 ++ case $file in ++ / | /[!/]*) # absolute file, and not a UNC file ++ if test -z "$file_conv"; then ++ # lazily determine how to convert abs files ++ case `uname -s` in ++ MINGW*) ++ file_conv=mingw ++ ;; ++ CYGWIN*) ++ file_conv=cygwin ++ ;; ++ *) ++ file_conv=wine ++ ;; ++ esac ++ fi ++ case $file_conv/,$2, in ++ *,$file_conv,*) ++ ;; ++ mingw/*) ++ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ++ ;; ++ cygwin/*) ++ file=`cygpath -m "$file" || echo "$file"` ++ ;; ++ wine/*) ++ file=`winepath -w "$file" || echo "$file"` ++ ;; ++ esac ++ ;; ++ esac ++} ++ ++# func_cl_dashL linkdir ++# Make cl look for libraries in LINKDIR ++func_cl_dashL () ++{ ++ func_file_conv "$1" ++ if test -z "$lib_path"; then ++ lib_path=$file ++ else ++ lib_path="$lib_path;$file" ++ fi ++ linker_opts="$linker_opts -LIBPATH:$file" ++} ++ ++# func_cl_dashl library ++# Do a library search-path lookup for cl ++func_cl_dashl () ++{ ++ lib=$1 ++ found=no ++ save_IFS=$IFS ++ IFS=';' ++ for dir in $lib_path $LIB ++ do ++ IFS=$save_IFS ++ if $shared && test -f "$dir/$lib.dll.lib"; then ++ found=yes ++ lib=$dir/$lib.dll.lib ++ break ++ fi ++ if test -f "$dir/$lib.lib"; then ++ found=yes ++ lib=$dir/$lib.lib ++ break ++ fi ++ if test -f "$dir/lib$lib.a"; then ++ found=yes ++ lib=$dir/lib$lib.a ++ break ++ fi ++ done ++ IFS=$save_IFS ++ ++ if test "$found" != yes; then ++ lib=$lib.lib ++ fi ++} ++ ++# func_cl_wrapper cl arg... ++# Adjust compile command to suit cl ++func_cl_wrapper () ++{ ++ # Assume a capable shell ++ lib_path= ++ shared=: ++ linker_opts= ++ for arg ++ do ++ if test -n "$eat"; then ++ eat= ++ else ++ case $1 in ++ -o) ++ # configure might choose to run compile as 'compile cc -o foo foo.c'. ++ eat=1 ++ case $2 in ++ *.o | *.[oO][bB][jJ]) ++ func_file_conv "$2" ++ set x "$@" -Fo"$file" ++ shift ++ ;; ++ *) ++ func_file_conv "$2" ++ set x "$@" -Fe"$file" ++ shift ++ ;; ++ esac ++ ;; ++ -I) ++ eat=1 ++ func_file_conv "$2" mingw ++ set x "$@" -I"$file" ++ shift ++ ;; ++ -I*) ++ func_file_conv "${1#-I}" mingw ++ set x "$@" -I"$file" ++ shift ++ ;; ++ -l) ++ eat=1 ++ func_cl_dashl "$2" ++ set x "$@" "$lib" ++ shift ++ ;; ++ -l*) ++ func_cl_dashl "${1#-l}" ++ set x "$@" "$lib" ++ shift ++ ;; ++ -L) ++ eat=1 ++ func_cl_dashL "$2" ++ ;; ++ -L*) ++ func_cl_dashL "${1#-L}" ++ ;; ++ -static) ++ shared=false ++ ;; ++ -Wl,*) ++ arg=${1#-Wl,} ++ save_ifs="$IFS"; IFS=',' ++ for flag in $arg; do ++ IFS="$save_ifs" ++ linker_opts="$linker_opts $flag" ++ done ++ IFS="$save_ifs" ++ ;; ++ -Xlinker) ++ eat=1 ++ linker_opts="$linker_opts $2" ++ ;; ++ -*) ++ set x "$@" "$1" ++ shift ++ ;; ++ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) ++ func_file_conv "$1" ++ set x "$@" -Tp"$file" ++ shift ++ ;; ++ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) ++ func_file_conv "$1" mingw ++ set x "$@" "$file" ++ shift ++ ;; ++ *) ++ set x "$@" "$1" ++ shift ++ ;; ++ esac ++ fi ++ shift ++ done ++ if test -n "$linker_opts"; then ++ linker_opts="-link$linker_opts" ++ fi ++ exec "$@" $linker_opts ++ exit 1 ++} ++ ++eat= ++ + case $1 in + '') +- echo "$0: No command. Try \`$0 --help' for more information." 1>&2 ++ echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF + Usage: compile [--help] [--version] PROGRAM [ARGS] + +-Wrapper for compilers which do not understand `-c -o'. +-Remove `-o dest.o' from ARGS, run PROGRAM with the remaining ++Wrapper for compilers which do not understand '-c -o'. ++Remove '-o dest.o' from ARGS, run PROGRAM with the remaining + arguments, and rename the output as expected. + + If you are trying to build a whole package this is not the +-right script to run: please start by reading the file `INSTALL'. ++right script to run: please start by reading the file 'INSTALL'. + + Report bugs to . + EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; ++ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) ++ func_cl_wrapper "$@" # Doesn't return... ++ ;; + esac + + ofile= + cfile= +-eat= + + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) +- # configure might choose to run compile as `compile cc -o foo foo.c'. +- # So we strip `-o arg' only if arg is an object. ++ # configure might choose to run compile as 'compile cc -o foo foo.c'. ++ # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift +@@ -89,54 +293,55 @@ do + shift + ;; + esac + fi + shift + done + + if test -z "$ofile" || test -z "$cfile"; then +- # If no `-o' option was seen then we might have been invoked from a ++ # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no +- # `.c' file was seen then we are probably linking. That is also ++ # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" + fi + + # Name of file we expect compiler to create. +-cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` ++cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + + # Create the lock directory. +-# Note: use `[/.-]' here to ensure that we don't use the same name ++# Note: use '[/\\:.-]' here to ensure that we don't use the same name + # that we are using for the .o file. Also, base the name on the expected + # object file name, since that is what matters with a parallel build. +-lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d ++lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d + while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 + done + # FIXME: race condition here if user kills between mkdir and trap. + trap "rmdir '$lockdir'; exit 1" 1 2 15 + + # Run the compile. + "$@" + ret=$? + + if test -f "$cofile"; then +- mv "$cofile" "$ofile" ++ test "$cofile" = "$ofile" || mv "$cofile" "$ofile" + elif test -f "${cofile}bj"; then +- mv "${cofile}bj" "$ofile" ++ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" + fi + + rmdir "$lockdir" + exit $ret + + # Local Variables: + # mode: shell-script + # sh-indentation: 2 + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "scriptversion=" + # time-stamp-format: "%:y-%02m-%02d.%02H" +-# time-stamp-end: "$" ++# time-stamp-time-zone: "UTC" ++# time-stamp-end: "; # UTC" + # End: +diff --git a/js/src/ctypes/libffi/config.guess b/js/src/ctypes/libffi/config.guess +--- a/js/src/ctypes/libffi/config.guess ++++ b/js/src/ctypes/libffi/config.guess +@@ -1,47 +1,43 @@ + #! /bin/sh + # Attempt to guess a canonical system name. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +-# Free Software Foundation, Inc. ++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, ++# 2011, 2012, 2013 Free Software Foundation, Inc. + +-timestamp='2009-11-19' ++timestamp='2012-12-29' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +-# 02110-1301, USA. ++# along with this program; if not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. +- +- +-# Originally written by Per Bothner. Please send patches (context +-# diff format) to and include a ChangeLog +-# entry. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). + # +-# This script attempts to guess a canonical system name similar to +-# config.sub. If it succeeds, it prints the system name on stdout, and +-# exits with 0. Otherwise, it exits with 1. ++# Originally written by Per Bothner. + # + # You can get the latest version of this script from: + # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD ++# ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. ++ + + me=`echo "$0" | sed -e 's,.*/,,'` + + usage="\ + Usage: $0 [OPTION] + + Output the configuration name of the system \`$me' is run on. + +@@ -51,18 +47,19 @@ Operation modes: + -v, --version print version number, then exit + + Report bugs and patches to ." + + version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ++2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, ++2012, 2013 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + + help=" + Try \`$me --help' for more information." + + # Parse command line +@@ -139,17 +136,17 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` | + UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + + # Note: order is significant - the case branches are not exclusive. + + case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or +- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, ++ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". +@@ -175,17 +172,17 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) +- os=netbsd ++ os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in +@@ -196,16 +193,20 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; ++ *:Bitrig:*:*) ++ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` ++ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} ++ exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) +@@ -218,17 +219,17 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) +- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in +@@ -264,17 +265,20 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- exit ;; ++ # Reset EXIT trap before exiting to avoid spurious non-zero exit code. ++ exitcode=$? ++ trap '' 0 ++ exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 +@@ -290,22 +294,22 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) +- echo powerpc-ibm-os400 ++ echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; +- arm:riscos:*:*|arm:RISCOS:*:*) ++ arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then +@@ -328,16 +332,19 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; ++ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) ++ echo i386-pc-auroraux${UNAME_RELEASE} ++ exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ +@@ -386,33 +393,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} ++ echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} +- exit ;; ++ exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} ++ echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) +- echo m68k-milan-mint${UNAME_RELEASE} +- exit ;; ++ echo m68k-milan-mint${UNAME_RELEASE} ++ exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) +- echo m68k-hades-mint${UNAME_RELEASE} +- exit ;; ++ echo m68k-hades-mint${UNAME_RELEASE} ++ exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) +- echo m68k-unknown-mint${UNAME_RELEASE} +- exit ;; ++ echo m68k-unknown-mint${UNAME_RELEASE} ++ exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 +@@ -472,31 +479,31 @@ EOF + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) +- # DG/UX returns AViiON for all architectures +- UNAME_PROCESSOR=`/usr/bin/uname -p` ++ # DG/UX returns AViiON for all architectures ++ UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi +- exit ;; ++ exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) +@@ -543,17 +550,17 @@ EOF + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; +- *:AIX:*:[456]) ++ *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` +@@ -586,62 +593,62 @@ EOF + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` +- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` +- case "${sc_cpu_version}" in +- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 +- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 +- 532) # CPU_PA_RISC2_0 +- case "${sc_kernel_bits}" in +- 32) HP_ARCH="hppa2.0n" ;; +- 64) HP_ARCH="hppa2.0w" ;; ++ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` ++ case "${sc_cpu_version}" in ++ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 ++ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 ++ 532) # CPU_PA_RISC2_0 ++ case "${sc_kernel_bits}" in ++ 32) HP_ARCH="hppa2.0n" ;; ++ 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 +- esac ;; +- esac ++ esac ;; ++ esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ sed 's/^ //' << EOF >$dummy.c + +- #define _HPUX_SOURCE +- #include +- #include ++ #define _HPUX_SOURCE ++ #include ++ #include + +- int main () +- { +- #if defined(_SC_KERNEL_BITS) +- long bits = sysconf(_SC_KERNEL_BITS); +- #endif +- long cpu = sysconf (_SC_CPU_VERSION); ++ int main () ++ { ++ #if defined(_SC_KERNEL_BITS) ++ long bits = sysconf(_SC_KERNEL_BITS); ++ #endif ++ long cpu = sysconf (_SC_CPU_VERSION); + +- switch (cpu) +- { +- case CPU_PA_RISC1_0: puts ("hppa1.0"); break; +- case CPU_PA_RISC1_1: puts ("hppa1.1"); break; +- case CPU_PA_RISC2_0: +- #if defined(_SC_KERNEL_BITS) +- switch (bits) +- { +- case 64: puts ("hppa2.0w"); break; +- case 32: puts ("hppa2.0n"); break; +- default: puts ("hppa2.0"); break; +- } break; +- #else /* !defined(_SC_KERNEL_BITS) */ +- puts ("hppa2.0"); break; +- #endif +- default: puts ("hppa1.0"); break; +- } +- exit (0); +- } ++ switch (cpu) ++ { ++ case CPU_PA_RISC1_0: puts ("hppa1.0"); break; ++ case CPU_PA_RISC1_1: puts ("hppa1.1"); break; ++ case CPU_PA_RISC2_0: ++ #if defined(_SC_KERNEL_BITS) ++ switch (bits) ++ { ++ case 64: puts ("hppa2.0w"); break; ++ case 32: puts ("hppa2.0n"); break; ++ default: puts ("hppa2.0"); break; ++ } break; ++ #else /* !defined(_SC_KERNEL_BITS) */ ++ puts ("hppa2.0"); break; ++ #endif ++ default: puts ("hppa1.0"); break; ++ } ++ exit (0); ++ } + EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build +@@ -722,32 +729,32 @@ EOF + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd +- exit ;; ++ exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi +- exit ;; ++ exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd +- exit ;; ++ exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd +- exit ;; ++ exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd +- exit ;; ++ exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' +@@ -761,59 +768,64 @@ EOF + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` +- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +- exit ;; ++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` ++ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++ exit ;; + 5000:UNIX_System_V:4.*:*) +- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` +- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` ++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) +- case ${UNAME_MACHINE} in +- pc98) +- echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ UNAME_PROCESSOR=`/usr/bin/uname -p` ++ case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) +- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; ++ *:MINGW64*:*) ++ echo ${UNAME_MACHINE}-pc-mingw64 ++ exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; ++ i*:MSYS*:*) ++ echo ${UNAME_MACHINE}-pc-msys ++ exit ;; + i*:windows32*:*) +- # uname -m includes "-pc" on this system. +- echo ${UNAME_MACHINE}-mingw32 ++ # uname -m includes "-pc" on this system. ++ echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) +- case ${UNAME_MACHINE} in ++ case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} +@@ -849,51 +861,67 @@ EOF + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; ++ aarch64:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; ++ aarch64_be:Linux:*:*) ++ UNAME_MACHINE=aarch64_be ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; +- esac ++ esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else +- echo ${UNAME_MACHINE}-unknown-linux-gnueabi ++ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_PCS_VFP ++ then ++ echo ${UNAME_MACHINE}-unknown-linux-gnueabi ++ else ++ echo ${UNAME_MACHINE}-unknown-linux-gnueabihf ++ fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) +- echo cris-axis-linux-gnu ++ echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) +- echo crisv32-axis-linux-gnu ++ echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) +- echo frv-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; ++ hexagon:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +@@ -925,17 +953,17 @@ EOF + CPU= + #endif + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) +- echo or32-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) +@@ -951,45 +979,48 @@ EOF + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; ++ tile*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) +- echo x86_64-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) +- # Unixware is an offshoot of SVR4, but it has its own version +- # number series starting with 2... +- # I am not positive that other SVR4 systems won't match this, ++ # Unixware is an offshoot of SVR4, but it has its own version ++ # number series starting with 2... ++ # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. +- # Use sysv4.2uw... so that sysv4* matches it. ++ # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) +@@ -1011,17 +1042,17 @@ EOF + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) +- # UnixWare 7.x, OpenUNIX and OpenServer 6. ++ # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) +@@ -1039,23 +1070,23 @@ EOF + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: +- # uname -m prints for DJGPP always 'pc', but it prints nothing about +- # the processor, so we play safe by assuming i586. ++ # uname -m prints for DJGPP always 'pc', but it prints nothing about ++ # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp +- exit ;; ++ exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then +@@ -1080,18 +1111,18 @@ EOF + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) +- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && { echo i486-ncr-sysv4; exit; } ;; ++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ ++ && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } +@@ -1124,20 +1155,20 @@ EOF + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; +- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort +- # says +- echo i586-unisys-sysv4 +- exit ;; ++ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort ++ # says ++ echo i586-unisys-sysv4 ++ exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 +@@ -1153,33 +1184,36 @@ EOF + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then +- echo mips-nec-sysv${UNAME_RELEASE} ++ echo mips-nec-sysv${UNAME_RELEASE} + else +- echo mips-unknown-sysv${UNAME_RELEASE} ++ echo mips-unknown-sysv${UNAME_RELEASE} + fi +- exit ;; ++ exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; ++ x86_64:Haiku:*:*) ++ echo x86_64-unknown-haiku ++ exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} +@@ -1222,17 +1256,20 @@ EOF + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; +- NSE-?:NONSTOP_KERNEL:*:*) ++ NEO-?:NONSTOP_KERNEL:*:*) ++ echo neo-tandem-nsk${UNAME_RELEASE} ++ exit ;; ++ NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; +@@ -1267,23 +1304,23 @@ EOF + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) +- echo mips-sei-seiux${UNAME_RELEASE} ++ echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) +- UNAME_MACHINE=`(uname -p) 2>/dev/null` ++ UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; +@@ -1291,21 +1328,21 @@ EOF + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; ++ x86_64:VMkernel:*:*) ++ echo ${UNAME_MACHINE}-unknown-esx ++ exit ;; + esac + +-#echo '(No uname command or uname output not recognized.)' 1>&2 +-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 +- + eval $set_cc_for_build + cat >$dummy.c < + # include + #endif + main () + { +@@ -1313,21 +1350,21 @@ main () + #if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); + #else + #include + printf ("m68k-sony-newsos%s\n", + #ifdef NEWSOS4 +- "4" ++ "4" + #else +- "" ++ "" + #endif +- ); exit (0); ++ ); exit (0); + #endif + #endif + + #if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); + #endif + + #if defined (hp300) && !defined (hpux) +diff --git a/js/src/ctypes/libffi/config.sub b/js/src/ctypes/libffi/config.sub +--- a/js/src/ctypes/libffi/config.sub ++++ b/js/src/ctypes/libffi/config.sub +@@ -1,43 +1,38 @@ + #! /bin/sh + # Configuration validation subroutine script. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +-# Free Software Foundation, Inc. ++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, ++# 2011, 2012, 2013 Free Software Foundation, Inc. + +-timestamp='2011-01-03' ++timestamp='2012-12-29' + +-# This file is (in principle) common to ALL GNU software. +-# The presence of a machine in this file suggests that SOME GNU software +-# can handle that machine. It does not imply ALL GNU software can. +-# +-# This file is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# This file is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +-# 02110-1301, USA. ++# along with this program; if not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). + + +-# Please send patches to . Submit a context +-# diff and a properly formatted GNU ChangeLog entry. ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. + # Otherwise, we print the canonical config type on stdout and succeed. + + # You can get the latest version of this script from: + # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +@@ -70,18 +65,19 @@ Operation modes: + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + + Report bugs and patches to ." + + version="\ + GNU config.sub ($timestamp) + +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ++2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, ++2012, 2013 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + + help=" + Try \`$me --help' for more information." + + # Parse command line +@@ -118,23 +114,28 @@ case $# in + *) echo "$me: too many arguments$help" >&2 + exit 1;; + esac + + # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ +- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ ++ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ ++ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ ++ knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ +- storm-chaos* | os2-emx* | rtmk-nova* | wince-winmo*) ++ storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; ++ android-linux) ++ os=-linux-android ++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ++ ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; + esac + +@@ -147,41 +148,41 @@ case $os in + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple | -axis | -knuth | -cray | -microblaze) ++ -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; +- -bluegene*) +- os=-cnk ++ -bluegene*) ++ os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; +- -chorusrdb) +- os=-chorusrdb ++ -chorusrdb) ++ os=-chorusrdb + basic_machine=$1 +- ;; ++ ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) +@@ -216,16 +217,22 @@ case $os in + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; ++ -lynx*178) ++ os=-lynxos178 ++ ;; ++ -lynx*5) ++ os=-lynxos5 ++ ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` +@@ -240,30 +247,37 @@ case $os in + esac + + # Decode aliases for certain CPU-COMPANY combinations. + case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ ++ | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ +- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ ++ | arc \ ++ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ ++ | avr | avr32 \ ++ | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ ++ | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ ++ | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ ++ | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ +- | maxq | mb | microblaze | mcore | mep | metag \ ++ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ +@@ -276,79 +290,111 @@ case $basic_machine in + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ ++ | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ ++ | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ +- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ ++ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ ++ | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ +- | spu | strongarm \ +- | tahoe | thumb | tic4x | tic80 | tron \ +- | v850 | v850e \ ++ | spu \ ++ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ ++ | ubicom32 \ ++ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ +- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ ++ | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; +- m6811 | m68hc11 | m6812 | m68hc12) +- # Motorola 68HC11/12. ++ c54x) ++ basic_machine=tic54x-unknown ++ ;; ++ c55x) ++ basic_machine=tic55x-unknown ++ ;; ++ c6x) ++ basic_machine=tic6x-unknown ++ ;; ++ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + ++ strongarm | thumb | xscale) ++ basic_machine=arm-unknown ++ ;; ++ xgate) ++ basic_machine=$basic_machine-unknown ++ os=-none ++ ;; ++ xscaleeb) ++ basic_machine=armeb-unknown ++ ;; ++ ++ xscaleel) ++ basic_machine=armel-unknown ++ ;; ++ + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ ++ | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ ++ | be32-* | be64-* \ + | bfin-* | bs2000-* \ +- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ ++ | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ ++ | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ ++ | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ +- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ ++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ ++ | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ +@@ -360,34 +406,39 @@ case $basic_machine in + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ ++ | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ ++ | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ +- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ ++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ +- | romp-* | rs6000-* \ ++ | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ +- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ +- | tahoe-* | thumb-* \ +- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ ++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ ++ | tahoe-* \ ++ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ ++ | tile*-* \ + | tron-* \ +- | v850-* | v850e-* | vax-* \ ++ | ubicom32-* \ ++ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ ++ | vax-* \ + | we32k-* \ +- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ ++ | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; +@@ -402,17 +453,17 @@ case $basic_machine in + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; +- abacus) ++ abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant +@@ -472,21 +523,30 @@ case $basic_machine in + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; ++ c54x-*) ++ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ c55x-*) ++ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ c6x-*) ++ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; +- cegcc) ++ cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) +@@ -508,17 +568,17 @@ case $basic_machine in + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; +- cr16) ++ cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis +@@ -666,17 +726,16 @@ case $basic_machine in + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +-# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; +@@ -724,19 +783,23 @@ case $basic_machine in + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; +- microblaze) ++ microblaze*) + basic_machine=microblaze-xilinx + ;; ++ mingw64) ++ basic_machine=x86_64-pc ++ os=-mingw64 ++ ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; +@@ -763,20 +826,28 @@ case $basic_machine in + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; ++ msys) ++ basic_machine=i386-pc ++ os=-msys ++ ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; ++ nacl) ++ basic_machine=le32-unknown ++ os=-nacl ++ ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; +@@ -831,16 +902,22 @@ case $basic_machine in + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; ++ neo-tandem) ++ basic_machine=neo-tandem ++ ;; ++ nse-tandem) ++ basic_machine=nse-tandem ++ ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) +@@ -913,44 +990,49 @@ case $basic_machine in + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; +- ppc) basic_machine=powerpc-unknown ++ ppc | ppcbe) basic_machine=powerpc-unknown + ;; +- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ppc-* | ppcbe-*) ++ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; +- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; +- rdos) ++ rdos | rdos64) ++ basic_machine=x86_64-pc ++ os=-rdos ++ ;; ++ rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) +@@ -1009,16 +1091,19 @@ case $basic_machine in + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; ++ strongarm-* | thumb-*) ++ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) +@@ -1065,30 +1150,18 @@ case $basic_machine in + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; +- tic54x | c54x*) +- basic_machine=tic54x-unknown +- os=-coff +- ;; +- tic55x | c55x*) +- basic_machine=tic55x-unknown +- os=-coff +- ;; +- tic6x | c6x*) +- basic_machine=tic6x-unknown +- os=-coff +- ;; + tile*) +- basic_machine=tile-unknown ++ basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; +@@ -1148,16 +1221,19 @@ case $basic_machine in + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; ++ xscale-* | xscalee[bl]-*) ++ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ++ ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; +@@ -1245,19 +1321,22 @@ case $basic_machine in + ;; + esac + + # Decode manufacturer-specific aliases for certain operating systems. + + if [ x"$os" != x"" ] + then + case $os in +- # First match some system type aliases +- # that might get confused with valid system types. ++ # First match some system type aliases ++ # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. ++ -auroraux) ++ os=-auroraux ++ ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 +@@ -1269,39 +1348,40 @@ case $os in + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ +- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ +- | -kopensolaris* \ ++ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ ++ | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ +- | -openbsd* | -solidbsd* \ ++ | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ +- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ ++ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ ++ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ ++ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ +- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -winmo*) ++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os +@@ -1330,22 +1410,19 @@ case $os in + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; +- -os400*) ++ -os400*) + os=-os400 + ;; +- -wince-winmo*) +- os=-wince-winmo +- ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf +@@ -1382,17 +1459,17 @@ case $os in + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; +- -tpf*) ++ -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; +@@ -1427,19 +1504,18 @@ case $os in + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; +- -android*) +- os=-android +- ;; ++ -nacl*) ++ ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +@@ -1452,33 +1528,45 @@ else + + # Note that if you're going to try to match "-MANUFACTURER" here (say, + # "-sun"), then you have to tell the case statement up towards the top + # that MANUFACTURER isn't an operating system. Otherwise, code above + # will signal an error saying that MANUFACTURER isn't an operating + # system, and we'll never get to this point. + + case $basic_machine in +- score-*) ++ score-*) + os=-elf + ;; +- spu-*) ++ spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; +- c4x-* | tic4x-*) +- os=-coff ++ c4x-* | tic4x-*) ++ os=-coff ++ ;; ++ hexagon-*) ++ os=-elf ++ ;; ++ tic54x-*) ++ os=-coff ++ ;; ++ tic55x-*) ++ os=-coff ++ ;; ++ tic6x-*) ++ os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; +@@ -1488,24 +1576,21 @@ case $basic_machine in + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 +- # This also exists in the configure program, but was not the +- # default. +- # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; +- mep-*) ++ mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; +@@ -1522,17 +1607,17 @@ case $basic_machine in + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; +- *-knuth) ++ *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; +@@ -1684,19 +1769,16 @@ case $basic_machine in + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; +- *-android*|*-linuxandroid*) +- vendor=linux- +- ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; + esac + + echo $basic_machine$os + exit + +diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +--- a/js/src/ctypes/libffi/configure ++++ b/js/src/ctypes/libffi/configure +@@ -1,18 +1,16 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.65 for libffi 3.0.10rc0. ++# Generated by GNU Autoconf 2.69 for libffi 3.1-rc1. + # +-# Report bugs to . ++# Report bugs to . + # + # +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +-# Inc. ++# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. + # + # + # This configure script is free software; the Free Software Foundation + # gives unlimited permission to copy, distribute and modify it. + ## -------------------- ## + ## M4sh Initialization. ## + ## -------------------- ## + +@@ -86,16 +84,17 @@ fi + # IFS + # We need space, tab and new line, in precisely that order. Quoting is + # there to prevent editors from complaining about space-tab. + # (If _AS_PATH_WALK were called with IFS unset, it would disable word + # splitting by setting IFS to empty value.) + IFS=" "" $as_nl" + + # Find who we are. Look in the path if we contain no directory separator. ++as_myself= + case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +@@ -130,16 +129,41 @@ PS4='+ ' + LC_ALL=C + export LC_ALL + LANGUAGE=C + export LANGUAGE + + # CDPATH. + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + ++# Use a proper internal environment variable to ensure we don't fall ++ # into an infinite loop, continuously re-executing ourselves. ++ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then ++ _as_can_reexec=no; export _as_can_reexec; ++ # We cannot yet assume a decent shell, so we have to provide a ++# neutralization value for shells without unset; and this also ++# works around shells that cannot unset nonexistent variables. ++# Preserve -v and -x to the replacement shell. ++BASH_ENV=/dev/null ++ENV=/dev/null ++(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV ++case $- in # (((( ++ *v*x* | *x*v* ) as_opts=-vx ;; ++ *v* ) as_opts=-v ;; ++ *x* ) as_opts=-x ;; ++ * ) as_opts= ;; ++esac ++exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} ++# Admittedly, this is quite paranoid, since all the known shells bail ++# out after a failed `exec'. ++$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 ++as_fn_exit 255 ++ fi ++ # We don't want this to propagate to other subprocesses. ++ { _as_can_reexec=; unset _as_can_reexec;} + if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +@@ -163,21 +187,30 @@ as_fn_success || { exitcode=1; echo as_f + as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } + as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } + as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } + if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + + else + exitcode=1; echo positional parameters were not saved. + fi +-test x\$exitcode = x0 || exit 1" ++test x\$exitcode = x0 || exit 1 ++test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 ++ ++ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ++ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ++ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ++ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ++ PATH=/empty FPATH=/empty; export PATH FPATH ++ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ ++ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 + test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes + else + as_have_required=no + fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +@@ -208,36 +241,47 @@ done + $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes + fi; } + IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : +- # We cannot yet assume a decent shell, so we have to provide a +- # neutralization value for shells without unset; and this also +- # works around shells that cannot unset nonexistent variables. +- BASH_ENV=/dev/null +- ENV=/dev/null +- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +- export CONFIG_SHELL +- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} ++ export CONFIG_SHELL ++ # We cannot yet assume a decent shell, so we have to provide a ++# neutralization value for shells without unset; and this also ++# works around shells that cannot unset nonexistent variables. ++# Preserve -v and -x to the replacement shell. ++BASH_ENV=/dev/null ++ENV=/dev/null ++(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV ++case $- in # (((( ++ *v*x* | *x*v* ) as_opts=-vx ;; ++ *v* ) as_opts=-v ;; ++ *x* ) as_opts=-x ;; ++ * ) as_opts= ;; ++esac ++exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} ++# Admittedly, this is quite paranoid, since all the known shells bail ++# out after a failed `exec'. ++$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 ++exit 255 + fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +-$0: http://gcc.gnu.org/bugs.html about your system, +-$0: including any error possibly output before this ++$0: http://github.com/atgreen/libffi/issues about your ++$0: system, including any error possibly output before this + $0: message. Then install a modern shell, or manually run + $0: the script under such a shell if you do have one." + fi + exit 1 + fi + fi + fi + SHELL=${CONFIG_SHELL-/bin/sh} +@@ -314,20 +358,28 @@ as_fn_mkdir_p () + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" ++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + + } # as_fn_mkdir_p ++ ++# as_fn_executable_p FILE ++# ----------------------- ++# Test if FILE is an executable regular file. ++as_fn_executable_p () ++{ ++ test -f "$1" && test -x "$1" ++} # as_fn_executable_p + # as_fn_append VAR VALUE + # ---------------------- + # Append the text in VALUE to the end of the definition contained in VAR. Take + # advantage of any shell optimizations that allow amortized linear growth over + # repeated appends, instead of the typical quadratic growth present in naive + # implementations. + if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () +@@ -354,29 +406,29 @@ if (eval "test \$(( 1 + 1 )) = 2") 2>/de + else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } + fi # as_fn_arith + + +-# as_fn_error ERROR [LINENO LOG_FD] +-# --------------------------------- ++# as_fn_error STATUS ERROR [LINENO LOG_FD] ++# ---------------------------------------- + # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are + # provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-# script with status $?, using 1 if that was 0. ++# script with STATUS, using 1 if that was 0. + as_fn_error () + { +- as_status=$?; test $as_status -eq 0 && as_status=1 +- if test "$3"; then +- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 +- fi +- $as_echo "$as_me: error: $1" >&2 ++ as_status=$1; test $as_status -eq 0 && as_status=1 ++ if test "$4"; then ++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 ++ fi ++ $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + + if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr + else + as_expr=false +@@ -439,16 +491,20 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + ++ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have ++ # already done that, so ensure we don't try to do so again and fall ++ # in an infinite loop. This has already happened in practice. ++ _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit + } + +@@ -473,221 +529,54 @@ else + mkdir conf$$.dir 2>/dev/null + fi + if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -p'. ++ # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else +- as_ln_s='cp -p' +- fi +-else +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' ++ fi ++else ++ as_ln_s='cp -pR' + fi + rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file + rmdir conf$$.dir 2>/dev/null + + if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' + else + test -d ./-p && rmdir ./-p + as_mkdir_p=false + fi + +-if test -x / >/dev/null 2>&1; then +- as_test_x='test -x' +-else +- if ls -dL / >/dev/null 2>&1; then +- as_ls_L_option=L +- else +- as_ls_L_option= +- fi +- as_test_x=' +- eval sh -c '\'' +- if test -d "$1"; then +- test -d "$1/."; +- else +- case $1 in #( +- -*)set "./$1";; +- esac; +- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( +- ???[sx]*):;;*)false;;esac;fi +- '\'' sh +- ' +-fi +-as_executable_p=$as_test_x ++as_test_x='test -x' ++as_executable_p=as_fn_executable_p + + # Sed expression to map a string onto a valid CPP name. + as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + + # Sed expression to map a string onto a valid variable name. + as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +- +- +-# Check that we are running under the correct shell. + SHELL=${CONFIG_SHELL-/bin/sh} + +-case X$lt_ECHO in +-X*--fallback-echo) +- # Remove one level of quotation (which was required for Make). +- ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` +- ;; +-esac +- +-ECHO=${lt_ECHO-echo} +-if test "X$1" = X--no-reexec; then +- # Discard the --no-reexec flag, and continue. +- shift +-elif test "X$1" = X--fallback-echo; then +- # Avoid inline document here, it may be left over +- : +-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then +- # Yippee, $ECHO works! +- : +-else +- # Restart under the correct shell. +- exec $SHELL "$0" --no-reexec ${1+"$@"} +-fi +- +-if test "X$1" = X--fallback-echo; then +- # used as fallback echo +- shift +- cat <<_LT_EOF +-$* +-_LT_EOF +- exit 0 +-fi +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-if test -z "$lt_ECHO"; then +- if test "X${echo_test_string+set}" != Xset; then +- # find a string as large as possible, as long as the shell can cope with it +- for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do +- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... +- if { echo_test_string=`eval $cmd`; } 2>/dev/null && +- { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null +- then +- break +- fi +- done +- fi +- +- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- : +- else +- # The Solaris, AIX, and Digital Unix default echo programs unquote +- # backslashes. This makes it impossible to quote backslashes using +- # echo "$something" | sed 's/\\/\\\\/g' +- # +- # So, first we look for a working echo in the user's PATH. +- +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for dir in $PATH /usr/ucb; do +- IFS="$lt_save_ifs" +- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && +- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && +- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- ECHO="$dir/echo" +- break +- fi +- done +- IFS="$lt_save_ifs" +- +- if test "X$ECHO" = Xecho; then +- # We didn't find a better echo, so look for alternatives. +- if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # This shell has a builtin print -r that does the trick. +- ECHO='print -r' +- elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && +- test "X$CONFIG_SHELL" != X/bin/ksh; then +- # If we have ksh, try running configure again with it. +- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} +- export ORIGINAL_CONFIG_SHELL +- CONFIG_SHELL=/bin/ksh +- export CONFIG_SHELL +- exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} +- else +- # Try using printf. +- ECHO='printf %s\n' +- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # Cool, printf works +- : +- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL +- export CONFIG_SHELL +- SHELL="$CONFIG_SHELL" +- export SHELL +- ECHO="$CONFIG_SHELL $0 --fallback-echo" +- elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- ECHO="$CONFIG_SHELL $0 --fallback-echo" +- else +- # maybe with a smaller string... +- prev=: +- +- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do +- if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null +- then +- break +- fi +- prev="$cmd" +- done +- +- if test "$prev" != 'sed 50q "$0"'; then +- echo_test_string=`eval $prev` +- export echo_test_string +- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} +- else +- # Oops. We lost completely, so just stick with echo. +- ECHO=echo +- fi +- fi +- fi +- fi +- fi +-fi +- +-# Copy echo and quote the copy suitably for passing to libtool from +-# the Makefile, instead of quoting the original, which is used later. +-lt_ECHO=$ECHO +-if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then +- lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +-fi +- +- +- + + test -n "$DJDIR" || exec 7<&0 &1 + + # Name of the host. +-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, + # so uname gets run too. + ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + + # + # Initializations. + # + ac_default_prefix=/usr/local + ac_clean_files= +@@ -696,19 +585,19 @@ LIBOBJS= + cross_compiling=no + subdirs= + MFLAGS= + MAKEFLAGS= + + # Identity of this package. + PACKAGE_NAME='libffi' + PACKAGE_TARNAME='libffi' +-PACKAGE_VERSION='3.0.10rc0' +-PACKAGE_STRING='libffi 3.0.10rc0' +-PACKAGE_BUGREPORT='http://gcc.gnu.org/bugs.html' ++PACKAGE_VERSION='3.1-rc1' ++PACKAGE_STRING='libffi 3.1-rc1' ++PACKAGE_BUGREPORT='http://github.com/atgreen/libffi/issues' + PACKAGE_URL='' + + # Factoring default headers for most tests. + ac_includes_default="\ + #include + #ifdef HAVE_SYS_TYPES_H + # include + #endif +@@ -747,19 +636,29 @@ am__EXEEXT_TRUE + LTLIBOBJS + LIBOBJS + toolexeclibdir + toolexecdir + FFI_DEBUG_FALSE + FFI_DEBUG_TRUE + TARGETDIR + TARGET ++FFI_EXEC_TRAMPOLINE_TABLE ++FFI_EXEC_TRAMPOLINE_TABLE_FALSE ++FFI_EXEC_TRAMPOLINE_TABLE_TRUE + sys_symbol_underscore ++HAVE_LONG_DOUBLE_VARIANT + HAVE_LONG_DOUBLE + ALLOCA ++XTENSA_FALSE ++XTENSA_TRUE ++VAX_FALSE ++VAX_TRUE ++TILE_FALSE ++TILE_TRUE + PA64_HPUX_FALSE + PA64_HPUX_TRUE + PA_HPUX_FALSE + PA_HPUX_TRUE + PA_LINUX_FALSE + PA_LINUX_TRUE + SH64_FALSE + SH64_TRUE +@@ -772,64 +671,85 @@ S390_TRUE + FRV_FALSE + FRV_TRUE + LIBFFI_CRIS_FALSE + LIBFFI_CRIS_TRUE + AVR32_FALSE + AVR32_TRUE + ARM_FALSE + ARM_TRUE ++ARC_FALSE ++ARC_TRUE ++AARCH64_FALSE ++AARCH64_TRUE + POWERPC_FREEBSD_FALSE + POWERPC_FREEBSD_TRUE + POWERPC_DARWIN_FALSE + POWERPC_DARWIN_TRUE + POWERPC_AIX_FALSE + POWERPC_AIX_TRUE + POWERPC_FALSE + POWERPC_TRUE ++NIOS2_FALSE ++NIOS2_TRUE + MOXIE_FALSE + MOXIE_TRUE ++METAG_FALSE ++METAG_TRUE ++MICROBLAZE_FALSE ++MICROBLAZE_TRUE ++M88K_FALSE ++M88K_TRUE + M68K_FALSE + M68K_TRUE + M32R_FALSE + M32R_TRUE + IA64_FALSE + IA64_TRUE + ALPHA_FALSE + ALPHA_TRUE ++X86_DARWIN64_FALSE ++X86_DARWIN64_TRUE ++X86_DARWIN32_FALSE ++X86_DARWIN32_TRUE + X86_DARWIN_FALSE + X86_DARWIN_TRUE + X86_WIN64_FALSE + X86_WIN64_TRUE + X86_WIN32_FALSE + X86_WIN32_TRUE + X86_FREEBSD_FALSE + X86_FREEBSD_TRUE + X86_FALSE + X86_TRUE + SPARC_FALSE + SPARC_TRUE ++BFIN_FALSE ++BFIN_TRUE + MIPS_FALSE + MIPS_TRUE + AM_LTLDFLAGS + AM_RUNTESTFLAGS + TESTSUBDIR_FALSE + TESTSUBDIR_TRUE + MAINT + MAINTAINER_MODE_FALSE + MAINTAINER_MODE_TRUE ++PRTDIAG + CPP + OTOOL64 + OTOOL + LIPO + NMEDIT + DSYMUTIL +-lt_ECHO ++MANIFEST_TOOL + RANLIB ++ac_ct_AR + AR ++DLLTOOL + OBJDUMP + LN_S + NM + ac_ct_DUMPBIN + DUMPBIN + LD + FGREP + EGREP +@@ -839,29 +759,34 @@ LIBTOOL + am__fastdepCCAS_FALSE + am__fastdepCCAS_TRUE + CCASDEPMODE + CCASFLAGS + CCAS + am__fastdepCC_FALSE + am__fastdepCC_TRUE + CCDEPMODE ++am__nodep + AMDEPBACKSLASH + AMDEP_FALSE + AMDEP_TRUE + am__quote + am__include + DEPDIR + OBJEXT + EXEEXT + ac_ct_CC + CPPFLAGS + LDFLAGS + CFLAGS + CC ++AM_BACKSLASH ++AM_DEFAULT_VERBOSITY ++AM_DEFAULT_V ++AM_V + am__untar + am__tar + AMTAR + am__leading_dot + SET_MAKE + AWK + mkdir_p + MKDIR_P +@@ -875,16 +800,17 @@ AUTOCONF + ACLOCAL + VERSION + PACKAGE + CYGPATH_W + am__isrc + INSTALL_DATA + INSTALL_SCRIPT + INSTALL_PROGRAM ++ax_enable_builddir_sed + target_os + target_vendor + target_cpu + target + host_os + host_vendor + host_cpu + host +@@ -928,24 +854,30 @@ PACKAGE_STRING + PACKAGE_VERSION + PACKAGE_TARNAME + PACKAGE_NAME + PATH_SEPARATOR + SHELL' + ac_subst_files='' + ac_user_opts=' + enable_option_checking ++enable_builddir ++enable_silent_rules + enable_dependency_tracking + enable_shared + enable_static + with_pic + enable_fast_install + with_gnu_ld ++with_sysroot + enable_libtool_lock ++enable_portable_binary ++with_gcc_arch + enable_maintainer_mode ++enable_pax_emutramp + enable_debug + enable_structs + enable_raw_api + enable_purify_safety + ' + ac_precious_vars='build_alias + host_alias + target_alias +@@ -1010,18 +942,19 @@ do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in +- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; +- *) ac_optarg=yes ;; ++ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; ++ *=) ac_optarg= ;; ++ *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + +@@ -1056,17 +989,17 @@ do + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "enable_$ac_useropt" + "*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; +@@ -1082,17 +1015,17 @@ do + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "enable_$ac_useropt" + "*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; +@@ -1286,33 +1219,33 @@ do + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "with_$ac_useropt" + "*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "with_$ac_useropt" + "*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; +@@ -1332,50 +1265,50 @@ do + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + +- -*) as_fn_error "unrecognized option: \`$ac_option' +-Try \`$0 --help' for more information." ++ -*) as_fn_error $? "unrecognized option: \`$ac_option' ++Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) +- as_fn_error "invalid variable name: \`$ac_envvar'" ;; ++ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 +- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ++ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac + done + + if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` +- as_fn_error "missing argument to $ac_option" ++ as_fn_error $? "missing argument to $ac_option" + fi + + if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; +- fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; ++ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac + fi + + # Check all directory arguments for consistency. + for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ +@@ -1388,49 +1321,47 @@ do + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac +- as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" ++ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" + done + + # There might be people who depend on the old broken behavior: `$host' + # used to hold the argument of --host etc. + # FIXME: To remove some day. + build=$build_alias + host=$host_alias + target=$target_alias + + # FIXME: To remove some day. + if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe +- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. +- If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi + fi + + ac_tool_prefix= + test -n "$host_alias" && ac_tool_prefix=$host_alias- + + test "$silent" = yes && exec 6>/dev/null + + + ac_pwd=`pwd` && test -n "$ac_pwd" && + ac_ls_di=`ls -di .` && + ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || +- as_fn_error "working directory cannot be determined" ++ as_fn_error $? "working directory cannot be determined" + test "X$ac_ls_di" = "X$ac_pwd_ls_di" || +- as_fn_error "pwd does not report name of working directory" ++ as_fn_error $? "pwd does not report name of working directory" + + + # Find the source files, if location was not specified. + if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || + $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +@@ -1459,21 +1390,21 @@ if test -z "$srcdir"; then + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi + else + ac_srcdir_defaulted=no + fi + if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." +- as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" ++ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" + fi + ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" + ac_abs_confdir=`( +- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" ++ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` + # When building in place, set srcdir=. + if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. + fi + # Remove unnecessary trailing slashes from srcdir. + # Double slashes in file names in object file debugging info + # mess up M-x gdb in Emacs. +@@ -1489,31 +1420,31 @@ done + + # + # Report the --help message. + # + if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures libffi 3.0.10rc0 to adapt to many kinds of systems. ++\`configure' configures libffi 3.1-rc1 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + + To assign environment variables (e.g., CC, CFLAGS...), specify them as + VAR=VALUE. See below for descriptions of some of the useful variables. + + Defaults for the options are specified in brackets. + + Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit +- -q, --quiet, --silent do not print \`checking...' messages ++ -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + + Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] +@@ -1560,61 +1491,76 @@ System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] + _ACEOF + fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of libffi 3.0.10rc0:";; ++ short | recursive ) echo "Configuration of libffi 3.1-rc1:";; + esac + cat <<\_ACEOF + + Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +- --disable-dependency-tracking speeds up one-time build +- --enable-dependency-tracking do not reject slow dependency extractors ++ --disable-builddir disable automatic build in subdir of sources ++ ++ --enable-silent-rules less verbose build output (undo: "make V=1") ++ --disable-silent-rules verbose build output (undo: "make V=0") ++ --enable-dependency-tracking ++ do not reject slow dependency extractors ++ --disable-dependency-tracking ++ speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) +- --enable-maintainer-mode enable make rules and dependencies not useful +- (and sometimes confusing) to the casual installer ++ --enable-portable-binary ++ disable compiler optimizations that would produce ++ unportable binaries ++ --enable-maintainer-mode ++ enable make rules and dependencies not useful (and ++ sometimes confusing) to the casual installer ++ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC + --enable-debug debugging mode + --disable-structs omit code for struct support + --disable-raw-api make the raw api unavailable + --enable-purify-safety purify-safe mode + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) +- --with-pic try to use only PIC/non-PIC objects [default=use ++ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] ++ --with-sysroot=DIR Search for dependent libraries within DIR ++ (or the compiler's sysroot if not specified). ++ --with-gcc-arch= use architecture for gcc -march/-mtune, ++ instead of guessing + + Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CCAS assembler compiler command (defaults to CC) + CCASFLAGS assembler compiler flags (defaults to CFLAGS) + CPP C preprocessor + + Use these variables to override the choices made by `configure' or to help + it to find libraries and programs with nonstandard names/locations. + +-Report bugs to . ++Report bugs to . + _ACEOF + ac_status=$? + fi + + if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || +@@ -1667,20 +1613,20 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_ + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done + fi + + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-libffi configure 3.0.10rc0 +-generated by GNU Autoconf 2.65 +- +-Copyright (C) 2009 Free Software Foundation, Inc. ++libffi configure 3.1-rc1 ++generated by GNU Autoconf 2.69 ++ ++Copyright (C) 2012 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF + exit + fi + + ## ------------------------ ## + ## Autoconf initialization. ## +@@ -1714,17 +1660,17 @@ eval ac_try_echo="\"\$as_me:${as_lineno- + } && test -s conftest.$ac_objext; then : + ac_retval=0 + else + $as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_compile + + # ac_fn_c_try_link LINENO + # ----------------------- + # Try to link conftest.$ac_ext, and return whether this succeeded. + ac_fn_c_try_link () +@@ -1746,45 +1692,45 @@ eval ac_try_echo="\"\$as_me:${as_lineno- + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || +- $as_test_x conftest$ac_exeext ++ test -x conftest$ac_exeext + }; then : + ac_retval=0 + else + $as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_link + + # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES + # ------------------------------------------------------- + # Tests whether HEADER exists and can be compiled using the include files in + # INCLUDES, setting the cache variable VAR accordingly. + ac_fn_c_check_header_compile () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + #include <$2> + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : +@@ -1792,17 +1738,17 @@ if ac_fn_c_try_compile "$LINENO"; then : + else + eval "$3=no" + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_header_compile + + # ac_fn_c_try_cpp LINENO + # ---------------------- + # Try to preprocess conftest.$ac_ext, and return whether this succeeded. + ac_fn_c_try_cpp () + { +@@ -1817,28 +1763,28 @@ eval ac_try_echo="\"\$as_me:${as_lineno- + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } >/dev/null && { ++ test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 + else + $as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_cpp + + # ac_fn_c_try_run LINENO + # ---------------------- + # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes + # that executables *can* be run. +@@ -1870,30 +1816,30 @@ eval ac_try_echo="\"\$as_me:${as_lineno- + else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status + fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_run + + # ac_fn_c_check_func LINENO FUNC VAR + # ---------------------------------- + # Tests whether FUNC exists, setting the cache variable VAR accordingly + ac_fn_c_check_func () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + /* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ + #define $2 innocuous_$2 + +@@ -1938,32 +1884,215 @@ else + eval "$3=no" + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_func + ++# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES ++# -------------------------------------------- ++# Tries to find the compile-time value of EXPR in a program that includes ++# INCLUDES, setting VAR accordingly. Returns whether the value could be ++# computed ++ac_fn_c_compute_int () ++{ ++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ if test "$cross_compiling" = yes; then ++ # Depending upon the size, compute the lo and hi bounds. ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++int ++main () ++{ ++static int test_array [1 - 2 * !(($2) >= 0)]; ++test_array [0] = 0; ++return test_array [0]; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_lo=0 ac_mid=0 ++ while :; do ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++int ++main () ++{ ++static int test_array [1 - 2 * !(($2) <= $ac_mid)]; ++test_array [0] = 0; ++return test_array [0]; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_hi=$ac_mid; break ++else ++ as_fn_arith $ac_mid + 1 && ac_lo=$as_val ++ if test $ac_lo -le $ac_mid; then ++ ac_lo= ac_hi= ++ break ++ fi ++ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ done ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++int ++main () ++{ ++static int test_array [1 - 2 * !(($2) < 0)]; ++test_array [0] = 0; ++return test_array [0]; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_hi=-1 ac_mid=-1 ++ while :; do ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++int ++main () ++{ ++static int test_array [1 - 2 * !(($2) >= $ac_mid)]; ++test_array [0] = 0; ++return test_array [0]; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_lo=$ac_mid; break ++else ++ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val ++ if test $ac_mid -le $ac_hi; then ++ ac_lo= ac_hi= ++ break ++ fi ++ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ done ++else ++ ac_lo= ac_hi= ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++# Binary search between lo and hi bounds. ++while test "x$ac_lo" != "x$ac_hi"; do ++ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++int ++main () ++{ ++static int test_array [1 - 2 * !(($2) <= $ac_mid)]; ++test_array [0] = 0; ++return test_array [0]; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_hi=$ac_mid ++else ++ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++done ++case $ac_lo in #(( ++?*) eval "$3=\$ac_lo"; ac_retval=0 ;; ++'') ac_retval=1 ;; ++esac ++ else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++static long int longval () { return $2; } ++static unsigned long int ulongval () { return $2; } ++#include ++#include ++int ++main () ++{ ++ ++ FILE *f = fopen ("conftest.val", "w"); ++ if (! f) ++ return 1; ++ if (($2) < 0) ++ { ++ long int i = longval (); ++ if (i != ($2)) ++ return 1; ++ fprintf (f, "%ld", i); ++ } ++ else ++ { ++ unsigned long int i = ulongval (); ++ if (i != ($2)) ++ return 1; ++ fprintf (f, "%lu", i); ++ } ++ /* Do not output a trailing newline, as this causes \r\n confusion ++ on some platforms. */ ++ return ferror (f) || fclose (f) != 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ echo >>conftest.val; read $3 &5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } + else + # Is the header compilable? + { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +@@ -1989,17 +2118,17 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* end confdefs.h. */ + #include <$2> + _ACEOF + if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes + else + ac_header_preproc=no + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 + $as_echo "$ac_header_preproc" >&6; } + + # So? What about this header? + case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 + $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} +@@ -2012,222 +2141,96 @@ case $ac_header_compiler:$ac_header_prep + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 + $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 + $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 + $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 + $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +-( cat <<\_ASBOX +-## ------------------------------------------- ## +-## Report this to http://gcc.gnu.org/bugs.html ## +-## ------------------------------------------- ## +-_ASBOX ++( $as_echo "## ------------------------------------------------------ ## ++## Report this to http://github.com/atgreen/libffi/issues ## ++## ------------------------------------------------------ ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + eval "$3=\$ac_header_compiler" + fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_header_mongrel + +-# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +-# -------------------------------------------- +-# Tries to find the compile-time value of EXPR in a program that includes +-# INCLUDES, setting VAR accordingly. Returns whether the value could be +-# computed +-ac_fn_c_compute_int () ++# ac_fn_c_check_type LINENO TYPE VAR INCLUDES ++# ------------------------------------------- ++# Tests whether TYPE exists after having included INCLUDES, setting cache ++# variable VAR accordingly. ++ac_fn_c_check_type () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if test "$cross_compiling" = yes; then +- # Depending upon the size, compute the lo and hi bounds. +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++$as_echo_n "checking for $2... " >&6; } ++if eval \${$3+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ eval "$3=no" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + int + main () + { +-static int test_array [1 - 2 * !(($2) >= 0)]; +-test_array [0] = 0 +- ++if (sizeof ($2)) ++ return 0; + ; + return 0; + } + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : +- ac_lo=0 ac_mid=0 +- while :; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + int + main () + { +-static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +-test_array [0] = 0 +- ++if (sizeof (($2))) ++ return 0; + ; + return 0; + } + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=$ac_mid; break +-else +- as_fn_arith $ac_mid + 1 && ac_lo=$as_val +- if test $ac_lo -le $ac_mid; then +- ac_lo= ac_hi= +- break +- fi +- as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ++ ++else ++ eval "$3=yes" + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- done +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array [1 - 2 * !(($2) < 0)]; +-test_array [0] = 0 +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=-1 ac_mid=-1 +- while :; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +-test_array [0] = 0 +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_lo=$ac_mid; break +-else +- as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val +- if test $ac_mid -le $ac_hi; then +- ac_lo= ac_hi= +- break +- fi +- as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- done +-else +- ac_lo= ac_hi= +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-# Binary search between lo and hi bounds. +-while test "x$ac_lo" != "x$ac_hi"; do +- as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +-test_array [0] = 0 +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=$ac_mid +-else +- as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-done +-case $ac_lo in #(( +-?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +-'') ac_retval=1 ;; +-esac +- else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-static long int longval () { return $2; } +-static unsigned long int ulongval () { return $2; } +-#include +-#include +-int +-main () +-{ +- +- FILE *f = fopen ("conftest.val", "w"); +- if (! f) +- return 1; +- if (($2) < 0) +- { +- long int i = longval (); +- if (i != ($2)) +- return 1; +- fprintf (f, "%ld", i); +- } +- else +- { +- unsigned long int i = ulongval (); +- if (i != ($2)) +- return 1; +- fprintf (f, "%lu", i); +- } +- /* Do not output a trailing newline, as this causes \r\n confusion +- on some platforms. */ +- return ferror (f) || fclose (f) != 0; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- echo >>conftest.val; read $3 &5 ++$as_echo "$ac_res" >&6; } ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ ++} # ac_fn_c_check_type + cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by libffi $as_me 3.0.10rc0, which was +-generated by GNU Autoconf 2.65. Invocation command line was ++It was created by libffi $as_me 3.1-rc1, which was ++generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + + _ACEOF + exec 5>>config.log + { + cat <<_ASUNAME + ## --------- ## +@@ -2327,21 +2330,19 @@ done + # would cause problems or look ugly. + # WARNING: Use '\'' to represent an apostrophe within the trap. + # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. + trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + +- cat <<\_ASBOX +-## ---------------- ## ++ $as_echo "## ---------------- ## + ## Cache variables. ## +-## ---------------- ## +-_ASBOX ++## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, + ( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( +@@ -2365,56 +2366,50 @@ trap 'exit_status=$? + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort + ) + echo + +- cat <<\_ASBOX +-## ----------------- ## ++ $as_echo "## ----------------- ## + ## Output variables. ## +-## ----------------- ## +-_ASBOX ++## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then +- cat <<\_ASBOX +-## ------------------- ## ++ $as_echo "## ------------------- ## + ## File substitutions. ## +-## ------------------- ## +-_ASBOX ++## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then +- cat <<\_ASBOX +-## ----------- ## ++ $as_echo "## ----------- ## + ## confdefs.h. ## +-## ----------- ## +-_ASBOX ++## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 +@@ -2459,32 +2454,41 @@ cat >>confdefs.h <<_ACEOF + _ACEOF + + + # Let the site file select an alternate cache file if it wants to. + # Prefer an explicitly selected file to automatically selected ones. + ac_site_file1=NONE + ac_site_file2=NONE + if test -n "$CONFIG_SITE"; then +- ac_site_file1=$CONFIG_SITE ++ # We do not want a PATH search for config.site. ++ case $CONFIG_SITE in #(( ++ -*) ac_site_file1=./$CONFIG_SITE;; ++ */*) ac_site_file1=$CONFIG_SITE;; ++ *) ac_site_file1=./$CONFIG_SITE;; ++ esac + elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site + else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site + fi + for ac_site_file in "$ac_site_file1" "$ac_site_file2" + do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + $as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 +- . "$ac_site_file" ++ . "$ac_site_file" \ ++ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "failed to load site script $ac_site_file ++See \`config.log' for more details" "$LINENO" 5; } + fi + done + + if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +@@ -2550,17 +2554,17 @@ for ac_var in $ac_precious_vars; do + esac + fi + done + if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} +- as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 ++ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + fi + ## -------------------- ## + ## Main body of script. ## + ## -------------------- ## + + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -2568,60 +2572,66 @@ ac_link='$CC -o conftest$ac_exeext $CFLA + ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_config_headers="$ac_config_headers fficonfig.h" + + + ac_aux_dir= + for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do +- for ac_t in install-sh install.sh shtool; do +- if test -f "$ac_dir/$ac_t"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/$ac_t -c" +- break 2 +- fi +- done ++ if test -f "$ac_dir/install-sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f "$ac_dir/install.sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ elif test -f "$ac_dir/shtool"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/shtool install -c" ++ break ++ fi + done + if test -z "$ac_aux_dir"; then +- as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 ++ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + fi + + # These three variables are undocumented and unsupported, + # and are intended to be withdrawn in a future Autoconf release. + # They can cause serious problems if a builder's source tree is in a directory + # whose full name contains unusual characters. + ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. + ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. + ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + # Make sure we can run config.sub. + $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +- as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 ++ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 + $as_echo_n "checking build system type... " >&6; } +-if test "${ac_cv_build+set}" = set; then : ++if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_build_alias=$build_alias + test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + test "x$ac_build_alias" = x && +- as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 ++ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 + ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 + $as_echo "$ac_cv_build" >&6; } + case $ac_cv_build in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; + esac + build=$ac_cv_build + ac_save_IFS=$IFS; IFS='-' + set x $ac_cv_build + shift + build_cpu=$1 + build_vendor=$2 + shift; shift +@@ -2629,32 +2639,32 @@ shift; shift + # except with old shells: + build_os=$* + IFS=$ac_save_IFS + case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 + $as_echo_n "checking host system type... " >&6; } +-if test "${ac_cv_host+set}" = set; then : ++if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build + else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 + $as_echo "$ac_cv_host" >&6; } + case $ac_cv_host in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; + esac + host=$ac_cv_host + ac_save_IFS=$IFS; IFS='-' + set x $ac_cv_host + shift + host_cpu=$1 + host_vendor=$2 + shift; shift +@@ -2662,32 +2672,32 @@ shift; shift + # except with old shells: + host_os=$* + IFS=$ac_save_IFS + case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 + $as_echo_n "checking target system type... " >&6; } +-if test "${ac_cv_target+set}" = set; then : ++if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host + else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 + $as_echo "$ac_cv_target" >&6; } + case $ac_cv_target in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; + esac + target=$ac_cv_target + ac_save_IFS=$IFS; IFS='-' + set x $ac_cv_target + shift + target_cpu=$1 + target_vendor=$2 + shift; shift +@@ -2702,19 +2712,127 @@ case $target_os in *\ *) target_os=`echo + # will get canonicalized. + test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + + target_alias=${target_alias-$host_alias} + +-. ${srcdir}/configure.host +- +-am__api_version='1.11' ++case "${host}" in ++ frv*-elf) ++ LDFLAGS=`echo $LDFLAGS | sed "s/\-B^ *libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ ++ ;; ++esac ++ ++ ++ # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args ++ if test "${ac_configure_args+set}" != "set" ; then ++ ac_configure_args= ++ for ac_arg in ${1+"$@"}; do ++ ac_configure_args="$ac_configure_args '$ac_arg'" ++ done ++ fi ++ ++# expand $ac_aux_dir to an absolute path ++am_aux_dir=`cd $ac_aux_dir && pwd` ++ ++ ++ax_enable_builddir="." ++# Check whether --enable-builddir was given. ++if test "${enable_builddir+set}" = set; then : ++ enableval=$enable_builddir; ax_enable_builddir="$enableval" ++else ++ ax_enable_builddir="auto" ++fi ++ ++if test ".$ac_srcdir_defaulted" != ".no" ; then ++if test ".$srcdir" = ".." ; then ++ if test -f config.status ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: toplevel srcdir already configured... skipping subdir build" >&5 ++$as_echo "$as_me: toplevel srcdir already configured... skipping subdir build" >&6;} ++ else ++ test ".$ax_enable_builddir" = "." && ax_enable_builddir="." ++ test ".$ax_enable_builddir" = ".no" && ax_enable_builddir="." ++ test ".$TARGET" = "." && TARGET="$target" ++ test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="$TARGET" ++ if test ".$ax_enable_builddir" != ".." ; then # we know where to go and ++ as_dir=$ax_enable_builddir; as_fn_mkdir_p ++ echo __.$ax_enable_builddir.__ > $ax_enable_builddir/conftest.tmp ++ cd $ax_enable_builddir ++ if grep __.$ax_enable_builddir.__ conftest.tmp >/dev/null 2>/dev/null ; then ++ rm conftest.tmp ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: continue configure in default builddir \"./$ax_enable_builddir\"" >&5 ++$as_echo "continue configure in default builddir \"./$ax_enable_builddir\"" >&6; } ++ else ++ as_fn_error $? "could not change to default builddir \"./$ax_enable_builddir\"" "$LINENO" 5 ++ fi ++ srcdir=`echo "$ax_enable_builddir" | ++ sed -e 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g;s,[/]$,,;'` ++ # going to restart from subdirectory location ++ test -f $srcdir/config.log && mv $srcdir/config.log . ++ test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . ++ test -f $srcdir/conftest.log && mv $srcdir/conftest.log . ++ test -f $srcdir/$cache_file && mv $srcdir/$cache_file . ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&5 ++$as_echo "....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&6; } ++ case "$0" in # restart ++ /\\*) eval $SHELL "'$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; ++ *) eval $SHELL "'$srcdir/$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; ++ esac ; exit $? ++ fi ++ fi ++fi fi ++test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="." ++# Extract the first word of "gsed sed", so it can be a program name with args. ++set dummy gsed sed; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_ax_enable_builddir_sed+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $ax_enable_builddir_sed in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_ax_enable_builddir_sed="$ax_enable_builddir_sed" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_ax_enable_builddir_sed="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ test -z "$ac_cv_path_ax_enable_builddir_sed" && ac_cv_path_ax_enable_builddir_sed="sed" ++ ;; ++esac ++fi ++ax_enable_builddir_sed=$ac_cv_path_ax_enable_builddir_sed ++if test -n "$ax_enable_builddir_sed"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_enable_builddir_sed" >&5 ++$as_echo "$ax_enable_builddir_sed" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++ax_enable_builddir_auxdir="$am_aux_dir" ++ac_config_commands="$ac_config_commands buildir" ++ ++ ++am__api_version='1.13' + + # Find a good install program. We prefer a C program (faster), + # so one script is as good as another. But avoid the broken or + # incompatible versions: + # SysV /etc/install, /usr/sbin/install + # SunOS /usr/etc/install + # IRIX /sbin/install + # AIX /bin/install +@@ -2723,17 +2841,17 @@ am__api_version='1.11' + # AFS /usr/afsws/bin/install, which mishandles nonexistent args + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" + # OS/2's system install, which has a completely different semantic + # ./install, which can be erroneously created by make from ./install.sh. + # Reject install programs that cannot install multiple files. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 + $as_echo_n "checking for a BSD-compatible install... " >&6; } + if test -z "$INSTALL"; then +-if test "${ac_cv_path_install+set}" = set; then : ++if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +@@ -2743,17 +2861,17 @@ case $as_dir/ in #(( + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : +@@ -2801,128 +2919,140 @@ fi + test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + + test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + + test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 + $as_echo_n "checking whether build environment is sane... " >&6; } +-# Just in case +-sleep 1 +-echo timestamp > conftest.file + # Reject unsafe characters in $srcdir or the absolute working directory + # name. Accept space and tab only in the latter. + am_lf=' + ' + case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) +- as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; ++ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; + esac + case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) +- as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +-esac +- +-# Do `set' in a subshell so we don't clobber the current shell's ++ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; ++esac ++ ++# Do 'set' in a subshell so we don't clobber the current shell's + # arguments. Must try -L first in case configure is actually a + # symlink; some systems play weird games with the mod time of symlinks + # (eg FreeBSD returns the mod time of the symlink's containing + # directory). + if ( +- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` +- if test "$*" = "X"; then +- # -L didn't work. +- set X `ls -t "$srcdir/configure" conftest.file` +- fi +- rm -f conftest.file +- if test "$*" != "X $srcdir/configure conftest.file" \ +- && test "$*" != "X conftest.file $srcdir/configure"; then +- +- # If neither matched, then we have a broken ls. This can happen +- # if, for instance, CONFIG_SHELL is bash and it inherits a +- # broken ls alias from the environment. This has actually +- # happened. Such a system could not be considered "sane". +- as_fn_error "ls -t appears to fail. Make sure there is not a broken +-alias in your environment" "$LINENO" 5 +- fi +- ++ am_has_slept=no ++ for am_try in 1 2; do ++ echo "timestamp, slept: $am_has_slept" > conftest.file ++ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` ++ if test "$*" = "X"; then ++ # -L didn't work. ++ set X `ls -t "$srcdir/configure" conftest.file` ++ fi ++ if test "$*" != "X $srcdir/configure conftest.file" \ ++ && test "$*" != "X conftest.file $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken ++ alias in your environment" "$LINENO" 5 ++ fi ++ if test "$2" = conftest.file || test $am_try -eq 2; then ++ break ++ fi ++ # Just in case. ++ sleep 1 ++ am_has_slept=yes ++ done + test "$2" = conftest.file + ) + then + # Ok. + : + else +- as_fn_error "newly created file is older than distributed files! ++ as_fn_error $? "newly created file is older than distributed files! + Check your system clock" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } ++# If we didn't sleep, we still need to ensure time stamps of config.status and ++# generated files are strictly newer. ++am_sleep_pid= ++if grep 'slept: no' conftest.file >/dev/null 2>&1; then ++ ( sleep 1 ) & ++ am_sleep_pid=$! ++fi ++ ++rm -f conftest.file ++ + test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" + # Use a double $ so make ignores it. + test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" + # Double any \ or $. + # By default was `s,x,x', remove it if useless. + ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' + program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +-# expand $ac_aux_dir to an absolute path +-am_aux_dir=`cd $ac_aux_dir && pwd` +- + if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac + fi + # Use eval to expand $SHELL +-if eval "$MISSING --run true"; then +- am_missing_run="$MISSING --run " ++if eval "$MISSING --is-lightweight"; then ++ am_missing_run="$MISSING " + else + am_missing_run= +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 ++$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} + fi + + if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac + fi + +-# Installed binaries are usually stripped using `strip' when the user +-# run `make install-strip'. However `strip' might not be the right ++# Installed binaries are usually stripped using 'strip' when the user ++# run "make install-strip". However 'strip' might not be the right + # tool to use in cross-compilation environments, therefore Automake +-# will honor the `STRIP' environment variable to overrule this program. ++# will honor the 'STRIP' environment variable to overrule this program. + if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. + set dummy ${ac_tool_prefix}strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_STRIP+set}" = set; then : ++if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -2940,29 +3070,29 @@ fi + + fi + if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. + set dummy strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : ++if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -2993,27 +3123,27 @@ else + fi + + fi + INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 + $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } + if test -z "$MKDIR_P"; then +- if test "${ac_cv_path_mkdir+set}" = set; then : ++ if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do +- { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue ++ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done +@@ -3032,41 +3162,35 @@ fi + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 + $as_echo "$MKDIR_P" >&6; } + +-mkdir_p="$MKDIR_P" +-case $mkdir_p in +- [\\/$]* | ?:[\\/]*) ;; +- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +-esac +- + for ac_prog in gawk mawk nawk awk + do + # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_AWK+set}" = set; then : ++if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -3084,25 +3208,25 @@ fi + + test -n "$AWK" && break + done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 + $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } + set x ${MAKE-make} + ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat >conftest.make <<\_ACEOF + SHELL = /bin/sh + all: + @echo '@@@%%%=$(MAKE)=@@@%%%' + _ACEOF +-# GNU make sometimes prints "make[1]: Entering...", which would confuse us. ++# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. + case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; + esac + rm -f conftest.make + fi +@@ -3120,39 +3244,78 @@ rm -rf .tst 2>/dev/null + mkdir .tst 2>/dev/null + if test -d .tst; then + am__leading_dot=. + else + am__leading_dot=_ + fi + rmdir .tst 2>/dev/null + ++# Check whether --enable-silent-rules was given. ++if test "${enable_silent_rules+set}" = set; then : ++ enableval=$enable_silent_rules; ++fi ++ ++case $enable_silent_rules in # ((( ++ yes) AM_DEFAULT_VERBOSITY=0;; ++ no) AM_DEFAULT_VERBOSITY=1;; ++ *) AM_DEFAULT_VERBOSITY=1;; ++esac ++am_make=${MAKE-make} ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 ++$as_echo_n "checking whether $am_make supports nested variables... " >&6; } ++if ${am_cv_make_support_nested_variables+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if $as_echo 'TRUE=$(BAR$(V)) ++BAR0=false ++BAR1=true ++V=1 ++am__doit: ++ @$(TRUE) ++.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then ++ am_cv_make_support_nested_variables=yes ++else ++ am_cv_make_support_nested_variables=no ++fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 ++$as_echo "$am_cv_make_support_nested_variables" >&6; } ++if test $am_cv_make_support_nested_variables = yes; then ++ AM_V='$(V)' ++ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' ++else ++ AM_V=$AM_DEFAULT_VERBOSITY ++ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY ++fi ++AM_BACKSLASH='\' ++ + if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then +- as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 ++ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi + fi + + # test whether we have cygpath + if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi + fi + + + # Define the identity of the package. + PACKAGE='libffi' +- VERSION='3.0.10rc0' ++ VERSION='3.1-rc1' + + + cat >>confdefs.h <<_ACEOF + #define PACKAGE "$PACKAGE" + _ACEOF + + + cat >>confdefs.h <<_ACEOF +@@ -3170,23 +3333,34 @@ AUTOCONF=${AUTOCONF-"${am_missing_run}au + AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + + AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + + MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + ++# For better backward compatibility. To be removed once Automake 1.9.x ++# dies out for good. For more background, see: ++# ++# ++mkdir_p='$(MKDIR_P)' ++ + # We need awk for the "check" target. The system "awk" is bad on + # some platforms. +-# Always define AMTAR for backward compatibility. +- +-AMTAR=${AMTAR-"${am_missing_run}tar"} +- +-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ++# Always define AMTAR for backward compatibility. Yes, it's still used ++# in the wild :-( We should find a proper way to deprecate it ... ++AMTAR='$${TAR-tar}' ++ ++ ++# We'll loop over all known methods to create a tar archive until one works. ++_am_tools='gnutar pax cpio none' ++ ++am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ++ + + + + + + + # The same as in boehm-gc and libstdc++. Have to borrow it from there. + # We must force CC to /not/ be precious variables; otherwise +@@ -3203,29 +3377,29 @@ ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. + set dummy ${ac_tool_prefix}gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -3243,29 +3417,29 @@ fi + + fi + if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. + set dummy gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -3296,29 +3470,29 @@ else + fi + + if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + set dummy ${ac_tool_prefix}cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -3336,30 +3510,30 @@ fi + + fi + fi + if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. + set dummy cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else + ac_prog_rejected=no + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +@@ -3395,29 +3569,29 @@ fi + if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. + set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -3439,29 +3613,29 @@ fi + if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe + do + # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -3493,18 +3667,18 @@ esac + fi + fi + + fi + + + test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "no acceptable C compiler found in \$PATH +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "no acceptable C compiler found in \$PATH ++See \`config.log' for more details" "$LINENO" 5; } + + # Provide some information about the compiler. + $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 + set X $ac_compile + ac_compiler=$2 + for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" + case "(($ac_try" in +@@ -3608,19 +3782,18 @@ fi + if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + $as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-{ as_fn_set_status 77 +-as_fn_error "C compiler cannot create executables +-See \`config.log' for more details." "$LINENO" 5; }; } ++as_fn_error 77 "C compiler cannot create executables ++See \`config.log' for more details" "$LINENO" 5; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 + $as_echo_n "checking for C compiler default output file name... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 + $as_echo "$ac_file" >&6; } +@@ -3652,18 +3825,18 @@ for ac_file in conftest.exe conftest con + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac + done + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "cannot compute suffix of executables: cannot compile and link +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details" "$LINENO" 5; } + fi + rm -f conftest conftest$ac_cv_exeext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 + $as_echo "$ac_cv_exeext" >&6; } + + rm -f conftest.$ac_ext + EXEEXT=$ac_cv_exeext + ac_exeext=$EXEEXT +@@ -3710,30 +3883,30 @@ eval ac_try_echo="\"\$as_me:${as_lineno- + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "cannot run C compiled programs. ++as_fn_error $? "cannot run C compiled programs. + If you meant to cross compile, use \`--host'. +-See \`config.log' for more details." "$LINENO" 5; } ++See \`config.log' for more details" "$LINENO" 5; } + fi + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 + $as_echo "$cross_compiling" >&6; } + + rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out + ac_clean_files=$ac_clean_files_save + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 + $as_echo_n "checking for suffix of object files... " >&6; } +-if test "${ac_cv_objext+set}" = set; then : ++if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int + main () + { +@@ -3763,28 +3936,28 @@ eval ac_try_echo="\"\$as_me:${as_lineno- + esac + done + else + $as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "cannot compute suffix of object files: cannot compile +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "cannot compute suffix of object files: cannot compile ++See \`config.log' for more details" "$LINENO" 5; } + fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 + $as_echo "$ac_cv_objext" >&6; } + OBJEXT=$ac_cv_objext + ac_objext=$OBJEXT + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 + $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if test "${ac_cv_c_compiler_gnu+set}" = set; then : ++if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int + main () + { +@@ -3811,17 +3984,17 @@ if test $ac_compiler_gnu = yes; then + GCC=yes + else + GCC= + fi + ac_test_CFLAGS=${CFLAGS+set} + ac_save_CFLAGS=$CFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 + $as_echo_n "checking whether $CC accepts -g... " >&6; } +-if test "${ac_cv_prog_cc_g+set}" = set; then : ++if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +@@ -3889,27 +4062,26 @@ else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 + $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if test "${ac_cv_prog_cc_c89+set}" = set; then : ++if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_cv_prog_cc_c89=no + ac_save_CC=$CC + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + #include +-#include +-#include ++struct stat; + /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ + struct buf { int x; }; + FILE * (*rcsopen) (struct buf *, struct stat *, int); + static char *e (p, i) + char **p; + int i; + { + return p[i]; +@@ -4002,17 +4174,17 @@ END + # If we don't find an include directive, just comment out the code. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 + $as_echo_n "checking for style of include used by $am_make... " >&6; } + am__include="#" + am__quote= + _am_result=none + # First try GNU make style include. + echo "include confinc" > confmf +-# Ignore all kinds of additional output from `make'. ++# Ignore all kinds of additional output from 'make'. + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; + esac + # Now try BSD make style include. +@@ -4035,40 +4207,42 @@ rm -f confinc confmf + # Check whether --enable-dependency-tracking was given. + if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; + fi + + if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' ++ am__nodep='_no' + fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' + else + AMDEP_TRUE='#' + AMDEP_FALSE= + fi + + + + depcc="$CC" am_compiler_list= + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 + $as_echo_n "checking dependency style of $depcc... " >&6; } +-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : ++if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up +- # making a dummy file named `D' -- because `-MD' means `put the output +- # in D'. ++ # making a dummy file named 'D' -- because '-MD' means "put the output ++ # in D". ++ rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a +@@ -4092,44 +4266,44 @@ else + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c +- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with +- # Solaris 8's {/usr,}/bin/sh. +- touch sub/conftst$i.h ++ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with ++ # Solaris 10 /bin/sh. ++ echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + +- # We check with `-c' and `-o' for the sake of the "dashmstdout" ++ # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly +- # handle `-M -o', and we need to detect this. Also, some Intel +- # versions had trouble with output in subdirs ++ # handle '-M -o', and we need to detect this. Also, some Intel ++ # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) +- # after this tag, mechanisms are not by side-effect, so they'll +- # only be used when explicitly requested ++ # After this tag, mechanisms are not by side-effect, so they'll ++ # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; +- msvisualcpp | msvcmsys) +- # This compiler won't grok `-c -o', but also, the minuso test has ++ msvc7 | msvc7msys | msvisualcpp | msvcmsys) ++ # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ +@@ -4190,25 +4364,26 @@ test "${CCAS+set}" = set || CCAS=$CC + test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS + + + + depcc="$CCAS" am_compiler_list= + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 + $as_echo_n "checking dependency style of $depcc... " >&6; } +-if test "${am_cv_CCAS_dependencies_compiler_type+set}" = set; then : ++if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up +- # making a dummy file named `D' -- because `-MD' means `put the output +- # in D'. ++ # making a dummy file named 'D' -- because '-MD' means "put the output ++ # in D". ++ rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a +@@ -4230,44 +4405,44 @@ else + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c +- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with +- # Solaris 8's {/usr,}/bin/sh. +- touch sub/conftst$i.h ++ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with ++ # Solaris 10 /bin/sh. ++ echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + +- # We check with `-c' and `-o' for the sake of the "dashmstdout" ++ # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly +- # handle `-M -o', and we need to detect this. Also, some Intel +- # versions had trouble with output in subdirs ++ # handle '-M -o', and we need to detect this. Also, some Intel ++ # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) +- # after this tag, mechanisms are not by side-effect, so they'll +- # only be used when explicitly requested ++ # After this tag, mechanisms are not by side-effect, so they'll ++ # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; +- msvisualcpp | msvcmsys) +- # This compiler won't grok `-c -o', but also, the minuso test has ++ msvc7 | msvc7msys | msvisualcpp | msvcmsys) ++ # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ +@@ -4320,17 +4495,17 @@ if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 + $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 + $as_echo_n "checking whether cc understands -c and -o together... " >&6; } + fi + set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +-if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int + main () + { +@@ -4445,36 +4620,105 @@ fi + case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 + $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; + esac + + + +-macro_version='2.2.6b' +-macro_revision='1.3017' ++macro_version='2.4.2' ++macro_revision='1.3337' + + + + + + + + + + + + + + ltmain="$ac_aux_dir/ltmain.sh" + ++# Backslashify metacharacters that are still active within ++# double-quoted strings. ++sed_quote_subst='s/\(["`$\\]\)/\\\1/g' ++ ++# Same as above, but do not quote variable references. ++double_quote_subst='s/\(["`\\]\)/\\\1/g' ++ ++# Sed substitution to delay expansion of an escaped shell variable in a ++# double_quote_subst'ed string. ++delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' ++ ++# Sed substitution to delay expansion of an escaped single quote. ++delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' ++ ++# Sed substitution to avoid accidental globbing in evaled expressions ++no_glob_subst='s/\*/\\\*/g' ++ ++ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ++ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ++ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 ++$as_echo_n "checking how to print strings... " >&6; } ++# Test print first, because it will be a builtin if present. ++if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ ++ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ++ ECHO='print -r --' ++elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ++ ECHO='printf %s\n' ++else ++ # Use this function as a fallback that always works. ++ func_fallback_echo () ++ { ++ eval 'cat <<_LTECHO_EOF ++$1 ++_LTECHO_EOF' ++ } ++ ECHO='func_fallback_echo' ++fi ++ ++# func_echo_all arg... ++# Invoke $ECHO with all args, space-separated. ++func_echo_all () ++{ ++ $ECHO "" ++} ++ ++case "$ECHO" in ++ printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 ++$as_echo "printf" >&6; } ;; ++ print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 ++$as_echo "print -r" >&6; } ;; ++ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 ++$as_echo "cat" >&6; } ;; ++esac ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 + $as_echo_n "checking for a sed that does not truncate output... " >&6; } +-if test "${ac_cv_path_SED+set}" = set; then : ++if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} +@@ -4484,17 +4728,17 @@ else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue ++ as_fn_executable_p "$ac_path_SED" || continue + # Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED + case `"$ac_path_SED" --version 2>&1` in + *GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; + *) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" +@@ -4519,17 +4763,17 @@ case `"$ac_path_SED" --version 2>&1` in + esac + + $ac_path_SED_found && break 3 + done + done + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then +- as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 ++ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi + else + ac_cv_path_SED=$SED + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 + $as_echo "$ac_cv_path_SED" >&6; } +@@ -4546,31 +4790,31 @@ Xsed="$SED -e 1s/^X//" + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 + $as_echo_n "checking for grep that handles long lines and -e... " >&6; } +-if test "${ac_cv_path_GREP+set}" = set; then : ++if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue ++ as_fn_executable_p "$ac_path_GREP" || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP + case `"$ac_path_GREP" --version 2>&1` in + *GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; + *) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" +@@ -4595,48 +4839,48 @@ case `"$ac_path_GREP" --version 2>&1` in + esac + + $ac_path_GREP_found && break 3 + done + done + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then +- as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_GREP=$GREP + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 + $as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 + $as_echo_n "checking for egrep... " >&6; } +-if test "${ac_cv_path_EGREP+set}" = set; then : ++if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue ++ as_fn_executable_p "$ac_path_EGREP" || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP + case `"$ac_path_EGREP" --version 2>&1` in + *GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; + *) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" +@@ -4661,49 +4905,49 @@ case `"$ac_path_EGREP" --version 2>&1` i + esac + + $ac_path_EGREP_found && break 3 + done + done + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then +- as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_EGREP=$EGREP + fi + + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 + $as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 + $as_echo_n "checking for fgrep... " >&6; } +-if test "${ac_cv_path_FGREP+set}" = set; then : ++if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue ++ as_fn_executable_p "$ac_path_FGREP" || continue + # Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP + case `"$ac_path_FGREP" --version 2>&1` in + *GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; + *) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" +@@ -4728,17 +4972,17 @@ case `"$ac_path_FGREP" --version 2>&1` i + esac + + $ac_path_FGREP_found && break 3 + done + done + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then +- as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_FGREP=$FGREP + fi + + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +@@ -4807,17 +5051,17 @@ if test "$GCC" = yes; then + esac + elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 + $as_echo_n "checking for GNU ld... " >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 + $as_echo_n "checking for non-GNU ld... " >&6; } + fi +-if test "${lt_cv_path_LD+set}" = set; then : ++if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +@@ -4844,20 +5088,20 @@ fi + LD="$lt_cv_path_LD" + if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 + $as_echo "$LD" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + fi +-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 ++test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 + $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +-if test "${lt_cv_prog_gnu_ld+set}" = set; then : ++if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 + else + # I'd rather use --version here, but apparently some GNU lds only accept -v. + case `$LD -v 2>&1 &5 + $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +-if test "${lt_cv_path_NM+set}" = set; then : ++if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" + else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +@@ -4927,36 +5171,39 @@ else + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 + $as_echo "$lt_cv_path_NM" >&6; } + if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" + else + # Didn't find any BSD compatible name lister, look for dumpbin. +- if test -n "$ac_tool_prefix"; then +- for ac_prog in "dumpbin -symbols" "link -dump -symbols" ++ if test -n "$DUMPBIN"; then : ++ # Let the user override the test. ++ else ++ if test -n "$ac_tool_prefix"; then ++ for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. + set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_DUMPBIN+set}" = set; then : ++if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -4972,35 +5219,35 @@ else + fi + + + test -n "$DUMPBIN" && break + done + fi + if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN +- for ac_prog in "dumpbin -symbols" "link -dump -symbols" ++ for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : ++if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -5027,42 +5274,51 @@ yes:) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 + $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} + ac_tool_warned=yes ;; + esac + DUMPBIN=$ac_ct_DUMPBIN + fi + fi + ++ case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in ++ *COFF*) ++ DUMPBIN="$DUMPBIN -symbols" ++ ;; ++ *) ++ DUMPBIN=: ++ ;; ++ esac ++ fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi + fi + test -z "$NM" && NM=nm + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 + $as_echo_n "checking the name lister ($NM) interface... " >&6; } +-if test "${lt_cv_nm_interface+set}" = set; then : ++if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:5054: $ac_compile\"" >&5) ++ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 +- (eval echo "\"\$as_me:5057: $NM \\\"conftest.$ac_objext\\\"\"" >&5) ++ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 +- (eval echo "\"\$as_me:5060: output\"" >&5) ++ (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 + $as_echo "$lt_cv_nm_interface" >&6; } +@@ -5076,17 +5332,17 @@ if test "$LN_S" = "ln -s"; then + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 + $as_echo "no, using $LN_S" >&6; } + fi + + # find the maximum length of command line arguments + { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 + $as_echo_n "checking the maximum length of command line arguments... " >&6; } +-if test "${lt_cv_sys_max_cmd_len+set}" = set; then : ++if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 + else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc +@@ -5109,16 +5365,21 @@ else + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + ++ mint*) ++ # On MiNT this can take a long time and run out of memory. ++ lt_cv_sys_max_cmd_len=8192; ++ ;; ++ + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. +@@ -5134,16 +5395,21 @@ else + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + ++ os2*) ++ # The test takes a long time on OS/2. ++ lt_cv_sys_max_cmd_len=8192 ++ ;; ++ + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then +@@ -5173,18 +5439,18 @@ else + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. +- while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ +- = "XX$teststring$teststring"; } >/dev/null 2>&1 && ++ while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ ++ = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= +@@ -5216,18 +5482,18 @@ max_cmd_len=$lt_cv_sys_max_cmd_len + : ${MV="mv -f"} + : ${RM="rm -f"} + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 + $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } + # Try some XSI features + xsi_shell=no + ( _lt_dummy="a/b/c" +- test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ +- = c,a/b,, \ ++ test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ ++ = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 + $as_echo "$xsi_shell" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +@@ -5266,32 +5532,111 @@ esac + + + + + + + + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 ++$as_echo_n "checking how to convert $build file names to $host format... " >&6; } ++if ${lt_cv_to_host_file_cmd+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $host in ++ *-*-mingw* ) ++ case $build in ++ *-*-mingw* ) # actually msys ++ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ++ ;; ++ *-*-cygwin* ) ++ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ++ ;; ++ * ) # otherwise, assume *nix ++ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ++ ;; ++ esac ++ ;; ++ *-*-cygwin* ) ++ case $build in ++ *-*-mingw* ) # actually msys ++ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ++ ;; ++ *-*-cygwin* ) ++ lt_cv_to_host_file_cmd=func_convert_file_noop ++ ;; ++ * ) # otherwise, assume *nix ++ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ++ ;; ++ esac ++ ;; ++ * ) # unhandled hosts (and "normal" native builds) ++ lt_cv_to_host_file_cmd=func_convert_file_noop ++ ;; ++esac ++ ++fi ++ ++to_host_file_cmd=$lt_cv_to_host_file_cmd ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 ++$as_echo "$lt_cv_to_host_file_cmd" >&6; } ++ ++ ++ ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 ++$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } ++if ${lt_cv_to_tool_file_cmd+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ #assume ordinary cross tools, or native build. ++lt_cv_to_tool_file_cmd=func_convert_file_noop ++case $host in ++ *-*-mingw* ) ++ case $build in ++ *-*-mingw* ) # actually msys ++ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ++ ;; ++ esac ++ ;; ++esac ++ ++fi ++ ++to_tool_file_cmd=$lt_cv_to_tool_file_cmd ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 ++$as_echo "$lt_cv_to_tool_file_cmd" >&6; } ++ ++ ++ ++ ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 + $as_echo_n "checking for $LD option to reload object files... " >&6; } +-if test "${lt_cv_ld_reload_flag+set}" = set; then : ++if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_ld_reload_flag='-r' + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 + $as_echo "$lt_cv_ld_reload_flag" >&6; } + reload_flag=$lt_cv_ld_reload_flag + case $reload_flag in + "" | " "*) ;; + *) reload_flag=" $reload_flag" ;; + esac + reload_cmds='$LD$reload_flag -o $output$reload_objs' + case $host_os in ++ cygwin* | mingw* | pw32* | cegcc*) ++ if test "$GCC" != yes; then ++ reload_cmds=false ++ fi ++ ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; + esac +@@ -5304,29 +5649,29 @@ esac + + + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. + set dummy ${ac_tool_prefix}objdump; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_OBJDUMP+set}" = set; then : ++if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -5344,29 +5689,29 @@ fi + + fi + if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. + set dummy objdump; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : ++if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -5403,17 +5748,17 @@ test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 + $as_echo_n "checking how to recognize dependent libraries... " >&6; } +-if test "${lt_cv_deplibs_check_method+set}" = set; then : ++if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_file_magic_cmd='$MAGIC_CMD' + lt_cv_file_magic_test_file= + lt_cv_deplibs_check_method='unknown' + # Need to set the preceding variable on all platforms that support + # interlibrary dependencies. + # 'none' -- dependencies not supported. +@@ -5445,26 +5790,28 @@ cygwin*) + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + + mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. +- if ( file / ) >/dev/null 2>&1; then ++ # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. ++ if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else +- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' ++ # Keep this pattern in sync with the one in func_win32_libid. ++ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +-cegcc) ++cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + + darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; +@@ -5484,29 +5831,33 @@ freebsd* | dragonfly*) + lt_cv_deplibs_check_method=pass_all + fi + ;; + + gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++haiku*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ + hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + + interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' +@@ -5517,18 +5868,18 @@ irix5* | irix6* | nonstopux*) + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +-# This must be Linux ELF. +-linux* | k*bsd*-gnu) ++# This must be glibc/ELF. ++linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' +@@ -5599,154 +5950,387 @@ sysv4 | sysv4.3*) + tpf*) + lt_cv_deplibs_check_method=pass_all + ;; + esac + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 + $as_echo "$lt_cv_deplibs_check_method" >&6; } ++ ++file_magic_glob= ++want_nocaseglob=no ++if test "$build" = "$host"; then ++ case $host_os in ++ mingw* | pw32*) ++ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then ++ want_nocaseglob=yes ++ else ++ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` ++ fi ++ ;; ++ esac ++fi ++ + file_magic_cmd=$lt_cv_file_magic_cmd + deplibs_check_method=$lt_cv_deplibs_check_method + test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ar; ac_word=$2 ++ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. ++set dummy ${ac_tool_prefix}dlltool; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_AR+set}" = set; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AR"; then +- ac_cv_prog_AR="$AR" # Let the user override the test. ++if ${ac_cv_prog_DLLTOOL+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$DLLTOOL"; then ++ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then +- ac_cv_prog_AR="${ac_tool_prefix}ar" ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + + fi + fi +-AR=$ac_cv_prog_AR +-if test -n "$AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +-$as_echo "$AR" >&6; } ++DLLTOOL=$ac_cv_prog_DLLTOOL ++if test -n "$DLLTOOL"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 ++$as_echo "$DLLTOOL" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + fi + + + fi +-if test -z "$ac_cv_prog_AR"; then +- ac_ct_AR=$AR +- # Extract the first word of "ar", so it can be a program name with args. +-set dummy ar; ac_word=$2 ++if test -z "$ac_cv_prog_DLLTOOL"; then ++ ac_ct_DLLTOOL=$DLLTOOL ++ # Extract the first word of "dlltool", so it can be a program name with args. ++set dummy dlltool; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_AR"; then +- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. ++if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$ac_ct_DLLTOOL"; then ++ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then +- ac_cv_prog_ac_ct_AR="ar" ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + + fi + fi +-ac_ct_AR=$ac_cv_prog_ac_ct_AR +-if test -n "$ac_ct_AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +-$as_echo "$ac_ct_AR" >&6; } ++ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL ++if test -n "$ac_ct_DLLTOOL"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 ++$as_echo "$ac_ct_DLLTOOL" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + fi + +- if test "x$ac_ct_AR" = x; then +- AR="false" ++ if test "x$ac_ct_DLLTOOL" = x; then ++ DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in + yes:) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 + $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} + ac_tool_warned=yes ;; + esac ++ DLLTOOL=$ac_ct_DLLTOOL ++ fi ++else ++ DLLTOOL="$ac_cv_prog_DLLTOOL" ++fi ++ ++test -z "$DLLTOOL" && DLLTOOL=dlltool ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 ++$as_echo_n "checking how to associate runtime and link libraries... " >&6; } ++if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ lt_cv_sharedlib_from_linklib_cmd='unknown' ++ ++case $host_os in ++cygwin* | mingw* | pw32* | cegcc*) ++ # two different shell functions defined in ltmain.sh ++ # decide which to use based on capabilities of $DLLTOOL ++ case `$DLLTOOL --help 2>&1` in ++ *--identify-strict*) ++ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ++ ;; ++ *) ++ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ++ ;; ++ esac ++ ;; ++*) ++ # fallback: assume linklib IS sharedlib ++ lt_cv_sharedlib_from_linklib_cmd="$ECHO" ++ ;; ++esac ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 ++$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } ++sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd ++test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO ++ ++ ++ ++ ++ ++ ++ ++ ++if test -n "$ac_tool_prefix"; then ++ for ac_prog in ar ++ do ++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. ++set dummy $ac_tool_prefix$ac_prog; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_AR+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$AR"; then ++ ac_cv_prog_AR="$AR" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_AR="$ac_tool_prefix$ac_prog" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++AR=$ac_cv_prog_AR ++if test -n "$AR"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 ++$as_echo "$AR" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++ test -n "$AR" && break ++ done ++fi ++if test -z "$AR"; then ++ ac_ct_AR=$AR ++ for ac_prog in ar ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_ac_ct_AR+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$ac_ct_AR"; then ++ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_AR="$ac_prog" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++ac_ct_AR=$ac_cv_prog_ac_ct_AR ++if test -n "$ac_ct_AR"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 ++$as_echo "$ac_ct_AR" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++ test -n "$ac_ct_AR" && break ++done ++ ++ if test "x$ac_ct_AR" = x; then ++ AR="false" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac + AR=$ac_ct_AR + fi +-else +- AR="$ac_cv_prog_AR" +-fi +- +-test -z "$AR" && AR=ar +-test -z "$AR_FLAGS" && AR_FLAGS=cru +- +- +- +- ++fi ++ ++: ${AR=ar} ++: ${AR_FLAGS=cru} ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 ++$as_echo_n "checking for archiver @FILE support... " >&6; } ++if ${lt_cv_ar_at_file+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ lt_cv_ar_at_file=no ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ echo conftest.$ac_objext > conftest.lst ++ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' ++ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 ++ (eval $lt_ar_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++ if test "$ac_status" -eq 0; then ++ # Ensure the archiver fails upon bogus file names. ++ rm -f conftest.$ac_objext libconftest.a ++ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 ++ (eval $lt_ar_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++ if test "$ac_status" -ne 0; then ++ lt_cv_ar_at_file=@ ++ fi ++ fi ++ rm -f conftest.* libconftest.a ++ ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 ++$as_echo "$lt_cv_ar_at_file" >&6; } ++ ++if test "x$lt_cv_ar_at_file" = xno; then ++ archiver_list_spec= ++else ++ archiver_list_spec=$lt_cv_ar_at_file ++fi + + + + + + + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. + set dummy ${ac_tool_prefix}strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_STRIP+set}" = set; then : ++if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -5764,29 +6348,29 @@ fi + + fi + if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. + set dummy strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : ++if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -5823,29 +6407,29 @@ test -z "$STRIP" && STRIP=: + + + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. + set dummy ${ac_tool_prefix}ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_RANLIB+set}" = set; then : ++if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -5863,29 +6447,29 @@ fi + + fi + if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. + set dummy ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : ++if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -5925,24 +6509,36 @@ test -z "$RANLIB" && RANLIB=: + # Determine commands to create old-style static archives. + old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' + old_postinstall_cmds='chmod 644 $oldlib' + old_postuninstall_cmds= + + if test -n "$RANLIB"; then + case $host_os in + openbsd*) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" +- ;; +- esac +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +-fi ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ++ ;; ++ esac ++ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" ++fi ++ ++case $host_os in ++ darwin*) ++ lock_old_archive_extraction=yes ;; ++ *) ++ lock_old_archive_extraction=no ;; ++esac ++ ++ ++ ++ ++ + + + + + + + + +@@ -5980,17 +6576,17 @@ LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + + # Allow CC to be a program name with arguments. + compiler=$CC + + + # Check for command to grab the raw symbol name followed by C symbol from nm. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 + $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : ++if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 + else + + # These are sane defaults that work on at least a few old systems. + # [They come from Ultrix. What could be older than Ultrix?!! ;)] + + # Character class describing NM global symbol codes. + symcode='[BCDEGRST]' +@@ -6041,18 +6637,18 @@ case `$NM -V 2>&1` in + esac + + # Transform an extracted symbol line into a proper C declaration. + # Some systems (esp. on ia64) link data and code symbols differently, + # so use this general approach. + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + + # Transform an extracted symbol line into symbol name and symbol address +-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" ++lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" ++lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + + # Handle CRLF in mingw tool chain + opt_cr= + case $build_os in + mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; + esac +@@ -6066,28 +6662,30 @@ for ac_symprfx in "" "_"; do + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ + " {last_section=section; section=\$ 3};"\ ++" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ + " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ + " \$ 0!~/External *\|/{next};"\ + " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ + " {if(hide[section]) next};"\ + " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ + " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ + " s[1]~/^[@?]/{print s[1], s[1]; next};"\ + " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ + " ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi ++ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF + #ifdef __cplusplus + extern "C" { +@@ -6103,44 +6701,56 @@ int main(){nm_test_var='a';nm_test_func( + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 +- (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 ++ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext ++/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ ++#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) ++/* DATA imports from DLLs on WIN32 con't be const, because runtime ++ relocations are performed -- see ld's documentation on pseudo-relocs. */ ++# define LT_DLSYM_CONST ++#elif defined(__osf__) ++/* This system does not cope well with relocations in const data. */ ++# define LT_DLSYM_CONST ++#else ++# define LT_DLSYM_CONST const ++#endif ++ + #ifdef __cplusplus + extern "C" { + #endif + + _LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + + /* The mapping between symbol names and symbols. */ +-const struct { ++LT_DLSYM_CONST struct { + const char *name; + void *address; + } + lt__PROGRAM__LTX_preloaded_symbols[] = + { + { "@PROGRAM@", (void *) 0 }, + _LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext +@@ -6156,29 +6766,29 @@ static const void *lt_preloaded_setup() + #endif + + #ifdef __cplusplus + } + #endif + _LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext +- lt_save_LIBS="$LIBS" +- lt_save_CFLAGS="$CFLAGS" ++ lt_globsym_save_LIBS=$LIBS ++ lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi +- LIBS="$lt_save_LIBS" +- CFLAGS="$lt_save_CFLAGS" ++ LIBS=$lt_globsym_save_LIBS ++ CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 +@@ -6205,33 +6815,81 @@ fi + if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 + $as_echo "failed" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + $as_echo "ok" >&6; } + fi + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++# Response file support. ++if test "$lt_cv_nm_interface" = "MS dumpbin"; then ++ nm_file_list_spec='@' ++elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then ++ nm_file_list_spec='@' ++fi ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 ++$as_echo_n "checking for sysroot... " >&6; } ++ ++# Check whether --with-sysroot was given. ++if test "${with_sysroot+set}" = set; then : ++ withval=$with_sysroot; ++else ++ with_sysroot=no ++fi ++ ++ ++lt_sysroot= ++case ${with_sysroot} in #( ++ yes) ++ if test "$GCC" = yes; then ++ lt_sysroot=`$CC --print-sysroot 2>/dev/null` ++ fi ++ ;; #( ++ /*) ++ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ++ ;; #( ++ no|'') ++ ;; #( ++ *) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 ++$as_echo "${with_sysroot}" >&6; } ++ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ++ ;; ++esac ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 ++$as_echo "${lt_sysroot:-no}" >&6; } + + + + + + # Check whether --enable-libtool-lock was given. + if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +@@ -6258,17 +6916,17 @@ ia64-*-hpux*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; + *-*-irix6*) + # Find out which ABI we are using. +- echo '#line 6266 "configure"' > conftest.$ac_ext ++ echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) +@@ -6358,17 +7016,17 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux* + ;; + + *-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 + $as_echo_n "checking whether the C compiler needs -belf... " >&6; } +-if test "${lt_cv_cc_needs_belf+set}" = set; then : ++if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + +@@ -6399,64 +7057,194 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 + $as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +-sparc*-*solaris*) ++*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in +- yes*) LD="${LD-ld} -m elf64_sparc" ;; ++ yes*) ++ case $host in ++ i?86-*-solaris*) ++ LD="${LD-ld} -m elf_x86_64" ++ ;; ++ sparc*-*-solaris*) ++ LD="${LD-ld} -m elf64_sparc" ++ ;; ++ esac ++ # GNU ld 2.21 introduced _sol2 emulations. Use them if available. ++ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then ++ LD="${LD-ld}_sol2" ++ fi ++ ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + esac + + need_locks="$enable_libtool_lock" + ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. ++set dummy ${ac_tool_prefix}mt; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$MANIFEST_TOOL"; then ++ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL ++if test -n "$MANIFEST_TOOL"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 ++$as_echo "$MANIFEST_TOOL" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ++ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL ++ # Extract the first word of "mt", so it can be a program name with args. ++set dummy mt; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$ac_ct_MANIFEST_TOOL"; then ++ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL ++if test -n "$ac_ct_MANIFEST_TOOL"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 ++$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ if test "x$ac_ct_MANIFEST_TOOL" = x; then ++ MANIFEST_TOOL=":" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac ++ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL ++ fi ++else ++ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" ++fi ++ ++test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 ++$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } ++if ${lt_cv_path_mainfest_tool+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ lt_cv_path_mainfest_tool=no ++ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 ++ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out ++ cat conftest.err >&5 ++ if $GREP 'Manifest Tool' conftest.out > /dev/null; then ++ lt_cv_path_mainfest_tool=yes ++ fi ++ rm -f conftest* ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 ++$as_echo "$lt_cv_path_mainfest_tool" >&6; } ++if test "x$lt_cv_path_mainfest_tool" != xyes; then ++ MANIFEST_TOOL=: ++fi ++ ++ ++ ++ ++ + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. + set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : ++if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6474,29 +7262,29 @@ fi + + fi + if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. + set dummy dsymutil; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : ++if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6526,29 +7314,29 @@ else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" + fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. + set dummy ${ac_tool_prefix}nmedit; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_NMEDIT+set}" = set; then : ++if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6566,29 +7354,29 @@ fi + + fi + if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. + set dummy nmedit; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : ++if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6618,29 +7406,29 @@ else + NMEDIT="$ac_cv_prog_NMEDIT" + fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. + set dummy ${ac_tool_prefix}lipo; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_LIPO+set}" = set; then : ++if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6658,29 +7446,29 @@ fi + + fi + if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. + set dummy lipo; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : ++if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6710,29 +7498,29 @@ else + LIPO="$ac_cv_prog_LIPO" + fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. + set dummy ${ac_tool_prefix}otool; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_OTOOL+set}" = set; then : ++if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6750,29 +7538,29 @@ fi + + fi + if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. + set dummy otool; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : ++if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6802,29 +7590,29 @@ else + OTOOL="$ac_cv_prog_OTOOL" + fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. + set dummy ${ac_tool_prefix}otool64; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_OTOOL64+set}" = set; then : ++if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6842,29 +7630,29 @@ fi + + fi + if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. + set dummy otool64; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : ++if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + IFS=$as_save_IFS + +@@ -6917,46 +7705,53 @@ fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 + $as_echo_n "checking for -single_module linker flag... " >&6; } +-if test "${lt_cv_apple_cc_single_mod+set}" = set; then : ++if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? +- if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then ++ # If there is a non-empty error log, and "single_module" ++ # appears in it, assume the flag caused a linker warning ++ if test -s conftest.err && $GREP single_module conftest.err; then ++ cat conftest.err >&5 ++ # Otherwise, if the output was created with a 0 exit code from ++ # the compiler, it worked. ++ elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 + $as_echo "$lt_cv_apple_cc_single_mod" >&6; } ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 + $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : ++if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +@@ -6976,16 +7771,51 @@ else + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 + $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 ++$as_echo_n "checking for -force_load linker flag... " >&6; } ++if ${lt_cv_ld_force_load+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ lt_cv_ld_force_load=no ++ cat > conftest.c << _LT_EOF ++int forced_loaded() { return 2;} ++_LT_EOF ++ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 ++ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 ++ echo "$AR cru libconftest.a conftest.o" >&5 ++ $AR cru libconftest.a conftest.o 2>&5 ++ echo "$RANLIB libconftest.a" >&5 ++ $RANLIB libconftest.a 2>&5 ++ cat > conftest.c << _LT_EOF ++int main() { return 0;} ++_LT_EOF ++ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 ++ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err ++ _lt_result=$? ++ if test -s conftest.err && $GREP force_load conftest.err; then ++ cat conftest.err >&5 ++ elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then ++ lt_cv_ld_force_load=yes ++ else ++ cat conftest.err >&5 ++ fi ++ rm -f conftest.err libconftest.a conftest conftest.c ++ rm -rf conftest.dSYM ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 ++$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment +@@ -7003,17 +7833,17 @@ fi + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi +- if test "$DSYMUTIL" != ":"; then ++ if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + + ac_ext=c +@@ -7023,17 +7853,17 @@ ac_link='$CC -o conftest$ac_exeext $CFLA + ac_compiler_gnu=$ac_cv_c_compiler_gnu + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 + $as_echo_n "checking how to run the C preprocessor... " >&6; } + # On Suns, sometimes $CPP names a directory. + if test -n "$CPP" && test -d "$CPP"; then + CPP= + fi + if test -z "$CPP"; then +- if test "${ac_cv_prog_CPP+set}" = set; then : ++ if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 + else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false + for ac_c_preproc_warn_flag in '' yes + do +@@ -7053,37 +7883,37 @@ do + Syntax error + _ACEOF + if ac_fn_c_try_cpp "$LINENO"; then : + + else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + _ACEOF + if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. + continue + else + # Passes both tests. + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.i conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + break + fi + + done + ac_cv_prog_CPP=$CPP + + fi +@@ -7112,56 +7942,56 @@ do + Syntax error + _ACEOF + if ac_fn_c_try_cpp "$LINENO"; then : + + else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + _ACEOF + if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. + continue + else + # Passes both tests. + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.i conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "C preprocessor \"$CPP\" fails sanity check +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details" "$LINENO" 5; } + fi + + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 + $as_echo_n "checking for ANSI C header files... " >&6; } +-if test "${ac_cv_header_stdc+set}" = set; then : ++if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + #include + #include + #include +@@ -7268,42 +8098,43 @@ fi + + # On IRIX 5.3, sys/types and inttypes.h are conflicting. + for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h + do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default + " +-eval as_val=\$$as_ac_Header +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF + + fi + + done + + + for ac_header in dlfcn.h + do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default + " +-if test "x$ac_cv_header_dlfcn_h" = x""yes; then : ++if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_DLFCN_H 1 + _ACEOF + + fi + + done + + + ++ ++ + # Set options + + + + enable_dlopen=no + + + enable_win32_dll=no +@@ -7369,17 +8200,32 @@ fi + + + + + + + # Check whether --with-pic was given. + if test "${with_pic+set}" = set; then : +- withval=$with_pic; pic_mode="$withval" ++ withval=$with_pic; lt_p=${PACKAGE-default} ++ case $withval in ++ yes|no) pic_mode=$withval ;; ++ *) ++ pic_mode=default ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for lt_pkg in $withval; do ++ IFS="$lt_save_ifs" ++ if test "X$lt_pkg" = "X$lt_p"; then ++ pic_mode=yes ++ fi ++ done ++ IFS="$lt_save_ifs" ++ ;; ++ esac + else + pic_mode=default + fi + + + test -z "$pic_mode" && pic_mode=default + + +@@ -7446,16 +8292,21 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtoo + + + + + + + + ++ ++ ++ ++ ++ + test -z "$LN_S" && LN_S="ln -s" + + + + + + + +@@ -7467,17 +8318,17 @@ test -z "$LN_S" && LN_S="ln -s" + + + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 + $as_echo_n "checking for objdir... " >&6; } +-if test "${lt_cv_objdir+set}" = set; then : ++if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 + else + rm -f .libs 2>/dev/null + mkdir .libs 2>/dev/null + if test -d .libs; then + lt_cv_objdir=.libs + else + # MS-DOS does not allow filenames that begin with a dot. +@@ -7495,58 +8346,28 @@ objdir=$lt_cv_objdir + + cat >>confdefs.h <<_ACEOF + #define LT_OBJDIR "$lt_cv_objdir/" + _ACEOF + + + + +- +- +- +- +- +- +- +- +- +- +- +- +- + case $host_os in + aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; + esac + +-# Sed substitution that helps us do robust quoting. It backslashifies +-# metacharacters that are still active within double-quoted strings. +-sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +- +-# Same as above, but do not quote variable references. +-double_quote_subst='s/\(["`\\]\)/\\\1/g' +- +-# Sed substitution to delay expansion of an escaped shell variable in a +-# double_quote_subst'ed string. +-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +- +-# Sed substitution to delay expansion of an escaped single quote. +-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' +- +-# Sed substitution to avoid accidental globbing in evaled expressions +-no_glob_subst='s/\*/\\\*/g' +- + # Global variables: + ofile=libtool + can_build_shared=yes + + # All known linkers require a `.a' archive for static linking (except MSVC, + # which needs '.lib'). + libext=a + +@@ -7565,27 +8386,27 @@ test -z "$ac_objext" && ac_objext=o + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done +-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + # Only perform the check for file, if the check method requires it + test -z "$MAGIC_CMD" && MAGIC_CMD=file + case $deplibs_check_method in + file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 + $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : ++if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $MAGIC_CMD in + [\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + *) + lt_save_MAGIC_CMD="$MAGIC_CMD" +@@ -7641,17 +8462,17 @@ fi + + + + + if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 + $as_echo_n "checking for file... " >&6; } +-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : ++if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $MAGIC_CMD in + [\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + *) + lt_save_MAGIC_CMD="$MAGIC_CMD" +@@ -7765,50 +8586,59 @@ eval "$ac_compile" 2>&1 >/dev/null | $SE + + ac_outfile=conftest.$ac_objext + echo "$lt_simple_link_test_code" >conftest.$ac_ext + eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err + _lt_linker_boilerplate=`cat conftest.err` + $RM -r conftest* + + ++## CAVEAT EMPTOR: ++## There is no encapsulation within the following macros, do not change ++## the running order or otherwise move them around unless you know exactly ++## what you are doing... + if test -n "$compiler"; then + + lt_prog_compiler_no_builtin_flag= + + if test "$GCC" = yes; then +- lt_prog_compiler_no_builtin_flag=' -fno-builtin' ++ case $cc_basename in ++ nvcc*) ++ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; ++ *) ++ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; ++ esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : ++if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:7792: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:7796: \$? = $ac_status" >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + + fi +@@ -7827,18 +8657,16 @@ fi + + + + + lt_prog_compiler_wl= + lt_prog_compiler_pic= + lt_prog_compiler_static= + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +-$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. +@@ -7876,16 +8704,22 @@ lt_prog_compiler_static= + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + ++ haiku*) ++ # PIC is the default for Haiku. ++ # The "-static" flag exists, but is broken. ++ lt_prog_compiler_static= ++ ;; ++ + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; +@@ -7918,16 +8752,25 @@ lt_prog_compiler_static= + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac ++ ++ case $cc_basename in ++ nvcc*) # Cuda Compiler Driver 2.2 ++ lt_prog_compiler_wl='-Xlinker ' ++ if test -n "$lt_prog_compiler_pic"; then ++ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" ++ fi ++ ;; ++ esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' +@@ -7959,17 +8802,17 @@ lt_prog_compiler_static= + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + +- linux* | k*bsd*-gnu) ++ linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. +@@ -7980,47 +8823,68 @@ lt_prog_compiler_static= + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; +- pgcc* | pgf77* | pgf90* | pgf95*) ++ nagfor*) ++ # NAG Fortran compiler ++ lt_prog_compiler_wl='-Wl,-Wl,,' ++ lt_prog_compiler_pic='-PIC' ++ lt_prog_compiler_static='-Bstatic' ++ ;; ++ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; +- xl*) +- # IBM XL C 8.0/Fortran 10.1 on PPC ++ xl* | bgxl* | bgf* | mpixl*) ++ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in ++ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) ++ # Sun Fortran 8.3 passes all unrecognized flags to the linker ++ lt_prog_compiler_pic='-KPIC' ++ lt_prog_compiler_static='-Bstatic' ++ lt_prog_compiler_wl='' ++ ;; ++ *Sun\ F* | *Sun*Fortran*) ++ lt_prog_compiler_pic='-KPIC' ++ lt_prog_compiler_static='-Bstatic' ++ lt_prog_compiler_wl='-Qoption ld ' ++ ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; +- *Sun\ F*) +- # Sun Fortran 8.3 passes all unrecognized flags to the linker +- lt_prog_compiler_pic='-KPIC' ++ *Intel*\ [CF]*Compiler*) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_pic='-fPIC' ++ lt_prog_compiler_static='-static' ++ ;; ++ *Portland\ Group*) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' +- lt_prog_compiler_wl='' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' +@@ -8042,17 +8906,17 @@ lt_prog_compiler_static= + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in +- f77* | f90* | f95*) ++ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' +@@ -8099,55 +8963,59 @@ case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; + esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 +-$as_echo "$lt_prog_compiler_pic" >&6; } +- +- +- +- +- ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 ++$as_echo_n "checking for $compiler option to produce PIC... " >&6; } ++if ${lt_cv_prog_compiler_pic+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 ++$as_echo "$lt_cv_prog_compiler_pic" >&6; } ++lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + + # + # Check to make sure the PIC flag actually works. + # + if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 + $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : ++if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:8131: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:8135: \$? = $ac_status" >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + + fi +@@ -8166,36 +9034,41 @@ fi + + fi + + + + + + ++ ++ ++ ++ ++ + # + # Check to make sure the static flag actually works. + # + wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 + $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +-if test "${lt_cv_prog_compiler_static_works+set}" = set; then : ++if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 +- $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp ++ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi +@@ -8215,17 +9088,17 @@ fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 + $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if test "${lt_cv_prog_compiler_c_o+set}" = set; then : ++if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext +@@ -8234,26 +9107,26 @@ else + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:8236: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:8240: \$? = $ac_status" >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for +@@ -8270,17 +9143,17 @@ fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 + $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if test "${lt_cv_prog_compiler_c_o+set}" = set; then : ++if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext +@@ -8289,26 +9162,26 @@ else + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:8291: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:8295: \$? = $ac_status" >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for +@@ -8364,17 +9237,16 @@ fi + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= +- hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= +@@ -8411,17 +9283,43 @@ fi + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes ++ ++ # On some targets, GNU ld is compatible enough with the native linker ++ # that we're better off using the native interface for both. ++ lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then ++ case $host_os in ++ aix*) ++ # The AIX port of GNU ld has always aspired to compatibility ++ # with the native linker. However, as the warning in the GNU ld ++ # block says, versions before 2.19.5* couldn't really create working ++ # shared libraries, regardless of the interface used. ++ case `$LD -v 2>&1` in ++ *\ \(GNU\ Binutils\)\ 2.19.5*) ;; ++ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; ++ *\ \(GNU\ Binutils\)\ [3-9]*) ;; ++ *) ++ lt_use_gnu_ld_interface=yes ++ ;; ++ esac ++ ;; ++ *) ++ lt_use_gnu_ld_interface=yes ++ ;; ++ esac ++ fi ++ ++ if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +@@ -8429,36 +9327,38 @@ fi + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in ++ *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +-*** Warning: the GNU linker, at least up to release 2.9.1, is reported ++*** Warning: the GNU linker, at least up to release 2.19, is reported + *** to be unable to reliably create shared libraries on AIX. + *** Therefore, libtool is disabling shared libraries support. If you +-*** really care for shared libraries, you may want to modify your PATH +-*** so that a non-GNU linker is found, and then restart. ++*** really care for shared libraries, you may want to install binutils ++*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. ++*** You will then need to restart the configuration process. + + _LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) +@@ -8484,20 +9384,22 @@ fi + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' ++ export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' ++ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' ++ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else +@@ -8505,108 +9407,117 @@ fi + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + ++ haiku*) ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ link_all_deplibs=yes ++ ;; ++ + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + +- gnu* | linux* | tpf* | k*bsd*-gnu) ++ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then +- tmp_addflag= ++ tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; +- pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ pgf77* | pgf90* | pgf95* | pgfortran*) ++ # Portland Group f77 and f90 compilers ++ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; +- xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) ++ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; ++ nvcc*) # Cuda Compiler Driver 2.2 ++ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ++ compiler_needs_object=yes ++ ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 +- whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in +- xlf*) ++ xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' +- hardcode_libdir_flag_spec= +- hardcode_libdir_flag_spec_ld='-rpath $libdir' +- archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' ++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' ++ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ +- $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' ++ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +@@ -8614,18 +9525,18 @@ fi + *** create shared libraries on Solaris systems. Therefore, libtool + *** is disabling shared libraries support. We urge you to upgrade GNU + *** binutils to release 2.9.1 or newer. Another option is to modify + *** your PATH or compiler configuration so that the native linker is + *** used, and then restart. + + _LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) +@@ -8661,18 +9572,18 @@ fi + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= +@@ -8702,18 +9613,20 @@ fi + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ # Also, AIX nm treats weak defined symbols like other global ++ # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' ++ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. +@@ -8790,93 +9703,124 @@ fi + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++ if test "${lt_cv_aix_libpath+set}" = set; then ++ aix_libpath=$lt_cv_aix_libpath ++else ++ if ${lt_cv_aix_libpath_+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int + main () + { + + ; + return 0; + } + _ACEOF + if ac_fn_c_try_link "$LINENO"; then : + +-lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\(.*\)$/\1/ +- p +- } +- }' +-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-# Check for a 64-bit object if we didn't find anything. +-if test -z "$aix_libpath"; then +- aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-fi ++ lt_aix_libpath_sed=' ++ /Import File Strings/,/^$/ { ++ /^0/ { ++ s/^0 *\([^ ]*\) *$/\1/ ++ p ++ } ++ }' ++ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` ++ # Check for a 64-bit object if we didn't find anything. ++ if test -z "$lt_cv_aix_libpath_"; then ++ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` ++ fi + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ if test -z "$lt_cv_aix_libpath_"; then ++ lt_cv_aix_libpath_="/usr/lib:/lib" ++ fi ++ ++fi ++ ++ aix_libpath=$lt_cv_aix_libpath_ ++fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++ if test "${lt_cv_aix_libpath+set}" = set; then ++ aix_libpath=$lt_cv_aix_libpath ++else ++ if ${lt_cv_aix_libpath_+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int + main () + { + + ; + return 0; + } + _ACEOF + if ac_fn_c_try_link "$LINENO"; then : + +-lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\(.*\)$/\1/ +- p +- } +- }' +-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-# Check for a 64-bit object if we didn't find anything. +-if test -z "$aix_libpath"; then +- aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-fi ++ lt_aix_libpath_sed=' ++ /Import File Strings/,/^$/ { ++ /^0/ { ++ s/^0 *\([^ ]*\) *$/\1/ ++ p ++ } ++ }' ++ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` ++ # Check for a 64-bit object if we didn't find anything. ++ if test -z "$lt_cv_aix_libpath_"; then ++ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` ++ fi + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ if test -z "$lt_cv_aix_libpath_"; then ++ lt_cv_aix_libpath_="/usr/lib:/lib" ++ fi ++ ++fi ++ ++ aix_libpath=$lt_cv_aix_libpath_ ++fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' +- # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec='$convenience' ++ if test "$with_gnu_ld" = yes; then ++ # We only use this code for GNU lds that support --whole-archive. ++ whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ++ else ++ # Exported symbols can be pulled into shared objects from archives ++ whole_archive_flag_spec='$convenience' ++ fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) +@@ -8898,48 +9842,97 @@ if test -z "$aix_libpath"; then aix_libp + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- old_archive_from_new_cmds='true' +- # FIXME: Should let the user specify the lib program. +- old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' +- fix_srcfile_path='' +- enable_shared_with_static_runtimes=yes ++ case $cc_basename in ++ cl*) ++ # Native MSVC ++ hardcode_libdir_flag_spec=' ' ++ allow_undefined_flag=unsupported ++ always_export_symbols=yes ++ file_list_spec='@' ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' ++ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; ++ else ++ sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; ++ fi~ ++ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ ++ linknames=' ++ # The linker will not automatically build a static lib if we build a DLL. ++ # _LT_TAGVAR(old_archive_from_new_cmds, )='true' ++ enable_shared_with_static_runtimes=yes ++ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ++ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' ++ # Don't use ranlib ++ old_postinstall_cmds='chmod 644 $oldlib' ++ postlink_cmds='lt_outputfile="@OUTPUT@"~ ++ lt_tool_outputfile="@TOOL_OUTPUT@"~ ++ case $lt_outputfile in ++ *.exe|*.EXE) ;; ++ *) ++ lt_outputfile="$lt_outputfile.exe" ++ lt_tool_outputfile="$lt_tool_outputfile.exe" ++ ;; ++ esac~ ++ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then ++ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; ++ $RM "$lt_outputfile.manifest"; ++ fi' ++ ;; ++ *) ++ # Assume MSVC wrapper ++ hardcode_libdir_flag_spec=' ' ++ allow_undefined_flag=unsupported ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' ++ # The linker will automatically build a .lib file if we build a DLL. ++ old_archive_from_new_cmds='true' ++ # FIXME: Should let the user specify the lib program. ++ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' ++ enable_shared_with_static_runtimes=yes ++ ;; ++ esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported +- whole_archive_flag_spec='' ++ if test "$lt_cv_ld_force_load" = "yes"; then ++ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' ++ ++ else ++ whole_archive_flag_spec='' ++ fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then +- output_verbose_link_cmd=echo ++ output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi +@@ -8947,105 +9940,139 @@ if test -z "$aix_libpath"; then aix_libp + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + +- freebsd1*) +- ld_shlibs=no +- ;; +- + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2*) ++ freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) +- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then +- archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) +- if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ if test "$GCC" = yes && test "$with_gnu_ld" = no; then ++ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) +- if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) +- archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ ++ # Older versions of the 11.00 compiler do not understand -b yet ++ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 ++$as_echo_n "checking if $CC understands -b... " >&6; } ++if ${lt_cv_prog_compiler__b+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ lt_cv_prog_compiler__b=no ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS -b" ++ echo "$lt_simple_link_test_code" > conftest.$ac_ext ++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then ++ # The linker can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test -s conftest.err; then ++ # Append any errors to the config.log. ++ cat conftest.err 1>&5 ++ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if diff conftest.exp conftest.er2 >/dev/null; then ++ lt_cv_prog_compiler__b=yes ++ fi ++ else ++ lt_cv_prog_compiler__b=yes ++ fi ++ fi ++ $RM -r conftest* ++ LDFLAGS="$save_LDFLAGS" ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 ++$as_echo "$lt_cv_prog_compiler__b" >&6; } ++ ++if test x"$lt_cv_prog_compiler__b" = xyes; then ++ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++else ++ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++fi ++ + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in +@@ -9063,36 +10090,49 @@ if test -z "$aix_libpath"; then aix_libp + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-int foo(void) {} ++ # This should be the same for all languages, so no per-tag cache variable. ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 ++$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } ++if ${lt_cv_irix_exported_symbol+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++int foo (void) { return 0; } + _ACEOF + if ac_fn_c_try_link "$LINENO"; then : +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' +- ++ lt_cv_irix_exported_symbol=yes ++else ++ lt_cv_irix_exported_symbol=no + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +- LDFLAGS="$save_LDFLAGS" ++ LDFLAGS="$save_LDFLAGS" ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 ++$as_echo "$lt_cv_irix_exported_symbol" >&6; } ++ if test "$lt_cv_irix_exported_symbol" = yes; then ++ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' ++ fi + else +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' ++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + +@@ -9144,58 +10184,58 @@ rm -f core conftest.err conftest.$ac_obj + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported +- archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' ++ archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' ++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' ++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ +- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' ++ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' +- archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ++ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; +@@ -9373,54 +10413,60 @@ x|xyes) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 + $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +- $RM conftest* +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 ++if ${lt_cv_archive_cmds_need_lc+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ $RM conftest* ++ echo "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$lt_prog_compiler_wl +- pic_flag=$lt_prog_compiler_pic +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- lt_save_allow_undefined_flag=$allow_undefined_flag +- allow_undefined_flag= +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 ++ soname=conftest ++ lib=conftest ++ libobjs=conftest.$ac_objext ++ deplibs= ++ wl=$lt_prog_compiler_wl ++ pic_flag=$lt_prog_compiler_pic ++ compiler_flags=-v ++ linker_flags=-v ++ verstring= ++ output_objdir=. ++ libname=conftest ++ lt_save_allow_undefined_flag=$allow_undefined_flag ++ allow_undefined_flag= ++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +- then +- archive_cmds_need_lc=no +- else +- archive_cmds_need_lc=yes +- fi +- allow_undefined_flag=$lt_save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +- $RM conftest* +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +-$as_echo "$archive_cmds_need_lc" >&6; } ++ then ++ lt_cv_archive_cmds_need_lc=no ++ else ++ lt_cv_archive_cmds_need_lc=yes ++ fi ++ allow_undefined_flag=$lt_save_allow_undefined_flag ++ else ++ cat conftest.err 1>&5 ++ fi ++ $RM conftest* ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 ++$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } ++ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; + esac + + + +@@ -9568,52 +10614,54 @@ esac + + + + + + + + +- +- +- +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 + $as_echo_n "checking dynamic linker characteristics... " >&6; } + + if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac +- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` +- if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then ++ case $host_os in ++ mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; ++ *) lt_sed_strip_eq="s,=/,/,g" ;; ++ esac ++ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` ++ case $lt_search_path_spec in ++ *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` +- else +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi ++ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ++ ;; ++ *) ++ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ++ ;; ++ esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done +- lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' ++ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' + BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { +@@ -9623,17 +10671,23 @@ BEGIN {RS=" "; FS="/|\n";} { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } + }'` +- sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` ++ # AWK program above erroneously prepends '/' to C:/dos/paths ++ # for these hosts. ++ case $host_os in ++ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ ++ $SED 's,/\([A-Za-z]:\),\1,g'` ;; ++ esac ++ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` + else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + fi + library_names_spec= + libname_spec='lib$name' + soname_spec= + shrext_cmds=".so" + postinstall_cmds= +@@ -9649,26 +10703,26 @@ need_lib_prefix=unknown + hardcode_into_libs=no + + # when you set need_version to no, make sure it does not cause -set_version + # flags to be left without arguments + need_version=unknown + + case $host_os in + aix3*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + + aix[4-9]*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else +@@ -9711,29 +10765,29 @@ amigaos*) + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + + beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + + bsdi[45]*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and +@@ -9742,18 +10796,19 @@ bsdi[45]*) + ;; + + cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + +- case $GCC,$host_os in +- yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) ++ case $GCC,$cc_basename in ++ yes,*) ++ # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ +@@ -9764,46 +10819,93 @@ cygwin* | mingw* | pw32* | cegcc*) + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ++ ++ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` +- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then +- # It is most probably a Windows format PATH printed by +- # mingw gcc, but we are running on Cygwin. Gcc prints its search +- # path with ; separators, and with drive letters. We can handle the +- # drive letters (cygwin fileutils understands them), so leave them, +- # especially as we might pass files found there to a mingw objdump, +- # which wouldn't understand a cygwinified path. Ahh. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac ++ dynamic_linker='Win32 ld.exe' ++ ;; ++ ++ *,cl*) ++ # Native MSVC ++ libname_spec='$name' ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ library_names_spec='${libname}.dll.lib' ++ ++ case $build_os in ++ mingw*) ++ sys_lib_search_path_spec= ++ lt_save_ifs=$IFS ++ IFS=';' ++ for lt_path in $LIB ++ do ++ IFS=$lt_save_ifs ++ # Let DOS variable expansion print the short 8.3 style file name. ++ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` ++ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" ++ done ++ IFS=$lt_save_ifs ++ # Convert to MSYS style. ++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ++ ;; ++ cygwin*) ++ # Convert to unix form, then to dos form, then back to unix form ++ # but this time dos style (no spaces!) so that the unix form looks ++ # like /cygdrive/c/PROGRA~1:/cygdr... ++ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` ++ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` ++ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ ;; ++ *) ++ sys_lib_search_path_spec="$LIB" ++ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then ++ # It is most probably a Windows format PATH. ++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++ # FIXME: find the short name or the path components, as spaces are ++ # common. (e.g. "Program Files" -> "PROGRA~1") ++ ;; ++ esac ++ ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ ++ dldir=$destdir/`dirname \$dlpath`~ ++ test -d \$dldir || mkdir -p \$dldir~ ++ $install_prog $dir/$dlname \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ dlpath=$dir/\$dldll~ ++ $RM \$dlpath' ++ shlibpath_overrides_runpath=yes ++ dynamic_linker='Win32 link.exe' + ;; + + *) ++ # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' ++ dynamic_linker='Win32 ld.exe' ++ ;; ++ esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + + darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no +@@ -9814,36 +10916,32 @@ darwin* | rhapsody*) + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + + dgux*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +-freebsd1*) +- dynamic_linker=no +- ;; +- + freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in +- freebsd[123]*) objformat=aout ;; ++ freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no +@@ -9851,17 +10949,17 @@ freebsd* | dragonfly*) + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in +- freebsd2*) ++ freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) +@@ -9871,22 +10969,36 @@ freebsd* | dragonfly*) + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + + gnu*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ ++haiku*) ++ version_type=linux # correct to gnu/linux during the next big refactor ++ need_lib_prefix=no ++ need_version=no ++ dynamic_linker="$host_os runtime_loader" ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + + hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no +@@ -9922,38 +11034,40 @@ hpux9* | hpux10* | hpux11*) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555. ++ # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' ++ # or fails outright, so override atomically: ++ install_override_mode=555 + ;; + + interix[3-9]*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + + irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +@@ -9980,64 +11094,74 @@ irix5* | irix6* | nonstopux*) + hardcode_into_libs=yes + ;; + + # No shared lib support for Linux oldld, aout, or coff. + linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +-# This must be Linux ELF. +-linux* | k*bsd*-gnu) +- version_type=linux ++# This must be glibc/ELF. ++linux* | k*bsd*-gnu | kopensolaris*-gnu) ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no ++ + # Some binutils ld are patched to set DT_RUNPATH +- save_LDFLAGS=$LDFLAGS +- save_libdir=$libdir +- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ +- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++ if ${lt_cv_shlibpath_overrides_runpath+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ lt_cv_shlibpath_overrides_runpath=no ++ save_LDFLAGS=$LDFLAGS ++ save_libdir=$libdir ++ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ ++ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int + main () + { + + ; + return 0; + } + _ACEOF + if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +- shlibpath_overrides_runpath=yes ++ lt_cv_shlibpath_overrides_runpath=yes + fi + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +- LDFLAGS=$save_LDFLAGS +- libdir=$save_libdir ++ LDFLAGS=$save_LDFLAGS ++ libdir=$save_libdir ++ ++fi ++ ++ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then +- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` ++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" ++ + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. +@@ -10058,17 +11182,17 @@ netbsd*) + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + + newsos6) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + + *nto* | *qnx*) + version_type=qnx + need_lib_prefix=no +@@ -10127,17 +11251,17 @@ osf3* | osf4* | osf5*) + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + + rdos*) + dynamic_linker=no + ;; + + solaris*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable +@@ -10152,17 +11276,17 @@ sunos4*) + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + + sysv4 | sysv4.3*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH +@@ -10176,17 +11300,17 @@ sysv4 | sysv4.3*) + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + + sysv4*MP*) + if test -d /usr/nec ;then +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf +@@ -10207,27 +11331,27 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + + tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + + uts4*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + + *) + dynamic_linker=no + ;; +@@ -10329,16 +11453,21 @@ fi + + + + + + + + ++ ++ ++ ++ ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 + $as_echo_n "checking how to hardcode library paths into programs... " >&6; } + hardcode_action= + if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. +@@ -10401,17 +11530,17 @@ else + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + $as_echo_n "checking for dlopen in -ldl... " >&6; } +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : ++if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldl $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + /* Override any GCC internal prototype to avoid an error. +@@ -10435,36 +11564,36 @@ else + ac_cv_lib_dl_dlopen=no + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 + $as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : ++if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" + else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + + fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +-if test "x$ac_cv_func_shl_load" = x""yes; then : ++if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 + $as_echo_n "checking for shl_load in -ldld... " >&6; } +-if test "${ac_cv_lib_dld_shl_load+set}" = set; then : ++if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldld $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + /* Override any GCC internal prototype to avoid an error. +@@ -10488,26 +11617,26 @@ else + ac_cv_lib_dld_shl_load=no + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 + $as_echo "$ac_cv_lib_dld_shl_load" >&6; } +-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : ++if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" + else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +-if test "x$ac_cv_func_dlopen" = x""yes; then : ++if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + $as_echo_n "checking for dlopen in -ldl... " >&6; } +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : ++if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldl $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + /* Override any GCC internal prototype to avoid an error. +@@ -10531,22 +11660,22 @@ else + ac_cv_lib_dl_dlopen=no + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 + $as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : ++if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 + $as_echo_n "checking for dlopen in -lsvld... " >&6; } +-if test "${ac_cv_lib_svld_dlopen+set}" = set; then : ++if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-lsvld $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + /* Override any GCC internal prototype to avoid an error. +@@ -10570,22 +11699,22 @@ else + ac_cv_lib_svld_dlopen=no + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 + $as_echo "$ac_cv_lib_svld_dlopen" >&6; } +-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : ++if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 + $as_echo_n "checking for dld_link in -ldld... " >&6; } +-if test "${ac_cv_lib_dld_dld_link+set}" = set; then : ++if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldld $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + /* Override any GCC internal prototype to avoid an error. +@@ -10609,17 +11738,17 @@ else + ac_cv_lib_dld_dld_link=no + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 + $as_echo "$ac_cv_lib_dld_dld_link" >&6; } +-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : ++if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" + fi + + + fi + + + fi +@@ -10650,26 +11779,26 @@ fi + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 + $as_echo_n "checking whether a program can dlopen itself... " >&6; } +-if test "${lt_cv_dlopen_self+set}" = set; then : ++if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross + else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 10661 "configure" ++#line $LINENO "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H + #include + #endif + + #include + +@@ -10700,26 +11829,36 @@ else + # else + # define LT_DLLAZY_OR_NOW 0 + # endif + # endif + # endif + # endif + #endif + +-void fnord() { int i=42;} ++/* When -fvisbility=hidden is used, assume the code has been annotated ++ correspondingly for the symbols needed. */ ++#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) ++int fnord () __attribute__((visibility("default"))); ++#endif ++ ++int fnord () { return 42; } + int main () + { + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ else ++ { ++ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ else puts (dlerror ()); ++ } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; + } + _LT_EOF +@@ -10746,26 +11885,26 @@ rm -fr conftest* + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 + $as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 + $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +-if test "${lt_cv_dlopen_self_static+set}" = set; then : ++if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross + else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 10757 "configure" ++#line $LINENO "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H + #include + #endif + + #include + +@@ -10796,26 +11935,36 @@ else + # else + # define LT_DLLAZY_OR_NOW 0 + # endif + # endif + # endif + # endif + #endif + +-void fnord() { int i=42;} ++/* When -fvisbility=hidden is used, assume the code has been annotated ++ correspondingly for the symbols needed. */ ++#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) ++int fnord () __attribute__((visibility("default"))); ++#endif ++ ++int fnord () { return 42; } + int main () + { + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ else ++ { ++ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ else puts (dlerror ()); ++ } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; + } + _LT_EOF +@@ -10974,26 +12123,1043 @@ CC="$lt_save_CC" + + + + + + + + ++ ++ + ac_config_commands="$ac_config_commands libtool" + + + + + # Only expand once: + + + + ++# Test for 64-bit build. ++# The cast to long int works around a bug in the HP C Compiler ++# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects ++# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. ++# This bug is HP SR number 8606223364. ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 ++$as_echo_n "checking size of size_t... " >&6; } ++if ${ac_cv_sizeof_size_t+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : ++ ++else ++ if test "$ac_cv_type_size_t" = yes; then ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error 77 "cannot compute sizeof (size_t) ++See \`config.log' for more details" "$LINENO" 5; } ++ else ++ ac_cv_sizeof_size_t=0 ++ fi ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 ++$as_echo "$ac_cv_sizeof_size_t" >&6; } ++ ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t ++_ACEOF ++ ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 ++$as_echo_n "checking for C compiler vendor... " >&6; } ++if ${ax_cv_c_compiler_vendor+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ # note: don't check for gcc first since some other compilers define __GNUC__ ++ vendors="intel: __ICC,__ECC,__INTEL_COMPILER ++ ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ ++ pathscale: __PATHCC__,__PATHSCALE__ ++ clang: __clang__ ++ gnu: __GNUC__ ++ sun: __SUNPRO_C,__SUNPRO_CC ++ hp: __HP_cc,__HP_aCC ++ dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER ++ borland: __BORLANDC__,__TURBOC__ ++ comeau: __COMO__ ++ cray: _CRAYC ++ kai: __KCC ++ lcc: __LCC__ ++ sgi: __sgi,sgi ++ microsoft: _MSC_VER ++ metrowerks: __MWERKS__ ++ watcom: __WATCOMC__ ++ portland: __PGI ++ unknown: UNKNOWN" ++ for ventest in $vendors; do ++ case $ventest in ++ *:) vendor=$ventest; continue ;; ++ *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; ++ esac ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ #if !($vencpp) ++ thisisanerror; ++ #endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ break ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ done ++ ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 ++$as_echo "$ax_cv_c_compiler_vendor" >&6; } ++ ++ ++ ++ ++ ++ ++# Check whether --enable-portable-binary was given. ++if test "${enable_portable_binary+set}" = set; then : ++ enableval=$enable_portable_binary; acx_maxopt_portable=$enableval ++else ++ acx_maxopt_portable=no ++fi ++ ++ ++# Try to determine "good" native compiler flags if none specified via CFLAGS ++if test "$ac_test_CFLAGS" != "set"; then ++ CFLAGS="" ++ case $ax_cv_c_compiler_vendor in ++ dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" ++ if test "x$acx_maxopt_portable" = xno; then ++ CFLAGS="$CFLAGS -arch host" ++ fi;; ++ ++ sun) CFLAGS="-native -fast -xO5 -dalign" ++ if test "x$acx_maxopt_portable" = xyes; then ++ CFLAGS="$CFLAGS -xarch=generic" ++ fi;; ++ ++ hp) CFLAGS="+Oall +Optrs_ansi +DSnative" ++ if test "x$acx_maxopt_portable" = xyes; then ++ CFLAGS="$CFLAGS +DAportable" ++ fi;; ++ ++ ibm) if test "x$acx_maxopt_portable" = xno; then ++ xlc_opt="-qarch=auto -qtune=auto" ++ else ++ xlc_opt="-qtune=auto" ++ fi ++ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$xlc_opt" | $as_tr_sh` ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5 ++$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; } ++if eval \${$as_CACHEVAR+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ ax_check_save_flags=$CFLAGS ++ CFLAGS="$CFLAGS $xlc_opt" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ eval "$as_CACHEVAR=yes" ++else ++ eval "$as_CACHEVAR=no" ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS=$ax_check_save_flags ++fi ++eval ac_res=\$$as_CACHEVAR ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : ++ CFLAGS="-O3 -qansialias -w $xlc_opt" ++else ++ CFLAGS="-O3 -qansialias -w" ++ echo "******************************************************" ++ echo "* You seem to have the IBM C compiler. It is *" ++ echo "* recommended for best performance that you use: *" ++ echo "* *" ++ echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" ++ echo "* ^^^ ^^^ *" ++ echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" ++ echo "* CPU you have. (Set the CFLAGS environment var. *" ++ echo "* and re-run configure.) For more info, man cc. *" ++ echo "******************************************************" ++fi ++ ++ ;; ++ ++ intel) CFLAGS="-O3 -ansi_alias" ++ if test "x$acx_maxopt_portable" = xno; then ++ icc_archflag=unknown ++ icc_flags="" ++ case $host_cpu in ++ i686*|x86_64*) ++ # icc accepts gcc assembly syntax, so these should work: ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 ++$as_echo_n "checking for x86 cpuid 0 output... " >&6; } ++if ${ax_cv_gcc_x86_cpuid_0+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ ax_cv_gcc_x86_cpuid_0=unknown ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++ ++ int op = 0, eax, ebx, ecx, edx; ++ FILE *f; ++ __asm__("cpuid" ++ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) ++ : "a" (op)); ++ f = fopen("conftest_cpuid", "w"); if (!f) return 1; ++ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); ++ fclose(f); ++ return 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid ++else ++ ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 ++$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 ++$as_echo_n "checking for x86 cpuid 1 output... " >&6; } ++if ${ax_cv_gcc_x86_cpuid_1+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ ax_cv_gcc_x86_cpuid_1=unknown ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++ ++ int op = 1, eax, ebx, ecx, edx; ++ FILE *f; ++ __asm__("cpuid" ++ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) ++ : "a" (op)); ++ f = fopen("conftest_cpuid", "w"); if (!f) return 1; ++ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); ++ fclose(f); ++ return 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid ++else ++ ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 ++$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG ++ *:756e6547:*:*) # Intel ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";; ++ *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";; ++ *f??:*:*:*) icc_flags="-xN -xW -xK";; ++ esac ;; ++ esac ;; ++ esac ++ if test "x$icc_flags" != x; then ++ for flag in $icc_flags; do ++ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 ++$as_echo_n "checking whether C compiler accepts $flag... " >&6; } ++if eval \${$as_CACHEVAR+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ ax_check_save_flags=$CFLAGS ++ CFLAGS="$CFLAGS $flag" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ eval "$as_CACHEVAR=yes" ++else ++ eval "$as_CACHEVAR=no" ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS=$ax_check_save_flags ++fi ++eval ac_res=\$$as_CACHEVAR ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : ++ icc_archflag=$flag; break ++else ++ : ++fi ++ ++ done ++ fi ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5 ++$as_echo_n "checking for icc architecture flag... " >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5 ++$as_echo "$icc_archflag" >&6; } ++ if test "x$icc_archflag" != xunknown; then ++ CFLAGS="$CFLAGS $icc_archflag" ++ fi ++ fi ++ ;; ++ ++ gnu) ++ # default optimization flags for gcc on all systems ++ CFLAGS="-O3 -fomit-frame-pointer" ++ ++ # -malign-double for x86 systems ++ # LIBFFI -- DON'T DO THIS - CHANGES ABI ++ # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") ++ ++ # -fstrict-aliasing for gcc-2.95+ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5 ++$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; } ++if ${ax_cv_check_cflags___fstrict_aliasing+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ ax_check_save_flags=$CFLAGS ++ CFLAGS="$CFLAGS -fstrict-aliasing" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ax_cv_check_cflags___fstrict_aliasing=yes ++else ++ ax_cv_check_cflags___fstrict_aliasing=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS=$ax_check_save_flags ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fstrict_aliasing" >&5 ++$as_echo "$ax_cv_check_cflags___fstrict_aliasing" >&6; } ++if test x"$ax_cv_check_cflags___fstrict_aliasing" = xyes; then : ++ CFLAGS="$CFLAGS -fstrict-aliasing" ++else ++ : ++fi ++ ++ ++ # note that we enable "unsafe" fp optimization with other compilers, too ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5 ++$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; } ++if ${ax_cv_check_cflags___ffast_math+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ ax_check_save_flags=$CFLAGS ++ CFLAGS="$CFLAGS -ffast-math" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ax_cv_check_cflags___ffast_math=yes ++else ++ ax_cv_check_cflags___ffast_math=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS=$ax_check_save_flags ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___ffast_math" >&5 ++$as_echo "$ax_cv_check_cflags___ffast_math" >&6; } ++if test x"$ax_cv_check_cflags___ffast_math" = xyes; then : ++ CFLAGS="$CFLAGS -ffast-math" ++else ++ : ++fi ++ ++ ++ ++ ++ ++ ++# Check whether --with-gcc-arch was given. ++if test "${with_gcc_arch+set}" = set; then : ++ withval=$with_gcc_arch; ax_gcc_arch=$withval ++else ++ ax_gcc_arch=yes ++fi ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 ++$as_echo_n "checking for gcc architecture flag... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 ++$as_echo "" >&6; } ++if ${ax_cv_gcc_archflag+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ax_cv_gcc_archflag="unknown" ++ ++if test "$GCC" = yes; then ++ ++if test "x$ax_gcc_arch" = xyes; then ++ax_gcc_arch="" ++if test "$cross_compiling" = no; then ++case $host_cpu in ++ i[3456]86*|x86_64*) # use cpuid codes ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 ++$as_echo_n "checking for x86 cpuid 0 output... " >&6; } ++if ${ax_cv_gcc_x86_cpuid_0+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ ax_cv_gcc_x86_cpuid_0=unknown ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++ ++ int op = 0, eax, ebx, ecx, edx; ++ FILE *f; ++ __asm__("cpuid" ++ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) ++ : "a" (op)); ++ f = fopen("conftest_cpuid", "w"); if (!f) return 1; ++ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); ++ fclose(f); ++ return 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid ++else ++ ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 ++$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 ++$as_echo_n "checking for x86 cpuid 1 output... " >&6; } ++if ${ax_cv_gcc_x86_cpuid_1+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ ax_cv_gcc_x86_cpuid_1=unknown ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++ ++ int op = 1, eax, ebx, ecx, edx; ++ FILE *f; ++ __asm__("cpuid" ++ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) ++ : "a" (op)); ++ f = fopen("conftest_cpuid", "w"); if (!f) return 1; ++ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); ++ fclose(f); ++ return 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid ++else ++ ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 ++$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ case $ax_cv_gcc_x86_cpuid_0 in ++ *:756e6547:*:*) # Intel ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; ++ *5??:*:*:*) ax_gcc_arch=pentium ;; ++ *0?6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; ++ *0?6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; ++ *0?6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; ++ *0?6[9de]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; ++ *0?6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; ++ *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; ++ *1?6[7d]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; ++ *1?6[aef]?:*:*:*|*2?6[5cef]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;; ++ *1?6c?:*:*:*|*[23]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;; ++ *2?6[ad]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; ++ *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;; ++ *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; ++ ?000?f3[347]:*:*:*|?000?f41347:*:*:*|?000?f6?:*:*:*) ++ case $host_cpu in ++ x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; ++ *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; ++ esac ;; ++ ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; ++ esac ;; ++ *:68747541:*:*) # AMD ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *5[67]?:*:*:*) ax_gcc_arch=k6 ;; ++ *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; ++ *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; ++ *60?:*:*:*) ax_gcc_arch=k7 ;; ++ *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;; ++ *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; ++ *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; ++ *6[68a]?:*:*:*) ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5 ++$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; } ++if ${ax_cv_gcc_x86_cpuid_0x80000006+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ ax_cv_gcc_x86_cpuid_0x80000006=unknown ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++ ++ int op = 0x80000006, eax, ebx, ecx, edx; ++ FILE *f; ++ __asm__("cpuid" ++ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) ++ : "a" (op)); ++ f = fopen("conftest_cpuid", "w"); if (!f) return 1; ++ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); ++ fclose(f); ++ return 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid ++else ++ ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5 ++$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; } ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ # L2 cache size ++ case $ax_cv_gcc_x86_cpuid_0x80000006 in ++ *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256 ++ ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; ++ *) ax_gcc_arch="athlon-4 athlon k7" ;; ++ esac ;; ++ ?00??f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; ++ ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;; ++ ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; ++ ?00??f??:*:*:*) ax_gcc_arch="k8" ;; ++ ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; ++ ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; ++ *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; ++ esac ;; ++ *:746e6543:*:*) # IDT ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; ++ *58?:*:*:*) ax_gcc_arch=winchip2 ;; ++ *6[78]?:*:*:*) ax_gcc_arch=c3 ;; ++ *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; ++ esac ;; ++ esac ++ if test x"$ax_gcc_arch" = x; then # fallback ++ case $host_cpu in ++ i586*) ax_gcc_arch=pentium ;; ++ i686*) ax_gcc_arch=pentiumpro ;; ++ esac ++ fi ++ ;; ++ ++ sparc*) ++ # Extract the first word of "prtdiag", so it can be a program name with args. ++set dummy prtdiag; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_PRTDIAG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $PRTDIAG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/" ++for as_dir in $as_dummy ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag" ++ ;; ++esac ++fi ++PRTDIAG=$ac_cv_path_PRTDIAG ++if test -n "$PRTDIAG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5 ++$as_echo "$PRTDIAG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++ cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` ++ cputype=`echo "$cputype" | tr -d ' -' | sed 's/SPARCIIi/SPARCII/' | tr $as_cr_LETTERS $as_cr_letters` ++ case $cputype in ++ *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; ++ *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; ++ *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; ++ *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;; ++ *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;; ++ *cypress*) ax_gcc_arch=cypress ;; ++ esac ;; ++ ++ alphaev5) ax_gcc_arch=ev5 ;; ++ alphaev56) ax_gcc_arch=ev56 ;; ++ alphapca56) ax_gcc_arch="pca56 ev56" ;; ++ alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; ++ alphaev6) ax_gcc_arch=ev6 ;; ++ alphaev67) ax_gcc_arch=ev67 ;; ++ alphaev68) ax_gcc_arch="ev68 ev67" ;; ++ alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; ++ alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; ++ alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; ++ ++ powerpc*) ++ cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` ++ cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` ++ case $cputype in ++ *750*) ax_gcc_arch="750 G3" ;; ++ *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;; ++ *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;; ++ *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;; ++ *970*) ax_gcc_arch="970 G5 power4";; ++ *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; ++ *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; ++ 603ev|8240) ax_gcc_arch="$cputype 603e 603";; ++ *) ax_gcc_arch=$cputype ;; ++ esac ++ ax_gcc_arch="$ax_gcc_arch powerpc" ++ ;; ++esac ++fi # not cross-compiling ++fi # guess arch ++ ++if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then ++for arch in $ax_gcc_arch; do ++ if test "x$acx_maxopt_portable" = xyes; then # if we require portable code ++ flags="-mtune=$arch" ++ # -mcpu=$arch and m$arch generate nonportable code on every arch except ++ # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. ++ case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac ++ else ++ flags="-march=$arch -mcpu=$arch -m$arch" ++ fi ++ for flag in $flags; do ++ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 ++$as_echo_n "checking whether C compiler accepts $flag... " >&6; } ++if eval \${$as_CACHEVAR+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ ax_check_save_flags=$CFLAGS ++ CFLAGS="$CFLAGS $flag" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ eval "$as_CACHEVAR=yes" ++else ++ eval "$as_CACHEVAR=no" ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS=$ax_check_save_flags ++fi ++eval ac_res=\$$as_CACHEVAR ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : ++ ax_cv_gcc_archflag=$flag; break ++else ++ : ++fi ++ ++ done ++ test "x$ax_cv_gcc_archflag" = xunknown || break ++done ++fi ++ ++fi # $GCC=yes ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 ++$as_echo_n "checking for gcc architecture flag... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5 ++$as_echo "$ax_cv_gcc_archflag" >&6; } ++if test "x$ax_cv_gcc_archflag" = xunknown; then ++ : ++else ++ CFLAGS="$CFLAGS $ax_cv_gcc_archflag" ++fi ++ ++ ;; ++ esac ++ ++ if test -z "$CFLAGS"; then ++ echo "" ++ echo "********************************************************" ++ echo "* WARNING: Don't know the best CFLAGS for this system *" ++ echo "* Use ./configure CFLAGS=... to specify your own flags *" ++ echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" ++ echo "********************************************************" ++ echo "" ++ CFLAGS="-O3" ++ fi ++ ++ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$CFLAGS" | $as_tr_sh` ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5 ++$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; } ++if eval \${$as_CACHEVAR+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ ax_check_save_flags=$CFLAGS ++ CFLAGS="$CFLAGS $CFLAGS" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ eval "$as_CACHEVAR=yes" ++else ++ eval "$as_CACHEVAR=no" ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS=$ax_check_save_flags ++fi ++eval ac_res=\$$as_CACHEVAR ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : ++ : ++else ++ ++ echo "" ++ echo "********************************************************" ++ echo "* WARNING: The guessed CFLAGS don't seem to work with *" ++ echo "* your compiler. *" ++ echo "* Use ./configure CFLAGS=... to specify your own flags *" ++ echo "********************************************************" ++ echo "" ++ CFLAGS="" ++ ++fi ++ ++ ++fi ++ ++# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro ++# compiler. ++if test "$ax_cv_c_compiler_vendor" != "sun"; then ++ if ${CFLAGS+:} false; then : ++ case " $CFLAGS " in ++ *" "*) ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains "; } >&5 ++ (: CFLAGS already contains ) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++ ;; ++ *) ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \""; } >&5 ++ (: CFLAGS="$CFLAGS ") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++ CFLAGS="$CFLAGS " ++ ;; ++ esac ++else ++ CFLAGS="" ++fi ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for maximum warnings" >&5 ++$as_echo_n "checking CFLAGS for maximum warnings... " >&6; } ++if ${ac_cv_cflags_warn_all+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_cv_cflags_warn_all="no, unknown" ++ac_save_CFLAGS="$CFLAGS" ++for ac_arg in "-warn all % -warn all" "-pedantic % -Wall" "-xstrconst % -v" "-std1 % -verbose -w0 -warnprotos" "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" "-ansi -ansiE % -fullwarn" "+ESlit % +w1" "-Xc % -pvctl,fullmsg" "-h conform % -h msglevel 2" # ++do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++done ++CFLAGS="$ac_save_CFLAGS" ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5 ++$as_echo "$ac_cv_cflags_warn_all" >&6; } ++ ++case ".$ac_cv_cflags_warn_all" in ++ .ok|.ok,*) ;; ++ .|.no|.no,*) ;; ++ *) if ${CFLAGS+:} false; then : ++ case " $CFLAGS " in ++ *" $ac_cv_cflags_warn_all "*) ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$ac_cv_cflags_warn_all"; } >&5 ++ (: CFLAGS already contains $ac_cv_cflags_warn_all) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++ ;; ++ *) ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_warn_all\""; } >&5 ++ (: CFLAGS="$CFLAGS $ac_cv_cflags_warn_all") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++ CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" ++ ;; ++ esac ++else ++ CFLAGS="$ac_cv_cflags_warn_all" ++fi ++ ;; ++esac ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++fi ++ ++if test "x$GCC" = "xyes"; then ++ CFLAGS="$CFLAGS -fexceptions" ++ touch local.exp ++else ++ cat > local.exp <&5 + $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. + if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval + else + USE_MAINTAINER_MODE=no +@@ -11011,61 +13177,61 @@ fi + + MAINT=$MAINTAINER_MODE_TRUE + + + + for ac_header in sys/mman.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +-if test "x$ac_cv_header_sys_mman_h" = x""yes; then : ++if test "x$ac_cv_header_sys_mman_h" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_SYS_MMAN_H 1 + _ACEOF + + fi + + done + + for ac_func in mmap + do : + ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" +-if test "x$ac_cv_func_mmap" = x""yes; then : ++if test "x$ac_cv_func_mmap" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_MMAP 1 + _ACEOF + + fi + done + + + ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +-if test "x$ac_cv_header_sys_mman_h" = x""yes; then : ++if test "x$ac_cv_header_sys_mman_h" = xyes; then : + libffi_header_sys_mman_h=yes + else + libffi_header_sys_mman_h=no + fi + + + ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" +-if test "x$ac_cv_func_mmap" = x""yes; then : ++if test "x$ac_cv_func_mmap" = xyes; then : + libffi_func_mmap=yes + else + libffi_func_mmap=no + fi + + if test "$libffi_header_sys_mman_h" != yes \ + || test "$libffi_func_mmap" != yes; then + ac_cv_func_mmap_file=no + ac_cv_func_mmap_dev_zero=no + ac_cv_func_mmap_anon=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5 + $as_echo_n "checking whether read-only mmap of a plain file works... " >&6; } +-if test "${ac_cv_func_mmap_file+set}" = set; then : ++if ${ac_cv_func_mmap_file+:} false; then : + $as_echo_n "(cached) " >&6 + else + # Add a system to this blacklist if + # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a + # memory area containing the same data that you'd get if you applied + # read() to the same fd. The only system known to have a problem here + # is VMS, where text files have record structure. + case "$host_os" in +@@ -11074,17 +13240,17 @@ else + *) + ac_cv_func_mmap_file=yes;; + esac + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_file" >&5 + $as_echo "$ac_cv_func_mmap_file" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5 + $as_echo_n "checking whether mmap from /dev/zero works... " >&6; } +-if test "${ac_cv_func_mmap_dev_zero+set}" = set; then : ++if ${ac_cv_func_mmap_dev_zero+:} false; then : + $as_echo_n "(cached) " >&6 + else + # Add a system to this blacklist if it has mmap() but /dev/zero + # does not exist, or if mmapping /dev/zero does not give anonymous + # zeroed pages with both the following properties: + # 1. If you map N consecutive pages in with one call, and then + # unmap any subset of those pages, the pages that were not + # explicitly unmapped remain accessible. +@@ -11100,17 +13266,17 @@ else + esac + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_dev_zero" >&5 + $as_echo "$ac_cv_func_mmap_dev_zero" >&6; } + + # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5 + $as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; } +-if test "${ac_cv_decl_map_anon+set}" = set; then : ++if ${ac_cv_decl_map_anon+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + #include + #include + +@@ -11136,17 +13302,17 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_map_anon" >&5 + $as_echo "$ac_cv_decl_map_anon" >&6; } + + if test $ac_cv_decl_map_anon = no; then + ac_cv_func_mmap_anon=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5 + $as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; } +-if test "${ac_cv_func_mmap_anon+set}" = set; then : ++if ${ac_cv_func_mmap_anon+:} false; then : + $as_echo_n "(cached) " >&6 + else + # Add a system to this blacklist if it has mmap() and MAP_ANON or + # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) + # doesn't give anonymous zeroed pages with the same properties listed + # above for use of /dev/zero. + # Systems known to be in this category are Windows, VMS, and SCO Unix. + case "$host_os" in +@@ -11183,114 +13349,197 @@ fi + TESTSUBDIR_FALSE='#' + else + TESTSUBDIR_TRUE='#' + TESTSUBDIR_FALSE= + fi + + + TARGETDIR="unknown" ++HAVE_LONG_DOUBLE_VARIANT=0 + case "$host" in ++ aarch64*-*-*) ++ TARGET=AARCH64; TARGETDIR=aarch64 ++ ;; ++ + alpha*-*-*) + TARGET=ALPHA; TARGETDIR=alpha; + # Support 128-bit long double, changeable via command-line switch. + HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' + ;; + ++ arc*-*-*) ++ TARGET=ARC; TARGETDIR=arc ++ ;; ++ + arm*-*-*) + TARGET=ARM; TARGETDIR=arm + ;; + + amd64-*-freebsd* | amd64-*-openbsd*) + TARGET=X86_64; TARGETDIR=x86 + ;; + + amd64-*-freebsd*) + TARGET=X86_64; TARGETDIR=x86 ++ ;; ++ ++ amd64-*-freebsd*) ++ TARGET=X86_64; TARGETDIR=x86 + ;; + + avr32*-*-*) + TARGET=AVR32; TARGETDIR=avr32 + ;; + ++ bfin*) ++ TARGET=BFIN; TARGETDIR=bfin ++ ;; ++ + cris-*-*) + TARGET=LIBFFI_CRIS; TARGETDIR=cris + ;; + + frv-*-*) + TARGET=FRV; TARGETDIR=frv + ;; + +- hppa*-*-linux* | hppa*-*-openbsd* | parisc*-*-linux*) ++ hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) + TARGET=PA_LINUX; TARGETDIR=pa + ;; + hppa*64-*-hpux*) + TARGET=PA64_HPUX; TARGETDIR=pa + ;; + hppa*-*-hpux*) + TARGET=PA_HPUX; TARGETDIR=pa + ;; + + i?86-*-freebsd* | i?86-*-openbsd*) + TARGET=X86_FREEBSD; TARGETDIR=x86 + ;; +- i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2*) ++ i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*) + TARGET=X86_WIN32; TARGETDIR=x86 +- # All mingw/cygwin/win32 builds require this for sharedlib +- AM_LTLDFLAGS="-no-undefined" ++ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. ++ # We must also check with_cross_host to decide if this is a native ++ # or cross-build and select where to install dlls appropriately. ++ if test -n "$with_cross_host" && ++ test x"$with_cross_host" != x"no"; then ++ AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; ++ else ++ AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; ++ fi + ;; + i?86-*-darwin*) + TARGET=X86_DARWIN; TARGETDIR=x86 + ;; + i?86-*-solaris2.1[0-9]*) +- TARGET=X86_64; TARGETDIR=x86 +- ;; +- i?86-*-*) +- TARGET=X86; TARGETDIR=x86 ++ TARGETDIR=x86 ++ if test $ac_cv_sizeof_size_t = 4; then ++ TARGET=X86; ++ else ++ TARGET=X86_64; ++ fi ++ ;; ++ ++ x86_64-*-darwin*) ++ TARGET=X86_DARWIN; TARGETDIR=x86 ++ ;; ++ ++ x86_64-*-cygwin* | x86_64-*-mingw*) ++ TARGET=X86_WIN64; TARGETDIR=x86 ++ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. ++ # We must also check with_cross_host to decide if this is a native ++ # or cross-build and select where to install dlls appropriately. ++ if test -n "$with_cross_host" && ++ test x"$with_cross_host" != x"no"; then ++ AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; ++ else ++ AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; ++ fi ++ ;; ++ ++ i?86-*-* | x86_64-*-*) ++ TARGETDIR=x86 ++ if test $ac_cv_sizeof_size_t = 4; then ++ case "$host" in ++ *-gnux32) ++ TARGET=X86_64 ++ ;; ++ *) ++ TARGET=X86 ++ ;; ++ esac ++ else ++ TARGET=X86_64; ++ fi + ;; + + ia64*-*-*) + TARGET=IA64; TARGETDIR=ia64 + ;; + + m32r*-*-*) + TARGET=M32R; TARGETDIR=m32r + ;; + + m68k-*-*) + TARGET=M68K; TARGETDIR=m68k + ;; + +- mips-sgi-irix5.* | mips-sgi-irix6.*) ++ m88k-*-*) ++ TARGET=M88K; TARGETDIR=m88k ++ ;; ++ ++ microblaze*-*-*) ++ TARGET=MICROBLAZE; TARGETDIR=microblaze ++ ;; ++ ++ moxie-*-*) ++ TARGET=MOXIE; TARGETDIR=moxie ++ ;; ++ ++ metag-*-*) ++ TARGET=METAG; TARGETDIR=metag ++ ;; ++ ++ mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*) + TARGET=MIPS; TARGETDIR=mips + ;; + mips*-*linux* | mips*-*-openbsd*) + # Support 128-bit long double for NewABI. + HAVE_LONG_DOUBLE='defined(__mips64)' + TARGET=MIPS; TARGETDIR=mips + ;; + +- moxie-*-*) +- TARGET=MOXIE; TARGETDIR=moxie ++ nios2*-linux*) ++ TARGET=NIOS2; TARGETDIR=nios2 + ;; + + powerpc*-*-linux* | powerpc-*-sysv*) + TARGET=POWERPC; TARGETDIR=powerpc ++ HAVE_LONG_DOUBLE_VARIANT=1 ++ ;; ++ powerpc-*-amigaos*) ++ TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-beos*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; +- powerpc-*-darwin*) ++ powerpc-*-darwin* | powerpc64-*-darwin*) + TARGET=POWERPC_DARWIN; TARGETDIR=powerpc + ;; + powerpc-*-aix* | rs6000-*-aix*) + TARGET=POWERPC_AIX; TARGETDIR=powerpc + ;; + powerpc-*-freebsd* | powerpc-*-openbsd*) + TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc ++ HAVE_LONG_DOUBLE_VARIANT=1 ++ ;; ++ powerpc64-*-freebsd*) ++ TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc*-*-rtems*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + + s390-*-* | s390x-*-*) + TARGET=S390; TARGETDIR=s390 + ;; +@@ -11301,44 +13550,53 @@ case "$host" in + sh64-*-* | sh5*-*-*) + TARGET=SH64; TARGETDIR=sh64 + ;; + + sparc*-*-*) + TARGET=SPARC; TARGETDIR=sparc + ;; + +- x86_64-*-darwin*) +- TARGET=X86_DARWIN; TARGETDIR=x86 +- ;; +- +- x86_64-*-cygwin* | x86_64-*-mingw*) +- TARGET=X86_WIN64; TARGETDIR=x86 +- ;; +- +- x86_64-*-*) +- TARGET=X86_64; TARGETDIR=x86 +- ;; ++ tile*-*) ++ TARGET=TILE; TARGETDIR=tile ++ ;; ++ ++ vax-*-*) ++ TARGET=VAX; TARGETDIR=vax ++ ;; ++ ++ xtensa*-*) ++ TARGET=XTENSA; TARGETDIR=xtensa ++ ;; ++ + esac + + + + + if test $TARGETDIR = unknown; then +- as_fn_error "\"libffi has not been ported to $host.\"" "$LINENO" 5 ++ as_fn_error $? "\"libffi has not been ported to $host.\"" "$LINENO" 5 + fi + + if test x$TARGET = xMIPS; then + MIPS_TRUE= + MIPS_FALSE='#' + else + MIPS_TRUE='#' + MIPS_FALSE= + fi + ++ if test x$TARGET = xBFIN; then ++ BFIN_TRUE= ++ BFIN_FALSE='#' ++else ++ BFIN_TRUE='#' ++ BFIN_FALSE= ++fi ++ + if test x$TARGET = xSPARC; then + SPARC_TRUE= + SPARC_FALSE='#' + else + SPARC_TRUE='#' + SPARC_FALSE= + fi + +@@ -11377,16 +13635,32 @@ fi + if test x$TARGET = xX86_DARWIN; then + X86_DARWIN_TRUE= + X86_DARWIN_FALSE='#' + else + X86_DARWIN_TRUE='#' + X86_DARWIN_FALSE= + fi + ++ if test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 4; then ++ X86_DARWIN32_TRUE= ++ X86_DARWIN32_FALSE='#' ++else ++ X86_DARWIN32_TRUE='#' ++ X86_DARWIN32_FALSE= ++fi ++ ++ if test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 8; then ++ X86_DARWIN64_TRUE= ++ X86_DARWIN64_FALSE='#' ++else ++ X86_DARWIN64_TRUE='#' ++ X86_DARWIN64_FALSE= ++fi ++ + if test x$TARGET = xALPHA; then + ALPHA_TRUE= + ALPHA_FALSE='#' + else + ALPHA_TRUE='#' + ALPHA_FALSE= + fi + +@@ -11409,24 +13683,56 @@ fi + if test x$TARGET = xM68K; then + M68K_TRUE= + M68K_FALSE='#' + else + M68K_TRUE='#' + M68K_FALSE= + fi + ++ if test x$TARGET = xM88K; then ++ M88K_TRUE= ++ M88K_FALSE='#' ++else ++ M88K_TRUE='#' ++ M88K_FALSE= ++fi ++ ++ if test x$TARGET = xMICROBLAZE; then ++ MICROBLAZE_TRUE= ++ MICROBLAZE_FALSE='#' ++else ++ MICROBLAZE_TRUE='#' ++ MICROBLAZE_FALSE= ++fi ++ ++ if test x$TARGET = xMETAG; then ++ METAG_TRUE= ++ METAG_FALSE='#' ++else ++ METAG_TRUE='#' ++ METAG_FALSE= ++fi ++ + if test x$TARGET = xMOXIE; then + MOXIE_TRUE= + MOXIE_FALSE='#' + else + MOXIE_TRUE='#' + MOXIE_FALSE= + fi + ++ if test x$TARGET = xNIOS2; then ++ NIOS2_TRUE= ++ NIOS2_FALSE='#' ++else ++ NIOS2_TRUE='#' ++ NIOS2_FALSE= ++fi ++ + if test x$TARGET = xPOWERPC; then + POWERPC_TRUE= + POWERPC_FALSE='#' + else + POWERPC_TRUE='#' + POWERPC_FALSE= + fi + +@@ -11449,16 +13755,32 @@ fi + if test x$TARGET = xPOWERPC_FREEBSD; then + POWERPC_FREEBSD_TRUE= + POWERPC_FREEBSD_FALSE='#' + else + POWERPC_FREEBSD_TRUE='#' + POWERPC_FREEBSD_FALSE= + fi + ++ if test x$TARGET = xAARCH64; then ++ AARCH64_TRUE= ++ AARCH64_FALSE='#' ++else ++ AARCH64_TRUE='#' ++ AARCH64_FALSE= ++fi ++ ++ if test x$TARGET = xARC; then ++ ARC_TRUE= ++ ARC_FALSE='#' ++else ++ ARC_TRUE='#' ++ ARC_FALSE= ++fi ++ + if test x$TARGET = xARM; then + ARM_TRUE= + ARM_FALSE='#' + else + ARM_TRUE='#' + ARM_FALSE= + fi + +@@ -11537,20 +13859,44 @@ fi + if test x$TARGET = xPA64_HPUX; then + PA64_HPUX_TRUE= + PA64_HPUX_FALSE='#' + else + PA64_HPUX_TRUE='#' + PA64_HPUX_FALSE= + fi + ++ if test x$TARGET = xTILE; then ++ TILE_TRUE= ++ TILE_FALSE='#' ++else ++ TILE_TRUE='#' ++ TILE_FALSE= ++fi ++ ++ if test x$TARGET = xVAX; then ++ VAX_TRUE= ++ VAX_FALSE='#' ++else ++ VAX_TRUE='#' ++ VAX_FALSE= ++fi ++ ++ if test x$TARGET = xXTENSA; then ++ XTENSA_TRUE= ++ XTENSA_FALSE='#' ++else ++ XTENSA_TRUE='#' ++ XTENSA_FALSE= ++fi ++ + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 + $as_echo_n "checking for ANSI C header files... " >&6; } +-if test "${ac_cv_header_stdc+set}" = set; then : ++if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + #include + #include + #include +@@ -11653,29 +13999,40 @@ if test $ac_cv_header_stdc = yes; then + + $as_echo "#define STDC_HEADERS 1" >>confdefs.h + + fi + + for ac_func in memcpy + do : + ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" +-if test "x$ac_cv_func_memcpy" = x""yes; then : ++if test "x$ac_cv_func_memcpy" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_MEMCPY 1 + _ACEOF + + fi + done + ++ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" ++if test "x$ac_cv_type_size_t" = xyes; then : ++ ++else ++ ++cat >>confdefs.h <<_ACEOF ++#define size_t unsigned int ++_ACEOF ++ ++fi ++ + # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works + # for constant arguments. Useless! + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 + $as_echo_n "checking for working alloca.h... " >&6; } +-if test "${ac_cv_working_alloca_h+set}" = set; then : ++if ${ac_cv_working_alloca_h+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + int + main () + { +@@ -11698,17 +14055,17 @@ fi + if test $ac_cv_working_alloca_h = yes; then + + $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 + $as_echo_n "checking for alloca... " >&6; } +-if test "${ac_cv_func_alloca_works+set}" = set; then : ++if ${ac_cv_func_alloca_works+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #ifdef __GNUC__ + # define alloca __builtin_alloca + #else + # ifdef _MSC_VER +@@ -11717,17 +14074,17 @@ else + # else + # ifdef HAVE_ALLOCA_H + # include + # else + # ifdef _AIX + #pragma alloca + # else + # ifndef alloca /* predefined by HP cc +Olibcalls */ +-char *alloca (); ++void *alloca (size_t); + # endif + # endif + # endif + # endif + #endif + + int + main () +@@ -11761,17 +14118,17 @@ else + + ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + + $as_echo "#define C_ALLOCA 1" >>confdefs.h + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 + $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +-if test "${ac_cv_os_cray+set}" = set; then : ++if ${ac_cv_os_cray+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #if defined CRAY && ! defined CRAY2 + webecray + #else + wenotbecray +@@ -11788,58 +14145,54 @@ rm -f conftest* + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 + $as_echo "$ac_cv_os_cray" >&6; } + if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +-eval as_val=\$$as_ac_var +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + + cat >>confdefs.h <<_ACEOF + #define CRAY_STACKSEG_END $ac_func + _ACEOF + + break + fi + + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 + $as_echo_n "checking stack direction for C alloca... " >&6; } +-if test "${ac_cv_c_stack_direction+set}" = set; then : ++if ${ac_cv_c_stack_direction+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "$cross_compiling" = yes; then : + ac_cv_c_stack_direction=0 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $ac_includes_default + int +-find_stack_direction () +-{ +- static char *addr = 0; +- auto char dummy; +- if (addr == 0) +- { +- addr = &dummy; +- return find_stack_direction (); +- } +- else +- return (&dummy > addr) ? 1 : -1; +-} +- +-int +-main () +-{ +- return find_stack_direction () < 0; ++find_stack_direction (int *addr, int depth) ++{ ++ int dir, dummy = 0; ++ if (! addr) ++ addr = &dummy; ++ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; ++ dir = depth ? find_stack_direction (addr, depth - 1) : 0; ++ return dir + dummy; ++} ++ ++int ++main (int argc, char **argv) ++{ ++ return find_stack_direction (0, argc + !argv + 20) < 0; + } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_stack_direction=1 + else + ac_cv_c_stack_direction=-1 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -11858,28 +14211,27 @@ fi + + + # The cast to long int works around a bug in the HP C Compiler + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. + # This bug is HP SR number 8606223364. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 + $as_echo_n "checking size of double... " >&6; } +-if test "${ac_cv_sizeof_double+set}" = set; then : ++if ${ac_cv_sizeof_double+:} false; then : + $as_echo_n "(cached) " >&6 + else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : + + else + if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-{ as_fn_set_status 77 +-as_fn_error "cannot compute sizeof (double) +-See \`config.log' for more details." "$LINENO" 5; }; } ++as_fn_error 77 "cannot compute sizeof (double) ++See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_double=0 + fi + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 + $as_echo "$ac_cv_sizeof_double" >&6; } +@@ -11892,28 +14244,27 @@ cat >>confdefs.h <<_ACEOF + + + # The cast to long int works around a bug in the HP C Compiler + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. + # This bug is HP SR number 8606223364. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 + $as_echo_n "checking size of long double... " >&6; } +-if test "${ac_cv_sizeof_long_double+set}" = set; then : ++if ${ac_cv_sizeof_long_double+:} false; then : + $as_echo_n "(cached) " >&6 + else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : + + else + if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-{ as_fn_set_status 77 +-as_fn_error "cannot compute sizeof (long double) +-See \`config.log' for more details." "$LINENO" 5; }; } ++as_fn_error 77 "cannot compute sizeof (long double) ++See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_double=0 + fi + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 + $as_echo "$ac_cv_sizeof_long_double" >&6; } +@@ -11924,30 +14275,38 @@ cat >>confdefs.h <<_ACEOF + #define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double + _ACEOF + + + + # Also AC_SUBST this variable for ffi.h. + if test -z "$HAVE_LONG_DOUBLE"; then + HAVE_LONG_DOUBLE=0 +- if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then +- if test $ac_cv_sizeof_long_double != 0; then ++ if test $ac_cv_sizeof_long_double != 0; then ++ if test $HAVE_LONG_DOUBLE_VARIANT != 0; then ++ ++$as_echo "#define HAVE_LONG_DOUBLE_VARIANT 1" >>confdefs.h ++ + HAVE_LONG_DOUBLE=1 ++ else ++ if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then ++ HAVE_LONG_DOUBLE=1 + + $as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h + +- fi +- fi +-fi ++ fi ++ fi ++ fi ++fi ++ + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 + $as_echo_n "checking whether byte ordering is bigendian... " >&6; } +-if test "${ac_cv_c_bigendian+set}" = set; then : ++if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #ifndef __APPLE_CC__ + not a universal capable compiler +@@ -12155,59 +14514,60 @@ fi + no) + ;; #( + universal) + + $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) +- as_fn_error "unknown endianness ++ as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5 + $as_echo_n "checking assembler .cfi pseudo-op support... " >&6; } +-if test "${libffi_cv_as_cfi_pseudo_op+set}" = set; then : +- $as_echo_n "(cached) " >&6 +-else +- +- libffi_cv_as_cfi_pseudo_op=unknown ++if ${gcc_cv_as_cfi_pseudo_op+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ gcc_cv_as_cfi_pseudo_op=unknown + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + asm (".cfi_startproc\n\t.cfi_endproc"); + int + main () + { + + ; + return 0; + } + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : +- libffi_cv_as_cfi_pseudo_op=yes +-else +- libffi_cv_as_cfi_pseudo_op=no ++ gcc_cv_as_cfi_pseudo_op=yes ++else ++ gcc_cv_as_cfi_pseudo_op=no + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_cfi_pseudo_op" >&5 +-$as_echo "$libffi_cv_as_cfi_pseudo_op" >&6; } +-if test "x$libffi_cv_as_cfi_pseudo_op" = xyes; then ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5 ++$as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; } ++ if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then + + $as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h + +-fi ++ fi ++ + + if test x$TARGET = xSPARC; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5 + $as_echo_n "checking assembler and linker support unaligned pc related relocs... " >&6; } +-if test "${libffi_cv_as_sparc_ua_pcrel+set}" = set; then : ++if ${libffi_cv_as_sparc_ua_pcrel+:} false; then : + $as_echo_n "(cached) " >&6 + else + + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS -fpic" + LDFLAGS="$LDFLAGS -shared" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -12236,29 +14596,29 @@ fi + if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then + + $as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .register pseudo-op support" >&5 + $as_echo_n "checking assembler .register pseudo-op support... " >&6; } +-if test "${libffi_cv_as_register_pseudo_op+set}" = set; then : ++if ${libffi_cv_as_register_pseudo_op+:} false; then : + $as_echo_n "(cached) " >&6 + else + + libffi_cv_as_register_pseudo_op=unknown + # Check if we have .register + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ ++ ++int ++main () ++{ + asm (".register %g2, #scratch"); +-int +-main () +-{ +- + ; + return 0; + } + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + libffi_cv_as_register_pseudo_op=yes + else + libffi_cv_as_register_pseudo_op=no +@@ -12273,50 +14633,50 @@ fi + $as_echo "#define HAVE_AS_REGISTER_PSEUDO_OP 1" >>confdefs.h + + fi + fi + + if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5 + $as_echo_n "checking assembler supports pc related relocs... " >&6; } +-if test "${libffi_cv_as_x86_pcrel+set}" = set; then : ++if ${libffi_cv_as_x86_pcrel+:} false; then : + $as_echo_n "(cached) " >&6 + else + + libffi_cv_as_x86_pcrel=no + echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s +- if $CC $CFLAGS -c conftest.s > /dev/null; then ++ if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then + libffi_cv_as_x86_pcrel=yes + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_pcrel" >&5 + $as_echo "$libffi_cv_as_x86_pcrel" >&6; } + if test "x$libffi_cv_as_x86_pcrel" = xyes; then + + $as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .ascii pseudo-op support" >&5 + $as_echo_n "checking assembler .ascii pseudo-op support... " >&6; } +-if test "${libffi_cv_as_ascii_pseudo_op+set}" = set; then : ++if ${libffi_cv_as_ascii_pseudo_op+:} false; then : + $as_echo_n "(cached) " >&6 + else + + libffi_cv_as_ascii_pseudo_op=unknown + # Check if we have .ascii + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-asm (".ascii \"string\""); +-int +-main () +-{ +- ++ ++int ++main () ++{ ++asm (".ascii \\"string\\""); + ; + return 0; + } + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + libffi_cv_as_ascii_pseudo_op=yes + else + libffi_cv_as_ascii_pseudo_op=no +@@ -12329,29 +14689,29 @@ fi + if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then + + $as_echo "#define HAVE_AS_ASCII_PSEUDO_OP 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .string pseudo-op support" >&5 + $as_echo_n "checking assembler .string pseudo-op support... " >&6; } +-if test "${libffi_cv_as_string_pseudo_op+set}" = set; then : ++if ${libffi_cv_as_string_pseudo_op+:} false; then : + $as_echo_n "(cached) " >&6 + else + + libffi_cv_as_string_pseudo_op=unknown + # Check if we have .string + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-asm (".string \"string\""); +-int +-main () +-{ +- ++ ++int ++main () ++{ ++asm (".string \\"string\\""); + ; + return 0; + } + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + libffi_cv_as_string_pseudo_op=yes + else + libffi_cv_as_string_pseudo_op=no +@@ -12363,20 +14723,30 @@ fi + $as_echo "$libffi_cv_as_string_pseudo_op" >&6; } + if test "x$libffi_cv_as_string_pseudo_op" = xyes; then + + $as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h + + fi + fi + +-if test x$TARGET = xX86_WIN64; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5 ++# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. ++# Check whether --enable-pax_emutramp was given. ++if test "${enable_pax_emutramp+set}" = set; then : ++ enableval=$enable_pax_emutramp; if test "$enable_pax_emutramp" = "yes"; then ++ ++$as_echo "#define FFI_MMAP_EXEC_EMUTRAMP_PAX 1" >>confdefs.h ++ ++ fi ++fi ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5 + $as_echo_n "checking for _ prefix in compiled symbols... " >&6; } +-if test "${lt_cv_sys_symbol_underscore+set}" = set; then : ++if ${lt_cv_sys_symbol_underscore+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF + void nm_test_func(){} + int main(){nm_test_func;return 0;} + _LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +@@ -12411,36 +14781,50 @@ int main(){nm_test_func;return 0;} + rm -rf conftest* + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5 + $as_echo "$lt_cv_sys_symbol_underscore" >&6; } + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + + +- if test "x$sys_symbol_underscore" = xyes; then ++if test "x$sys_symbol_underscore" = xyes; then + + $as_echo "#define SYMBOL_UNDERSCORE 1" >>confdefs.h + +- fi +-fi +- ++fi ++ ++FFI_EXEC_TRAMPOLINE_TABLE=0 + case "$target" in +- # Darwin 10 (OSX 10.6) and beyond allocate non-executable pages +- *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) ++ *arm*-apple-darwin*) ++ FFI_EXEC_TRAMPOLINE_TABLE=1 ++ ++$as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h ++ ++ ;; ++ *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*) + + $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h + + ;; + esac ++ if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then ++ FFI_EXEC_TRAMPOLINE_TABLE_TRUE= ++ FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#' ++else ++ FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' ++ FFI_EXEC_TRAMPOLINE_TABLE_FALSE= ++fi ++ ++ + + if test x$TARGET = xX86_64; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking toolchain supports unwind section type" >&5 + $as_echo_n "checking toolchain supports unwind section type... " >&6; } +-if test "${libffi_cv_as_x86_64_unwind_section_type+set}" = set; then : ++if ${libffi_cv_as_x86_64_unwind_section_type+:} false; then : + $as_echo_n "(cached) " >&6 + else + + cat > conftest1.s << EOF + .text + .globl foo + foo: + jmp bar +@@ -12466,77 +14850,80 @@ fi + $as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; } + if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then + + $as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h + + fi + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5 ++if test "x$GCC" = "xyes"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5 + $as_echo_n "checking whether .eh_frame section should be read-only... " >&6; } +-if test "${libffi_cv_ro_eh_frame+set}" = set; then : +- $as_echo_n "(cached) " >&6 +-else +- +- libffi_cv_ro_eh_frame=no +- echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c +- if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then +- if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then +- libffi_cv_ro_eh_frame=yes +- elif grep '.section.*eh_frame.*#alloc' conftest.c \ +- | grep -v '#write' > /dev/null; then +- libffi_cv_ro_eh_frame=yes +- fi +- fi +- rm -f conftest.* ++if ${libffi_cv_ro_eh_frame+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ libffi_cv_ro_eh_frame=no ++ echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c ++ if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then ++ objdump -h conftest.o > conftest.dump 2>&1 ++ libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1` ++ libffi_test_line=`expr $libffi_eh_frame_line + 1`p ++ sed -n $libffi_test_line conftest.dump > conftest.line ++ if grep READONLY conftest.line > /dev/null; then ++ libffi_cv_ro_eh_frame=yes ++ fi ++ fi ++ rm -f conftest.* + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_ro_eh_frame" >&5 + $as_echo "$libffi_cv_ro_eh_frame" >&6; } +-if test "x$libffi_cv_ro_eh_frame" = xyes; then ++ if test "x$libffi_cv_ro_eh_frame" = xyes; then + + $as_echo "#define HAVE_RO_EH_FRAME 1" >>confdefs.h + + + $as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h + +-else ++ else + + $as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h + +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5 ++ fi ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5 + $as_echo_n "checking for __attribute__((visibility(\"hidden\")))... " >&6; } +-if test "${libffi_cv_hidden_visibility_attribute+set}" = set; then : +- $as_echo_n "(cached) " >&6 +-else +- +- echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c +- libffi_cv_hidden_visibility_attribute=no +- if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' ++if ${libffi_cv_hidden_visibility_attribute+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ++ echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c ++ libffi_cv_hidden_visibility_attribute=no ++ if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then +- if grep '\.hidden.*foo' conftest.s >/dev/null; then +- libffi_cv_hidden_visibility_attribute=yes +- fi +- fi +- rm -f conftest.* ++ if grep '\.hidden.*foo' conftest.s >/dev/null; then ++ libffi_cv_hidden_visibility_attribute=yes ++ fi ++ fi ++ rm -f conftest.* + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_hidden_visibility_attribute" >&5 + $as_echo "$libffi_cv_hidden_visibility_attribute" >&6; } +-if test $libffi_cv_hidden_visibility_attribute = yes; then ++ if test $libffi_cv_hidden_visibility_attribute = yes; then + + $as_echo "#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1" >>confdefs.h + ++ fi + fi + + + + + + + +@@ -12563,16 +14950,24 @@ fi + if test "${enable_structs+set}" = set; then : + enableval=$enable_structs; if test "$enable_structs" = "no"; then + + $as_echo "#define FFI_NO_STRUCTS 1" >>confdefs.h + + fi + fi + ++ if test "$enable_debug" = "yes"; then ++ FFI_DEBUG_TRUE= ++ FFI_DEBUG_FALSE='#' ++else ++ FFI_DEBUG_TRUE='#' ++ FFI_DEBUG_FALSE= ++fi ++ + + # Check whether --enable-raw-api was given. + if test "${enable_raw_api+set}" = set; then : + enableval=$enable_raw_api; if test "$enable_raw_api" = "no"; then + + $as_echo "#define FFI_NO_RAW_API 1" >>confdefs.h + + fi +@@ -12584,37 +14979,37 @@ if test "${enable_purify_safety+set}" = + enableval=$enable_purify_safety; if test "$enable_purify_safety" = "yes"; then + + $as_echo "#define USING_PURIFY 1" >>confdefs.h + + fi + fi + + +-if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +-else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++# These variables are only ever used when we cross-build to X86_WIN32. ++# And we only support this with GCC, so... ++if test "x$GCC" = "xyes"; then ++ if test -n "$with_cross_host" && ++ test x"$with_cross_host" != x"no"; then ++ toolexecdir='$(exec_prefix)/$(target_alias)' ++ toolexeclibdir='$(toolexecdir)/lib' ++ else ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' ++ fi ++ multi_os_directory=`$CC -print-multi-os-directory` ++ case $multi_os_directory in ++ .) ;; # Avoid trailing /. ++ ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; ++ esac ++ ++else + toolexeclibdir='$(libdir)' + fi +-multi_os_directory=`$CC -print-multi-os-directory` +-case $multi_os_directory in +- .) ;; # Avoid trailing /. +- *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; +-esac +- +- +- +-if test "${multilib}" = "yes"; then +- multilib_arg="--enable-multilib" +-else +- multilib_arg= +-fi ++ + + ac_config_commands="$ac_config_commands include" + + ac_config_commands="$ac_config_commands src" + + + ac_config_links="$ac_config_links include/ffitarget.h:src/$TARGETDIR/ffitarget.h" + +@@ -12681,192 +15076,268 @@ cat >confcache <<\_ACEOF + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache + if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then +- test "x$cache_file" != "x/dev/null" && ++ if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 + $as_echo "$as_me: updating cache $cache_file" >&6;} +- cat confcache >$cache_file ++ if test ! -f "$cache_file" || test -h "$cache_file"; then ++ cat confcache >"$cache_file" ++ else ++ case $cache_file in #( ++ */* | ?:*) ++ mv -f confcache "$cache_file"$$ && ++ mv -f "$cache_file"$$ "$cache_file" ;; #( ++ *) ++ mv -f confcache "$cache_file" ;; ++ esac ++ fi ++ fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 + $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi + fi + rm -f confcache + + test "x$prefix" = xNONE && prefix=$ac_default_prefix + # Let make expand exec_prefix. + test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + + DEFS=-DHAVE_CONFIG_H + + ac_libobjs= + ac_ltlibobjs= ++U= + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' + done + LIBOBJS=$ac_libobjs + + LTLIBOBJS=$ac_ltlibobjs + + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 ++$as_echo_n "checking that generated files are newer than configure... " >&6; } ++ if test -n "$am_sleep_pid"; then ++ # Hide warnings about reused PIDs. ++ wait $am_sleep_pid 2>/dev/null ++ fi ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 ++$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' + else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= + fi + + if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then +- as_fn_error "conditional \"AMDEP\" was never defined. ++ as_fn_error $? "conditional \"AMDEP\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then +- as_fn_error "conditional \"am__fastdepCC\" was never defined. ++ as_fn_error $? "conditional \"am__fastdepCC\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then +- as_fn_error "conditional \"am__fastdepCCAS\" was never defined. ++ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then +- as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. ++ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then +- as_fn_error "conditional \"TESTSUBDIR\" was never defined. ++ as_fn_error $? "conditional \"TESTSUBDIR\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then +- as_fn_error "conditional \"MIPS\" was never defined. ++ as_fn_error $? "conditional \"MIPS\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${BFIN_TRUE}" && test -z "${BFIN_FALSE}"; then ++ as_fn_error $? "conditional \"BFIN\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then +- as_fn_error "conditional \"SPARC\" was never defined. ++ as_fn_error $? "conditional \"SPARC\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${X86_TRUE}" && test -z "${X86_FALSE}"; then +- as_fn_error "conditional \"X86\" was never defined. ++ as_fn_error $? "conditional \"X86\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${X86_FREEBSD_TRUE}" && test -z "${X86_FREEBSD_FALSE}"; then +- as_fn_error "conditional \"X86_FREEBSD\" was never defined. ++ as_fn_error $? "conditional \"X86_FREEBSD\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${X86_WIN32_TRUE}" && test -z "${X86_WIN32_FALSE}"; then +- as_fn_error "conditional \"X86_WIN32\" was never defined. ++ as_fn_error $? "conditional \"X86_WIN32\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${X86_WIN64_TRUE}" && test -z "${X86_WIN64_FALSE}"; then +- as_fn_error "conditional \"X86_WIN64\" was never defined. ++ as_fn_error $? "conditional \"X86_WIN64\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${X86_DARWIN_TRUE}" && test -z "${X86_DARWIN_FALSE}"; then +- as_fn_error "conditional \"X86_DARWIN\" was never defined. ++ as_fn_error $? "conditional \"X86_DARWIN\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${X86_DARWIN32_TRUE}" && test -z "${X86_DARWIN32_FALSE}"; then ++ as_fn_error $? "conditional \"X86_DARWIN32\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++if test -z "${X86_DARWIN64_TRUE}" && test -z "${X86_DARWIN64_FALSE}"; then ++ as_fn_error $? "conditional \"X86_DARWIN64\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${ALPHA_TRUE}" && test -z "${ALPHA_FALSE}"; then +- as_fn_error "conditional \"ALPHA\" was never defined. ++ as_fn_error $? "conditional \"ALPHA\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${IA64_TRUE}" && test -z "${IA64_FALSE}"; then +- as_fn_error "conditional \"IA64\" was never defined. ++ as_fn_error $? "conditional \"IA64\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${M32R_TRUE}" && test -z "${M32R_FALSE}"; then +- as_fn_error "conditional \"M32R\" was never defined. ++ as_fn_error $? "conditional \"M32R\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${M68K_TRUE}" && test -z "${M68K_FALSE}"; then +- as_fn_error "conditional \"M68K\" was never defined. ++ as_fn_error $? "conditional \"M68K\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${M88K_TRUE}" && test -z "${M88K_FALSE}"; then ++ as_fn_error $? "conditional \"M88K\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++if test -z "${MICROBLAZE_TRUE}" && test -z "${MICROBLAZE_FALSE}"; then ++ as_fn_error $? "conditional \"MICROBLAZE\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++if test -z "${METAG_TRUE}" && test -z "${METAG_FALSE}"; then ++ as_fn_error $? "conditional \"METAG\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then +- as_fn_error "conditional \"MOXIE\" was never defined. ++ as_fn_error $? "conditional \"MOXIE\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${NIOS2_TRUE}" && test -z "${NIOS2_FALSE}"; then ++ as_fn_error $? "conditional \"NIOS2\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then +- as_fn_error "conditional \"POWERPC\" was never defined. ++ as_fn_error $? "conditional \"POWERPC\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${POWERPC_AIX_TRUE}" && test -z "${POWERPC_AIX_FALSE}"; then +- as_fn_error "conditional \"POWERPC_AIX\" was never defined. ++ as_fn_error $? "conditional \"POWERPC_AIX\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${POWERPC_DARWIN_TRUE}" && test -z "${POWERPC_DARWIN_FALSE}"; then +- as_fn_error "conditional \"POWERPC_DARWIN\" was never defined. ++ as_fn_error $? "conditional \"POWERPC_DARWIN\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then +- as_fn_error "conditional \"POWERPC_FREEBSD\" was never defined. ++ as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${AARCH64_TRUE}" && test -z "${AARCH64_FALSE}"; then ++ as_fn_error $? "conditional \"AARCH64\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++if test -z "${ARC_TRUE}" && test -z "${ARC_FALSE}"; then ++ as_fn_error $? "conditional \"ARC\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then +- as_fn_error "conditional \"ARM\" was never defined. ++ as_fn_error $? "conditional \"ARM\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then +- as_fn_error "conditional \"AVR32\" was never defined. ++ as_fn_error $? "conditional \"AVR32\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then +- as_fn_error "conditional \"LIBFFI_CRIS\" was never defined. ++ as_fn_error $? "conditional \"LIBFFI_CRIS\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then +- as_fn_error "conditional \"FRV\" was never defined. ++ as_fn_error $? "conditional \"FRV\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${S390_TRUE}" && test -z "${S390_FALSE}"; then +- as_fn_error "conditional \"S390\" was never defined. ++ as_fn_error $? "conditional \"S390\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${X86_64_TRUE}" && test -z "${X86_64_FALSE}"; then +- as_fn_error "conditional \"X86_64\" was never defined. ++ as_fn_error $? "conditional \"X86_64\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${SH_TRUE}" && test -z "${SH_FALSE}"; then +- as_fn_error "conditional \"SH\" was never defined. ++ as_fn_error $? "conditional \"SH\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${SH64_TRUE}" && test -z "${SH64_FALSE}"; then +- as_fn_error "conditional \"SH64\" was never defined. ++ as_fn_error $? "conditional \"SH64\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${PA_LINUX_TRUE}" && test -z "${PA_LINUX_FALSE}"; then +- as_fn_error "conditional \"PA_LINUX\" was never defined. ++ as_fn_error $? "conditional \"PA_LINUX\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${PA_HPUX_TRUE}" && test -z "${PA_HPUX_FALSE}"; then +- as_fn_error "conditional \"PA_HPUX\" was never defined. ++ as_fn_error $? "conditional \"PA_HPUX\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then +- as_fn_error "conditional \"PA64_HPUX\" was never defined. ++ as_fn_error $? "conditional \"PA64_HPUX\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi +- ++if test -z "${TILE_TRUE}" && test -z "${TILE_FALSE}"; then ++ as_fn_error $? "conditional \"TILE\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++if test -z "${VAX_TRUE}" && test -z "${VAX_FALSE}"; then ++ as_fn_error $? "conditional \"VAX\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++if test -z "${XTENSA_TRUE}" && test -z "${XTENSA_FALSE}"; then ++ as_fn_error $? "conditional \"XTENSA\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++ ++if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then ++ as_fn_error $? "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then +- as_fn_error "conditional \"FFI_DEBUG\" was never defined. ++ as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi +- +-: ${CONFIG_STATUS=./config.status} ++if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then ++ as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi ++ ++: "${CONFIG_STATUS=./config.status}" + ac_write_fail=0 + ac_clean_files_save=$ac_clean_files + ac_clean_files="$ac_clean_files $CONFIG_STATUS" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 + $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} + as_write_fail=0 + cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 + #! $SHELL +@@ -12957,16 +15428,17 @@ fi + # IFS + # We need space, tab and new line, in precisely that order. Quoting is + # there to prevent editors from complaining about space-tab. + # (If _AS_PATH_WALK were called with IFS unset, it would disable word + # splitting by setting IFS to empty value.) + IFS=" "" $as_nl" + + # Find who we are. Look in the path if we contain no directory separator. ++as_myself= + case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +@@ -13002,29 +15474,29 @@ LC_ALL=C + export LC_ALL + LANGUAGE=C + export LANGUAGE + + # CDPATH. + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +-# as_fn_error ERROR [LINENO LOG_FD] +-# --------------------------------- ++# as_fn_error STATUS ERROR [LINENO LOG_FD] ++# ---------------------------------------- + # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are + # provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-# script with status $?, using 1 if that was 0. ++# script with STATUS, using 1 if that was 0. + as_fn_error () + { +- as_status=$?; test $as_status -eq 0 && as_status=1 +- if test "$3"; then +- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 +- fi +- $as_echo "$as_me: error: $1" >&2 ++ as_status=$1; test $as_status -eq 0 && as_status=1 ++ if test "$4"; then ++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 ++ fi ++ $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + + + # as_fn_set_status STATUS + # ----------------------- + # Set $? to STATUS, without forking. + as_fn_set_status () +@@ -13152,26 +15624,26 @@ else + mkdir conf$$.dir 2>/dev/null + fi + if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -p'. ++ # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else +- as_ln_s='cp -p' +- fi +-else +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' ++ fi ++else ++ as_ln_s='cp -pR' + fi + rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file + rmdir conf$$.dir 2>/dev/null + + + # as_fn_mkdir_p + # ------------- + # Create "$as_dir" as a directory, including parents if necessary. +@@ -13210,49 +15682,37 @@ as_fn_mkdir_p () + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" ++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + + } # as_fn_mkdir_p + if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' + else + test -d ./-p && rmdir ./-p + as_mkdir_p=false + fi + +-if test -x / >/dev/null 2>&1; then +- as_test_x='test -x' +-else +- if ls -dL / >/dev/null 2>&1; then +- as_ls_L_option=L +- else +- as_ls_L_option= +- fi +- as_test_x=' +- eval sh -c '\'' +- if test -d "$1"; then +- test -d "$1/."; +- else +- case $1 in #( +- -*)set "./$1";; +- esac; +- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( +- ???[sx]*):;;*)false;;esac;fi +- '\'' sh +- ' +-fi +-as_executable_p=$as_test_x ++ ++# as_fn_executable_p FILE ++# ----------------------- ++# Test if FILE is an executable regular file. ++as_fn_executable_p () ++{ ++ test -f "$1" && test -x "$1" ++} # as_fn_executable_p ++as_test_x='test -x' ++as_executable_p=as_fn_executable_p + + # Sed expression to map a string onto a valid CPP name. + as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + + # Sed expression to map a string onto a valid variable name. + as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +@@ -13263,18 +15723,18 @@ exec 6>&1 + _ASEOF + test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + # Save the log message, to keep $0 and so on meaningful, and to + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by libffi $as_me 3.0.10rc0, which was +-generated by GNU Autoconf 2.65. Invocation command line was ++This file was extended by libffi $as_me 3.1-rc1, which was ++generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + + on `(hostname || uname -n) 2>/dev/null | sed 1q` +@@ -13327,27 +15787,27 @@ Configuration headers: + $config_headers + + Configuration links: + $config_links + + Configuration commands: + $config_commands + +-Report bugs to ." ++Report bugs to ." + + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-libffi config.status 3.0.10rc0 +-configured by $0, generated by GNU Autoconf 2.65, ++libffi config.status 3.1-rc1 ++configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +-Copyright (C) 2009 Free Software Foundation, Inc. ++Copyright (C) 2012 Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + + ac_pwd='$ac_pwd' + srcdir='$srcdir' + INSTALL='$INSTALL' + MKDIR_P='$MKDIR_P' + AWK='$AWK' +@@ -13355,21 +15815,26 @@ test -n "\$AWK" || AWK=awk + _ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + # The default lists apply if the user does not specify any file. + ac_need_defaults=: + while test $# != 0 + do + case $1 in +- --*=*) ++ --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; ++ --*=) ++ ac_option=`expr "X$1" : 'X\([^=]*\)='` ++ ac_optarg= ++ ac_shift=: ++ ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in +@@ -13381,38 +15846,39 @@ do + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header +- as_fn_error "ambiguous option: \`$1' ++ as_fn_error $? "ambiguous option: \`$1' + Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. +- -*) as_fn_error "unrecognized option: \`$1' ++ -*) as_fn_error $? "unrecognized option: \`$1' + Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift + done +@@ -13422,17 +15888,17 @@ ac_configure_extra_args= + if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" + fi + + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + if \$ac_cs_recheck; then +- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion ++ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" + fi + + _ACEOF +@@ -13446,211 +15912,246 @@ exec 5>>config.log + $as_echo "$ac_log" + } >&5 + + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + # + # INIT-COMMANDS + # ++ax_enable_builddir_srcdir="$srcdir" # $srcdir ++ax_enable_builddir_host="$HOST" # $HOST / $host ++ax_enable_builddir_version="$VERSION" # $VERSION ++ax_enable_builddir_package="$PACKAGE" # $PACKAGE ++ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX ++ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED ++ax_enable_builddir="$ax_enable_builddir" # $SUB ++ + AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + sed_quote_subst='$sed_quote_subst' + double_quote_subst='$double_quote_subst' + delay_variable_subst='$delay_variable_subst' +-macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +-macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +-enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +-enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +-pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +-enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +-host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +-host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +-host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +-build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +-build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +-build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +-SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +-Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +-GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +-EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +-FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +-LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +-NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +-LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +-max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +-ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +-exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +-lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +-lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +-lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +-reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +-reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +-deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +-file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +-AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +-AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +-STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +-RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +-old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +-CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +-compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +-GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +-objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +-SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +-ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +-MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +-lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +-lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +-lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +-lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +-lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +-need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +-DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +-NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +-LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +-OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +-OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +-libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +-shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +-enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +-export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +-whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +-compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +-old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +-allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +-no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +-inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +-link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +-fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +-always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +-export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +-include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +-prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +-variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +-need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +-need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +-version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +-runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +-shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +-shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +-libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +-library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +-soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +-postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +-finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +-sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +-sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +-hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +-enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +-enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +-enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +-old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +-striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' ++macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' ++macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' ++enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' ++enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' ++pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' ++enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' ++SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ++ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' ++PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' ++host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' ++host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' ++host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' ++build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' ++build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' ++build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' ++SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' ++Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' ++GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' ++EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' ++FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' ++LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' ++NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' ++LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' ++max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ++ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' ++exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' ++lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' ++lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' ++lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' ++lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' ++lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' ++reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' ++reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' ++OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' ++deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' ++file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' ++file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' ++want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' ++DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' ++sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' ++AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' ++AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' ++archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' ++STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' ++RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' ++old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' ++old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' ++old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' ++lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' ++CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' ++CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' ++compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' ++GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' ++lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' ++lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' ++lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' ++lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' ++nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' ++lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' ++objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' ++MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' ++lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' ++lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' ++lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' ++lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' ++lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' ++need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' ++MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' ++DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' ++NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' ++LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' ++OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' ++OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' ++libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' ++shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' ++extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' ++archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' ++enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' ++export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' ++whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' ++compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' ++old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' ++old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' ++archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' ++archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' ++module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' ++module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' ++with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' ++allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' ++no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' ++hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' ++hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' ++hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' ++hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' ++hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' ++hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' ++hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' ++inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' ++link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' ++always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' ++export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' ++exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' ++include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' ++prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' ++postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' ++file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' ++variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' ++need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' ++need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' ++version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' ++runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' ++shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' ++shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' ++libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' ++library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' ++soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' ++install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' ++postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' ++postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' ++finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' ++finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' ++hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' ++sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' ++sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' ++hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' ++enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' ++enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' ++enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' ++old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' ++striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + + LTCC='$LTCC' + LTCFLAGS='$LTCFLAGS' + compiler='$compiler_DEFAULT' + ++# A function that is used when there is no print builtin or printf. ++func_fallback_echo () ++{ ++ eval 'cat <<_LTECHO_EOF ++\$1 ++_LTECHO_EOF' ++} ++ + # Quote evaled strings. +-for var in SED \ ++for var in SHELL \ ++ECHO \ ++PATH_SEPARATOR \ ++SED \ + GREP \ + EGREP \ + FGREP \ + LD \ + NM \ + LN_S \ + lt_SP2NL \ + lt_NL2SP \ + reload_flag \ + OBJDUMP \ + deplibs_check_method \ + file_magic_cmd \ ++file_magic_glob \ ++want_nocaseglob \ ++DLLTOOL \ ++sharedlib_from_linklib_cmd \ + AR \ + AR_FLAGS \ ++archiver_list_spec \ + STRIP \ + RANLIB \ + CC \ + CFLAGS \ + compiler \ + lt_cv_sys_global_symbol_pipe \ + lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +-SHELL \ +-ECHO \ ++nm_file_list_spec \ + lt_prog_compiler_no_builtin_flag \ ++lt_prog_compiler_pic \ + lt_prog_compiler_wl \ +-lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_cv_prog_compiler_c_o \ + need_locks \ ++MANIFEST_TOOL \ + DSYMUTIL \ + NMEDIT \ + LIPO \ + OTOOL \ + OTOOL64 \ + shrext_cmds \ + export_dynamic_flag_spec \ + whole_archive_flag_spec \ + compiler_needs_object \ + with_gnu_ld \ + allow_undefined_flag \ + no_undefined_flag \ + hardcode_libdir_flag_spec \ +-hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ +-fix_srcfile_path \ + exclude_expsyms \ + include_expsyms \ + file_list_spec \ + variables_saved_for_relink \ + libname_spec \ + library_names_spec \ + soname_spec \ ++install_override_mode \ + finish_eval \ + old_striplib \ + striplib; do +- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in ++ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ++ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac + done + + # Double-quote double-evaled strings. +@@ -13662,37 +16163,32 @@ extract_expsyms_cmds \ + old_archive_from_new_cmds \ + old_archive_from_expsyms_cmds \ + archive_cmds \ + archive_expsym_cmds \ + module_cmds \ + module_expsym_cmds \ + export_symbols_cmds \ + prelink_cmds \ ++postlink_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + finish_cmds \ + sys_lib_search_path_spec \ + sys_lib_dlsearch_path_spec; do +- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in ++ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ++ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac + done + +-# Fix-up fallback echo if it was mangled by the above quoting rules. +-case \$lt_ECHO in +-*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` +- ;; +-esac +- + ac_aux_dir='$ac_aux_dir' + xsi_shell='$xsi_shell' + lt_shell_append='$lt_shell_append' + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes INIT. + if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +@@ -13713,29 +16209,30 @@ TARGETDIR="$TARGETDIR" + + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + + # Handling of arguments. + for ac_config_target in $ac_config_targets + do + case $ac_config_target in + "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;; ++ "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;; + "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;; + "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; + "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; + "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; + +- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; ++ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac + done + + + # If the user did not use the arguments to specify the items to instantiate, + # then the envvar interface is used. Set only those that are not. + # We use the long form for the default assignment because of an extremely + # bizarre bug on SunOS 4.1.3. +@@ -13749,82 +16246,84 @@ fi + # Have a temporary directory for convenience. Make it in the build tree + # simply because there is no reason against having it here, and in addition, + # creating and moving files from /tmp can sometimes cause problems. + # Hook for its removal unless debugging. + # Note that there is a small window in which the directory will not be cleaned: + # after its creation but before its name has been assigned to `$tmp'. + $debug || + { +- tmp= ++ tmp= ac_tmp= + trap 'exit_status=$? +- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ++ : "${ac_tmp:=$tmp}" ++ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + ' 0 + trap 'as_fn_exit 1' 1 2 13 15 + } + # Create a (secure) tmp directory for tmp files. + + { + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && +- test -n "$tmp" && test -d "$tmp" ++ test -d "$tmp" + } || + { + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 ++} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ++ac_tmp=$tmp + + # Set up the scripts for CONFIG_FILES section. + # No need to generate them if there are no CONFIG_FILES. + # This happens for instance with `./config.status config.h'. + if test -n "$CONFIG_FILES"; then + + + ac_cr=`echo X | tr X '\015'` + # On cygwin, bash can eat \r inside `` if the user requested igncr. + # But we know of no other shell where ac_cr would be empty at this + # point, so we can use a bashism as a fallback. + if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' + fi + ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` + if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then +- ac_cs_awk_cr='\r' ++ ac_cs_awk_cr='\\r' + else + ac_cs_awk_cr=$ac_cr + fi + +-echo 'BEGIN {' >"$tmp/subs1.awk" && ++echo 'BEGIN {' >"$ac_tmp/subs1.awk" && + _ACEOF + + + { + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" + } >conf$$subs.sh || +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ++ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` + ac_delim='%!_!# ' + for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi + done + rm -f conf$$subs.sh + + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-cat >>"\$tmp/subs1.awk" <<\\_ACAWK && ++cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && + _ACEOF + sed -n ' + h + s/^/S["/; s/!.*/"]=/ + p + g + s/^[^!]*!// + :repl +@@ -13862,17 +16361,17 @@ t delim + /^[^""]/{ + N + s/\n// + } + ' >>$CONFIG_STATUS || ac_write_fail=1 + rm -f conf$$subs.awk + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + _ACAWK +-cat >>"\$tmp/subs1.awk" <<_ACAWK && ++cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + + } + { + line = $ 0 + nfields = split(line, field, "@") + substed = 0 +@@ -13894,59 +16393,67 @@ cat >>"\$tmp/subs1.awk" <<_ACAWK && + + _ACAWK + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" + else + cat +-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ +- || as_fn_error "could not setup config files machinery" "$LINENO" 5 +-_ACEOF +- +-# VPATH may cause trouble with some makes, so we remove $(srcdir), +-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and ++fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ ++ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 ++_ACEOF ++ ++# VPATH may cause trouble with some makes, so we remove sole $(srcdir), ++# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and + # trailing colons and then remove the whole line if VPATH becomes empty + # (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=/{ +-s/:*\$(srcdir):*/:/ +-s/:*\${srcdir}:*/:/ +-s/:*@srcdir@:*/:/ +-s/^\([^=]*=[ ]*\):*/\1/ ++ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ ++h ++s/// ++s/^/:/ ++s/[ ]*$/:/ ++s/:\$(srcdir):/:/g ++s/:\${srcdir}:/:/g ++s/:@srcdir@:/:/g ++s/^:*// + s/:*$// ++x ++s/\(=[ ]*\).*/\1/ ++G ++s/\n// + s/^[^=]*=[ ]*$// + }' + fi + + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + fi # test -n "$CONFIG_FILES" + + # Set up the scripts for CONFIG_HEADERS section. + # No need to generate them if there are no CONFIG_HEADERS. + # This happens for instance with `./config.status Makefile'. + if test -n "$CONFIG_HEADERS"; then +-cat >"$tmp/defines.awk" <<\_ACAWK || ++cat >"$ac_tmp/defines.awk" <<\_ACAWK || + BEGIN { + _ACEOF + + # Transform confdefs.h into an awk script `defines.awk', embedded as + # here-document in config.status, that substitutes the proper values into + # config.h.in to produce config.h. + + # Create a delimiter string that does not exist in confdefs.h, to ease + # handling of long lines. + ac_delim='%!_!# ' + for ac_last_try in false false :; do +- ac_t=`sed -n "/$ac_delim/p" confdefs.h` +- if test -z "$ac_t"; then ++ ac_tt=`sed -n "/$ac_delim/p" confdefs.h` ++ if test -z "$ac_tt"; then + break + elif $ac_last_try; then +- as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi + done + + # For the awk script, D is an array of macro values keyed by name, + # likewise P contains macro parameters if any. Preserve backslash + # newline sequences. +@@ -14021,30 +16528,30 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ + next + } + } + } + { print } + _ACAWK + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- as_fn_error "could not setup config headers machinery" "$LINENO" 5 ++ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 + fi # test -n "$CONFIG_HEADERS" + + + eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" + shift + for ac_tag + do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; +- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; ++ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift +@@ -14053,26 +16560,26 @@ do + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in +- -) ac_f="$tmp/stdin";; ++ -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || +- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; ++ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ +@@ -14088,18 +16595,18 @@ do + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in +- *:-:* | *:-) cat >"$tmp/stdin" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; ++ *:-:* | *:-) cat >"$ac_tmp/stdin" \ ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || + $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ +@@ -14225,56 +16732,57 @@ s&@top_srcdir@&$ac_top_srcdir&;t t + s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t + s&@builddir@&$ac_builddir&;t t + s&@abs_builddir@&$ac_abs_builddir&;t t + s&@abs_top_builddir@&$ac_abs_top_builddir&;t t + s&@INSTALL@&$ac_INSTALL&;t t + s&@MKDIR_P@&$ac_MKDIR_P&;t t + $ac_datarootdir_hack + " +-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ ++ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + + test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && +- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && +- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && ++ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && ++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ ++ "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined." >&5 ++which seems to be undefined. Please make sure it is defined" >&5 + $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined." >&2;} +- +- rm -f "$tmp/stdin" ++which seems to be undefined. Please make sure it is defined" >&2;} ++ ++ rm -f "$ac_tmp/stdin" + case $ac_file in +- -) cat "$tmp/out" && rm -f "$tmp/out";; +- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; ++ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; ++ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" +- } >"$tmp/config.h" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 +- if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then ++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" ++ } >"$ac_tmp/config.h" \ ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ++ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + $as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" +- mv "$tmp/config.h" "$ac_file" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ mv "$ac_tmp/config.h" "$ac_file" \ ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ +- || as_fn_error "could not create -" "$LINENO" 5 ++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ ++ || as_fn_error $? "could not create -" "$LINENO" 5 + fi + # Compute "$ac_file"'s index in $config_headers. + _am_arg="$ac_file" + _am_stamp_count=1 + for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; +@@ -14318,53 +16826,197 @@ echo "timestamp for $_am_arg" >`$as_dirn + if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then + ac_source=$srcdir/$ac_source + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 + $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} + + if test ! -r "$ac_source"; then +- as_fn_error "$ac_source: file not found" "$LINENO" 5 ++ as_fn_error $? "$ac_source: file not found" "$LINENO" 5 + fi + rm -f "$ac_file" + + # Try a relative symlink, then a hard link, then a copy. +- case $srcdir in ++ case $ac_source in + [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; + *) ac_rel_source=$ac_top_build_prefix$ac_source ;; + esac + ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || + ln "$ac_source" "$ac_file" 2>/dev/null || + cp -p "$ac_source" "$ac_file" || +- as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 ++ as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 + fi + ;; + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 + $as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in ++ "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir" ++ if test ".$ax_enable_builddir" = ".." ; then ++ if test -f "$top_srcdir/Makefile" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5 ++$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;} ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5 ++$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;} ++ fi ++ else ++ if test -f "$ac_top_srcdir/Makefile" ; then ++ a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile` ++ test "$a" != "$b" && rm "$ac_top_srcdir/Makefile" ++ fi ++ if test -f "$ac_top_srcdir/Makefile" ; then ++ echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk ++ echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk ++ eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" ++ if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null ++ then rm $ac_top_srcdir/Makefile ; fi ++ cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING ++ fi ++ if test ! -f "$ac_top_srcdir/Makefile" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5 ++$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;} ++ x='`' ; cat >$tmp/conftemp.sed <<_EOF ++/^\$/n ++x ++/^\$/bS ++x ++/\\\\\$/{H;d;} ++{H;s/.*//;x;} ++bM ++:S ++x ++/\\\\\$/{h;d;} ++{h;s/.*//;x;} ++:M ++s/\\(\\n\\) /\\1 /g ++/^ /d ++/^[ ]*[\\#]/d ++/^VPATH *=/d ++s/^srcdir *=.*/srcdir = ./ ++s/^top_srcdir *=.*/top_srcdir = ./ ++/[:=]/!d ++/^\\./d ++/ = /b ++/ .= /b ++/:/!b ++s/:.*/:/ ++s/ / /g ++s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g ++s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/ ++s/ / /g ++/^all all-all[ :]/i\\ ++all-configured : all-all ++s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g ++/-all-all/d ++a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ ++ ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ ++ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ++ ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ ++ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done ++/dist-all *:/a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ ++ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ++ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ++ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ ++ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done ++/dist-[a-zA-Z0-9]*-all *:/a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ ++ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ++ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ++ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ ++ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done ++/distclean-all *:/a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ ++ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ++ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ ++ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ ++ ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ ++ ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile ++_EOF ++ cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING ++ $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile ++ if test -f "$ac_top_srcdir/Makefile.mk" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5 ++$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;} ++ cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile ++ fi ; xxxx="####" ++ echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile ++ # sanity check ++ if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5 ++$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;} ++ $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \ ++ >$ac_top_srcdir/Makefile~ ++ (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null ++ fi ++ else ++ xxxx="\\#\\#\\#\\#" ++ # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed ++ echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed ++ $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp ++ cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING ++ cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING ++ if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5 ++$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;} ++ rm "$tmp/mkfile.tmp" ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5 ++$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;} ++ mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile" ++ fi ++ fi ++ { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5 ++$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;} ++ xxxx="####" ++ echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile ++ fi ++ ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { +- # Autoconf 2.62 quotes --file arguments for eval, but not when files ++ # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. +- # We used to match only the files named `Makefile.in', but ++ # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || + $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +@@ -14388,31 +17040,29 @@ echo "timestamp for $_am_arg" >`$as_dirn + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote +- # from the Makefile without running `make'. ++ # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` +- test -z "am__include" && continue ++ test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` +- # When using ansi2knr, U may be empty or an underscore; expand it +- U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ +- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do ++ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || + $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || + $as_echo X"$file" | +@@ -14456,17 +17106,18 @@ echo "timestamp for $_am_arg" >`$as_dirn + #! $SHELL + + # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. + # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION + # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + # NOTE: Changes made to this file will be lost: look at ltmain.sh. + # + # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +-# 2006, 2007, 2008 Free Software Foundation, Inc. ++# 2006, 2007, 2008, 2009, 2010, 2011 Free Software ++# Foundation, Inc. + # Written by Gordon Matzigkeit, 1996 + # + # This file is part of GNU Libtool. + # + # GNU Libtool is free software; you can redistribute it and/or + # modify it under the terms of the GNU General Public License as + # published by the Free Software Foundation; either version 2 of + # the License, or (at your option) any later version. +@@ -14504,16 +17155,25 @@ build_libtool_libs=$enable_shared + build_old_libs=$enable_static + + # What type of objects to build. + pic_mode=$pic_mode + + # Whether or not to optimize for fast installation. + fast_install=$enable_fast_install + ++# Shell to use when invoking shell scripts. ++SHELL=$lt_SHELL ++ ++# An echo program that protects backslashes. ++ECHO=$lt_ECHO ++ ++# The PATH separator for the build system. ++PATH_SEPARATOR=$lt_PATH_SEPARATOR ++ + # The host system. + host_alias=$host_alias + host=$host + host_os=$host_os + + # The build system. + build_alias=$build_alias + build=$build +@@ -14553,41 +17213,63 @@ exeext=$exeext + lt_unset=$lt_unset + + # turn spaces into newlines. + SP2NL=$lt_lt_SP2NL + + # turn newlines into spaces. + NL2SP=$lt_lt_NL2SP + +-# How to create reloadable object files. +-reload_flag=$lt_reload_flag +-reload_cmds=$lt_reload_cmds ++# convert \$build file names to \$host format. ++to_host_file_cmd=$lt_cv_to_host_file_cmd ++ ++# convert \$build files to toolchain format. ++to_tool_file_cmd=$lt_cv_to_tool_file_cmd + + # An object symbol dumper. + OBJDUMP=$lt_OBJDUMP + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method + +-# Command to use when deplibs_check_method == "file_magic". ++# Command to use when deplibs_check_method = "file_magic". + file_magic_cmd=$lt_file_magic_cmd + ++# How to find potential files when deplibs_check_method = "file_magic". ++file_magic_glob=$lt_file_magic_glob ++ ++# Find potential files using nocaseglob when deplibs_check_method = "file_magic". ++want_nocaseglob=$lt_want_nocaseglob ++ ++# DLL creation program. ++DLLTOOL=$lt_DLLTOOL ++ ++# Command to associate shared and link libraries. ++sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd ++ + # The archiver. + AR=$lt_AR ++ ++# Flags to create an archive. + AR_FLAGS=$lt_AR_FLAGS + ++# How to feed a file listing to the archiver. ++archiver_list_spec=$lt_archiver_list_spec ++ + # A symbol stripping program. + STRIP=$lt_STRIP + + # Commands used to install an old-style archive. + RANLIB=$lt_RANLIB + old_postinstall_cmds=$lt_old_postinstall_cmds + old_postuninstall_cmds=$lt_old_postuninstall_cmds + ++# Whether to use a lock for old archive extraction. ++lock_old_archive_extraction=$lock_old_archive_extraction ++ + # A C compiler. + LTCC=$lt_CC + + # LTCC compiler flags. + LTCFLAGS=$lt_CFLAGS + + # Take the output of nm and produce a listing of raw symbols and C names. + global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe +@@ -14596,31 +17278,34 @@ global_symbol_pipe=$lt_lt_cv_sys_global_ + global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + + # Transform the output of nm in a C name address pair. + global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + + # Transform the output of nm in a C name address pair when lib prefix is needed. + global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + ++# Specify filename containing input files for \$NM. ++nm_file_list_spec=$lt_nm_file_list_spec ++ ++# The root where to search for dependent libraries,and in which our libraries should be installed. ++lt_sysroot=$lt_sysroot ++ + # The name of the directory that contains temporary libtool files. + objdir=$objdir + +-# Shell to use when invoking shell scripts. +-SHELL=$lt_SHELL +- +-# An echo program that does not interpret backslashes. +-ECHO=$lt_ECHO +- + # Used to examine libraries when file_magic_cmd begins with "file". + MAGIC_CMD=$MAGIC_CMD + + # Must we lock files when doing compilation? + need_locks=$lt_need_locks + ++# Manifest tool. ++MANIFEST_TOOL=$lt_MANIFEST_TOOL ++ + # Tool to manipulate archived DWARF debug symbol files on Mac OS X. + DSYMUTIL=$lt_DSYMUTIL + + # Tool to change global to local symbols on Mac OS X. + NMEDIT=$lt_NMEDIT + + # Tool to manipulate fat objects and archives on Mac OS X. + LIPO=$lt_LIPO +@@ -14667,16 +17352,19 @@ libname_spec=$lt_libname_spec + + # List of archive names. First name is the real one, the rest are links. + # The last name is the one that the linker finds with -lNAME + library_names_spec=$lt_library_names_spec + + # The coded name of the library, if different from the real name. + soname_spec=$lt_soname_spec + ++# Permission mode override for installation of shared libraries. ++install_override_mode=$lt_install_override_mode ++ + # Command to use after installation of a shared archive. + postinstall_cmds=$lt_postinstall_cmds + + # Command to use after uninstallation of a shared archive. + postuninstall_cmds=$lt_postuninstall_cmds + + # Commands used to finish a libtool library installation in a directory. + finish_cmds=$lt_finish_cmds +@@ -14706,34 +17394,38 @@ dlopen_self_static=$enable_dlopen_self_s + # Commands to strip libraries. + old_striplib=$lt_old_striplib + striplib=$lt_striplib + + + # The linker used to build libraries. + LD=$lt_LD + ++# How to create reloadable object files. ++reload_flag=$lt_reload_flag ++reload_cmds=$lt_reload_cmds ++ + # Commands used to build an old-style archive. + old_archive_cmds=$lt_old_archive_cmds + + # A language specific compiler. + CC=$lt_compiler + + # Is the compiler the GNU compiler? + with_gcc=$GCC + + # Compiler flag to turn off builtin functions. + no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + ++# Additional compiler flags for building library objects. ++pic_flag=$lt_lt_prog_compiler_pic ++ + # How to pass a linker flag through the compiler. + wl=$lt_lt_prog_compiler_wl + +-# Additional compiler flags for building library objects. +-pic_flag=$lt_lt_prog_compiler_pic +- + # Compiler flag to prevent dynamic linking. + link_static_flag=$lt_lt_prog_compiler_static + + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$lt_lt_cv_prog_compiler_c_o + + # Whether or not to add -lc for building shared libraries. + build_libtool_need_lc=$archive_cmds_need_lc +@@ -14773,20 +17465,16 @@ allow_undefined_flag=$lt_allow_undefined + + # Flag that enforces no undefined symbols. + no_undefined_flag=$lt_no_undefined_flag + + # Flag to hardcode \$libdir into a binary during linking. + # This must work even if \$libdir does not exist + hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +-# If ld is used when linking, flag to hardcode \$libdir into a binary +-# during linking. This must work even if \$libdir does not exist. +-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld +- + # Whether we need a single "-rpath" flag with a separated argument. + hardcode_libdir_separator=$lt_hardcode_libdir_separator + + # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes + # DIR into the resulting binary. + hardcode_direct=$hardcode_direct + + # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +@@ -14810,34 +17498,34 @@ hardcode_automatic=$hardcode_automatic + + # Set to yes if linker adds runtime paths of dependent libraries + # to runtime path list. + inherit_rpath=$inherit_rpath + + # Whether libtool must link a program against all its dependency libraries. + link_all_deplibs=$link_all_deplibs + +-# Fix the shell variable \$srcfile for the compiler. +-fix_srcfile_path=$lt_fix_srcfile_path +- + # Set to "yes" if exported symbols are required. + always_export_symbols=$always_export_symbols + + # The commands to list exported symbols. + export_symbols_cmds=$lt_export_symbols_cmds + + # Symbols that should not be listed in the preloaded symbols. + exclude_expsyms=$lt_exclude_expsyms + + # Symbols that must always be exported. + include_expsyms=$lt_include_expsyms + + # Commands necessary for linking programs (against libraries) with templates. + prelink_cmds=$lt_prelink_cmds + ++# Commands necessary for finishing linking programs. ++postlink_cmds=$lt_postlink_cmds ++ + # Specify filename containing input files. + file_list_spec=$lt_file_list_spec + + # How to hardcode a shared library path into an executable. + hardcode_action=$hardcode_action + + # ### END LIBTOOL CONFIG + +@@ -14860,222 +17548,179 @@ fi + + ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? +- sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- case $xsi_shell in +- yes) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_dirname file append nondir_replacement +-# Compute the dirname of FILE. If nonempty, add APPEND to the result, +-# otherwise set result to NONDIR_REPLACEMENT. +-func_dirname () +-{ +- case ${1} in +- */*) func_dirname_result="${1%/*}${2}" ;; +- * ) func_dirname_result="${3}" ;; +- esac +-} +- +-# func_basename file +-func_basename () +-{ +- func_basename_result="${1##*/}" +-} +- +-# func_dirname_and_basename file append nondir_replacement +-# perform func_basename and func_dirname in a single function +-# call: +-# dirname: Compute the dirname of FILE. If nonempty, +-# add APPEND to the result, otherwise set result +-# to NONDIR_REPLACEMENT. +-# value returned in "$func_dirname_result" +-# basename: Compute filename of FILE. +-# value retuned in "$func_basename_result" +-# Implementation must be kept synchronized with func_dirname +-# and func_basename. For efficiency, we do not delegate to +-# those functions but instead duplicate the functionality here. +-func_dirname_and_basename () +-{ +- case ${1} in +- */*) func_dirname_result="${1%/*}${2}" ;; +- * ) func_dirname_result="${3}" ;; +- esac +- func_basename_result="${1##*/}" +-} +- +-# func_stripname prefix suffix name +-# strip PREFIX and SUFFIX off of NAME. +-# PREFIX and SUFFIX must not contain globbing or regex special +-# characters, hashes, percent signs, but SUFFIX may contain a leading +-# dot (in which case that matches only a dot). +-func_stripname () +-{ +- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are +- # positional parameters, so assign one to ordinary parameter first. +- func_stripname_result=${3} +- func_stripname_result=${func_stripname_result#"${1}"} +- func_stripname_result=${func_stripname_result%"${2}"} +-} +- +-# func_opt_split +-func_opt_split () +-{ +- func_opt_split_opt=${1%%=*} +- func_opt_split_arg=${1#*=} +-} +- +-# func_lo2o object +-func_lo2o () +-{ +- case ${1} in +- *.lo) func_lo2o_result=${1%.lo}.${objext} ;; +- *) func_lo2o_result=${1} ;; +- esac +-} +- +-# func_xform libobj-or-source +-func_xform () +-{ +- func_xform_result=${1%.*}.lo +-} +- +-# func_arith arithmetic-term... +-func_arith () +-{ +- func_arith_result=$(( $* )) +-} +- +-# func_len string +-# STRING may not start with a hyphen. +-func_len () +-{ +- func_len_result=${#1} +-} +- +-_LT_EOF +- ;; +- *) # Bourne compatible functions. +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_dirname file append nondir_replacement +-# Compute the dirname of FILE. If nonempty, add APPEND to the result, +-# otherwise set result to NONDIR_REPLACEMENT. +-func_dirname () +-{ +- # Extract subdirectory from the argument. +- func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` +- if test "X$func_dirname_result" = "X${1}"; then +- func_dirname_result="${3}" +- else +- func_dirname_result="$func_dirname_result${2}" +- fi +-} +- +-# func_basename file +-func_basename () +-{ +- func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +-} +- +- +-# func_stripname prefix suffix name +-# strip PREFIX and SUFFIX off of NAME. +-# PREFIX and SUFFIX must not contain globbing or regex special +-# characters, hashes, percent signs, but SUFFIX may contain a leading +-# dot (in which case that matches only a dot). +-# func_strip_suffix prefix name +-func_stripname () +-{ +- case ${2} in +- .*) func_stripname_result=`$ECHO "X${3}" \ +- | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; +- *) func_stripname_result=`$ECHO "X${3}" \ +- | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; +- esac +-} +- +-# sed scripts: +-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +-my_sed_long_arg='1s/^-[^=]*=//' +- +-# func_opt_split +-func_opt_split () +-{ +- func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` +- func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +-} +- +-# func_lo2o object +-func_lo2o () +-{ +- func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +-} +- +-# func_xform libobj-or-source +-func_xform () +-{ +- func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +-} +- +-# func_arith arithmetic-term... +-func_arith () +-{ +- func_arith_result=`expr "$@"` +-} +- +-# func_len string +-# STRING may not start with a hyphen. +-func_len () +-{ +- func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +-} +- +-_LT_EOF +-esac +- +-case $lt_shell_append in +- yes) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_append var value +-# Append VALUE to the end of shell variable VAR. +-func_append () +-{ +- eval "$1+=\$2" +-} +-_LT_EOF +- ;; +- *) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_append var value +-# Append VALUE to the end of shell variable VAR. +-func_append () +-{ +- eval "$1=\$$1\$2" +-} +- +-_LT_EOF +- ;; +- esac +- +- +- sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- mv -f "$cfgfile" "$ofile" || ++ sed '$q' "$ltmain" >> "$cfgfile" \ ++ || (rm -f "$cfgfile"; exit 1) ++ ++ if test x"$xsi_shell" = xyes; then ++ sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ ++func_dirname ()\ ++{\ ++\ case ${1} in\ ++\ */*) func_dirname_result="${1%/*}${2}" ;;\ ++\ * ) func_dirname_result="${3}" ;;\ ++\ esac\ ++} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_basename ()$/,/^} # func_basename /c\ ++func_basename ()\ ++{\ ++\ func_basename_result="${1##*/}"\ ++} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ ++func_dirname_and_basename ()\ ++{\ ++\ case ${1} in\ ++\ */*) func_dirname_result="${1%/*}${2}" ;;\ ++\ * ) func_dirname_result="${3}" ;;\ ++\ esac\ ++\ func_basename_result="${1##*/}"\ ++} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ ++func_stripname ()\ ++{\ ++\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ ++\ # positional parameters, so assign one to ordinary parameter first.\ ++\ func_stripname_result=${3}\ ++\ func_stripname_result=${func_stripname_result#"${1}"}\ ++\ func_stripname_result=${func_stripname_result%"${2}"}\ ++} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ ++func_split_long_opt ()\ ++{\ ++\ func_split_long_opt_name=${1%%=*}\ ++\ func_split_long_opt_arg=${1#*=}\ ++} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ ++func_split_short_opt ()\ ++{\ ++\ func_split_short_opt_arg=${1#??}\ ++\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ ++} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ ++func_lo2o ()\ ++{\ ++\ case ${1} in\ ++\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ ++\ *) func_lo2o_result=${1} ;;\ ++\ esac\ ++} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_xform ()$/,/^} # func_xform /c\ ++func_xform ()\ ++{\ ++ func_xform_result=${1%.*}.lo\ ++} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_arith ()$/,/^} # func_arith /c\ ++func_arith ()\ ++{\ ++ func_arith_result=$(( $* ))\ ++} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_len ()$/,/^} # func_len /c\ ++func_len ()\ ++{\ ++ func_len_result=${#1}\ ++} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++fi ++ ++if test x"$lt_shell_append" = xyes; then ++ sed -e '/^func_append ()$/,/^} # func_append /c\ ++func_append ()\ ++{\ ++ eval "${1}+=\\${2}"\ ++} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ ++func_append_quoted ()\ ++{\ ++\ func_quote_for_eval "${2}"\ ++\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ ++} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++ ++ ++ # Save a `func_append' function call where possible by direct use of '+=' ++ sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++ test 0 -eq $? || _lt_function_replace_fail=: ++else ++ # Save a `func_append' function call even when '+=' is not available ++ sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++ test 0 -eq $? || _lt_function_replace_fail=: ++fi ++ ++if test x"$_lt_function_replace_fail" = x":"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 ++$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} ++fi ++ ++ ++ mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + "include":C) test -d include || mkdir include ;; + "src":C) + test -d src || mkdir src + test -d src/$TARGETDIR || mkdir src/$TARGETDIR +@@ -15085,17 +17730,17 @@ test -d src/$TARGETDIR || mkdir src/$TAR + done # for ac_tag + + + as_fn_exit 0 + _ACEOF + ac_clean_files=$ac_clean_files_save + + test $ac_write_fail = 0 || +- as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + + # configure is writing to config.log, and then calls config.status. + # config.status does its own redirection, appending to config.log. + # Unfortunately, on DOS this fails, as config.log is still kept open + # by configure, so config.status won't be able to write to it; its + # output is simply discarded. So we exec the FD to /dev/null, + # effectively closing config.log, so it can be properly (re)opened and +@@ -15106,15 +17751,15 @@ if test "$no_create" != yes; then + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. +- $ac_cs_success || as_fn_exit $? ++ $ac_cs_success || as_fn_exit 1 + fi + if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + fi + +diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +--- a/js/src/ctypes/libffi/configure.ac ++++ b/js/src/ctypes/libffi/configure.ac +@@ -1,152 +1,261 @@ + dnl Process this with autoconf to create configure + +-AC_PREREQ(2.63) ++AC_PREREQ(2.68) + +-AC_INIT([libffi], [3.0.10rc0], [http://gcc.gnu.org/bugs.html]) ++AC_INIT([libffi], [3.1-rc1], [http://github.com/atgreen/libffi/issues]) + AC_CONFIG_HEADERS([fficonfig.h]) + + AC_CANONICAL_SYSTEM + target_alias=${target_alias-$host_alias} + +-. ${srcdir}/configure.host ++case "${host}" in ++ frv*-elf) ++ LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ ++ ;; ++esac ++ ++AX_ENABLE_BUILDDIR + + AM_INIT_AUTOMAKE + + # The same as in boehm-gc and libstdc++. Have to borrow it from there. + # We must force CC to /not/ be precious variables; otherwise + # the wrong, non-multilib-adjusted value will be used in multilibs. + # As a side effect, we have to subst CFLAGS ourselves. + # Also save and restore CFLAGS, since AC_PROG_CC will come up with + # defaults of its own if none are provided. + + m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS]) + m4_define([_AC_ARG_VAR_PRECIOUS],[]) + save_CFLAGS=$CFLAGS + AC_PROG_CC + CFLAGS=$save_CFLAGS + m4_undefine([_AC_ARG_VAR_PRECIOUS]) +-m4_rename([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) ++m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) + + AC_SUBST(CFLAGS) + + AM_PROG_AS + AM_PROG_CC_C_O + AC_PROG_LIBTOOL + AC_CONFIG_MACRO_DIR([m4]) + ++# Test for 64-bit build. ++AC_CHECK_SIZEOF([size_t]) ++ ++AX_COMPILER_VENDOR ++AX_CC_MAXOPT ++# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro ++# compiler. ++if test "$ax_cv_c_compiler_vendor" != "sun"; then ++ AX_CFLAGS_WARN_ALL ++fi ++ ++if test "x$GCC" = "xyes"; then ++ CFLAGS="$CFLAGS -fexceptions" ++ touch local.exp ++else ++ cat > local.exp < conftest.s +- if $CC $CFLAGS -c conftest.s > /dev/null; then ++ if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then + libffi_cv_as_x86_pcrel=yes + fi + ]) + if test "x$libffi_cv_as_x86_pcrel" = xyes; then + AC_DEFINE(HAVE_AS_X86_PCREL, 1, + [Define if your assembler supports PC relative relocs.]) + fi + + AC_CACHE_CHECK([assembler .ascii pseudo-op support], + libffi_cv_as_ascii_pseudo_op, [ + libffi_cv_as_ascii_pseudo_op=unknown + # Check if we have .ascii +- AC_TRY_COMPILE([asm (".ascii \"string\"");],, ++ AC_TRY_COMPILE(,[asm (".ascii \\"string\\"");], + [libffi_cv_as_ascii_pseudo_op=yes], + [libffi_cv_as_ascii_pseudo_op=no]) + ]) + if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1, + [Define if your assembler supports .ascii.]) + fi + + AC_CACHE_CHECK([assembler .string pseudo-op support], + libffi_cv_as_string_pseudo_op, [ + libffi_cv_as_string_pseudo_op=unknown + # Check if we have .string +- AC_TRY_COMPILE([asm (".string \"string\"");],, ++ AC_TRY_COMPILE(,[asm (".string \\"string\\"");], + [libffi_cv_as_string_pseudo_op=yes], + [libffi_cv_as_string_pseudo_op=no]) + ]) + if test "x$libffi_cv_as_string_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1, + [Define if your assembler supports .string.]) + fi + fi + +-if test x$TARGET = xX86_WIN64; then +- LT_SYS_SYMBOL_USCORE +- if test "x$sys_symbol_underscore" = xyes; then +- AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) +- fi ++# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. ++AC_ARG_ENABLE(pax_emutramp, ++ [ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC], ++ if test "$enable_pax_emutramp" = "yes"; then ++ AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1, ++ [Define this if you want to enable pax emulated trampolines]) ++ fi) ++ ++LT_SYS_SYMBOL_USCORE ++if test "x$sys_symbol_underscore" = xyes; then ++ AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) + fi + ++FFI_EXEC_TRAMPOLINE_TABLE=0 + case "$target" in +- # Darwin 10 (OSX 10.6) and beyond allocate non-executable pages +- *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) ++ *arm*-apple-darwin*) ++ FFI_EXEC_TRAMPOLINE_TABLE=1 ++ AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, ++ [Cannot use PROT_EXEC on this target, so, we revert to ++ alternative means]) ++ ;; ++ *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*) + AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, + [Cannot use malloc on this target, so, we revert to + alternative means]) + ;; + esac ++AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) ++AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE) + + if test x$TARGET = xX86_64; then + AC_CACHE_CHECK([toolchain supports unwind section type], + libffi_cv_as_x86_64_unwind_section_type, [ + cat > conftest1.s << EOF + .text + .globl foo + foo: +@@ -357,54 +489,57 @@ EOF + fi + ]) + if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then + AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1, + [Define if your assembler supports unwind section type.]) + fi + fi + +-AC_CACHE_CHECK([whether .eh_frame section should be read-only], +- libffi_cv_ro_eh_frame, [ +- libffi_cv_ro_eh_frame=no +- echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c +- if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then +- if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then +- libffi_cv_ro_eh_frame=yes +- elif grep '.section.*eh_frame.*#alloc' conftest.c \ +- | grep -v '#write' > /dev/null; then +- libffi_cv_ro_eh_frame=yes +- fi +- fi +- rm -f conftest.* +- ]) +-if test "x$libffi_cv_ro_eh_frame" = xyes; then +- AC_DEFINE(HAVE_RO_EH_FRAME, 1, +- [Define if .eh_frame sections should be read-only.]) +- AC_DEFINE(EH_FRAME_FLAGS, "a", +- [Define to the flags needed for the .section .eh_frame directive.]) +-else +- AC_DEFINE(EH_FRAME_FLAGS, "aw", +- [Define to the flags needed for the .section .eh_frame directive.]) +-fi ++if test "x$GCC" = "xyes"; then ++ AC_CACHE_CHECK([whether .eh_frame section should be read-only], ++ libffi_cv_ro_eh_frame, [ ++ libffi_cv_ro_eh_frame=no ++ echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c ++ if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then ++ objdump -h conftest.o > conftest.dump 2>&1 ++ libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1` ++ libffi_test_line=`expr $libffi_eh_frame_line + 1`p ++ sed -n $libffi_test_line conftest.dump > conftest.line ++ if grep READONLY conftest.line > /dev/null; then ++ libffi_cv_ro_eh_frame=yes ++ fi ++ fi ++ rm -f conftest.* ++ ]) ++ if test "x$libffi_cv_ro_eh_frame" = xyes; then ++ AC_DEFINE(HAVE_RO_EH_FRAME, 1, ++ [Define if .eh_frame sections should be read-only.]) ++ AC_DEFINE(EH_FRAME_FLAGS, "a", ++ [Define to the flags needed for the .section .eh_frame directive. ]) ++ else ++ AC_DEFINE(EH_FRAME_FLAGS, "aw", ++ [Define to the flags needed for the .section .eh_frame directive. ]) ++ fi + +-AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], +- libffi_cv_hidden_visibility_attribute, [ +- echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c +- libffi_cv_hidden_visibility_attribute=no +- if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then +- if grep '\.hidden.*foo' conftest.s >/dev/null; then +- libffi_cv_hidden_visibility_attribute=yes +- fi +- fi +- rm -f conftest.* +- ]) +-if test $libffi_cv_hidden_visibility_attribute = yes; then +- AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1, +- [Define if __attribute__((visibility("hidden"))) is supported.]) ++ AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], ++ libffi_cv_hidden_visibility_attribute, [ ++ echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c ++ libffi_cv_hidden_visibility_attribute=no ++ if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then ++ if grep '\.hidden.*foo' conftest.s >/dev/null; then ++ libffi_cv_hidden_visibility_attribute=yes ++ fi ++ fi ++ rm -f conftest.* ++ ]) ++ if test $libffi_cv_hidden_visibility_attribute = yes; then ++ AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1, ++ [Define if __attribute__((visibility("hidden"))) is supported.]) ++ fi + fi + + AH_BOTTOM([ + #ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE + #ifdef LIBFFI_ASM + #define FFI_HIDDEN(name) .hidden name + #else + #define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +@@ -428,53 +563,54 @@ AC_ARG_ENABLE(debug, + if test "$enable_debug" = "yes"; then + AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.]) + fi) + AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") + + AC_ARG_ENABLE(structs, + [ --disable-structs omit code for struct support], + if test "$enable_structs" = "no"; then +- AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this is you do not want support for aggregate types.]) ++ AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this if you do not want support for aggregate types.]) + fi) ++AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") + + AC_ARG_ENABLE(raw-api, + [ --disable-raw-api make the raw api unavailable], + if test "$enable_raw_api" = "no"; then +- AC_DEFINE(FFI_NO_RAW_API, 1, [Define this is you do not want support for the raw API.]) ++ AC_DEFINE(FFI_NO_RAW_API, 1, [Define this if you do not want support for the raw API.]) + fi) + + AC_ARG_ENABLE(purify-safety, + [ --enable-purify-safety purify-safe mode], + if test "$enable_purify_safety" = "yes"; then + AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.]) + fi) + +-if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' ++# These variables are only ever used when we cross-build to X86_WIN32. ++# And we only support this with GCC, so... ++if test "x$GCC" = "xyes"; then ++ if test -n "$with_cross_host" && ++ test x"$with_cross_host" != x"no"; then ++ toolexecdir='$(exec_prefix)/$(target_alias)' ++ toolexeclibdir='$(toolexecdir)/lib' ++ else ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' ++ fi ++ multi_os_directory=`$CC -print-multi-os-directory` ++ case $multi_os_directory in ++ .) ;; # Avoid trailing /. ++ ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; ++ esac ++ AC_SUBST(toolexecdir) + else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' + toolexeclibdir='$(libdir)' + fi +-multi_os_directory=`$CC -print-multi-os-directory` +-case $multi_os_directory in +- .) ;; # Avoid trailing /. +- *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; +-esac +-AC_SUBST(toolexecdir) + AC_SUBST(toolexeclibdir) + +-if test "${multilib}" = "yes"; then +- multilib_arg="--enable-multilib" +-else +- multilib_arg= +-fi +- + AC_CONFIG_COMMANDS(include, [test -d include || mkdir include]) + AC_CONFIG_COMMANDS(src, [ + test -d src || mkdir src + test -d src/$TARGETDIR || mkdir src/$TARGETDIR + ], [TARGETDIR="$TARGETDIR"]) + + AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h) + +diff --git a/js/src/ctypes/libffi/configure.host b/js/src/ctypes/libffi/configure.host +deleted file mode 100644 +--- a/js/src/ctypes/libffi/configure.host ++++ /dev/null +@@ -1,11 +0,0 @@ +-# configure.host +-# +-# This shell script handles all host based configuration for libffi. +-# +- +-# THIS TABLE IS SORTED. KEEP IT THAT WAY. +-case "${host}" in +- frv*-elf) +- LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ +- ;; +-esac +diff --git a/js/src/ctypes/libffi/depcomp b/js/src/ctypes/libffi/depcomp +--- a/js/src/ctypes/libffi/depcomp ++++ b/js/src/ctypes/libffi/depcomp +@@ -1,95 +1,178 @@ + #! /bin/sh + # depcomp - compile a program generating dependencies as side-effects + +-scriptversion=2006-10-15.18 ++scriptversion=2013-05-30.07; # UTC + +-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software +-# Foundation, Inc. ++# Copyright (C) 1999-2013 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2, or (at your option) + # any later version. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301, USA. ++# along with this program. If not, see . + + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Originally written by Alexandre Oliva . + + case $1 in + '') +- echo "$0: No command. Try \`$0 --help' for more information." 1>&2 +- exit 1; +- ;; ++ echo "$0: No command. Try '$0 --help' for more information." 1>&2 ++ exit 1; ++ ;; + -h | --h*) + cat <<\EOF + Usage: depcomp [--help] [--version] PROGRAM [ARGS] + + Run PROGRAMS ARGS to compile a file, generating dependencies + as side-effects. + + Environment variables: + depmode Dependency tracking mode. +- source Source file read by `PROGRAMS ARGS'. +- object Object file output by `PROGRAMS ARGS'. ++ source Source file read by 'PROGRAMS ARGS'. ++ object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. +- tmpdepfile Temporary file to use when outputing dependencies. ++ tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + + Report bugs to . + EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; + esac + ++# Get the directory component of the given path, and save it in the ++# global variables '$dir'. Note that this directory component will ++# be either empty or ending with a '/' character. This is deliberate. ++set_dir_from () ++{ ++ case $1 in ++ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; ++ *) dir=;; ++ esac ++} ++ ++# Get the suffix-stripped basename of the given path, and save it the ++# global variable '$base'. ++set_base_from () ++{ ++ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` ++} ++ ++# If no dependency file was actually created by the compiler invocation, ++# we still have to create a dummy depfile, to avoid errors with the ++# Makefile "include basename.Plo" scheme. ++make_dummy_depfile () ++{ ++ echo "#dummy" > "$depfile" ++} ++ ++# Factor out some common post-processing of the generated depfile. ++# Requires the auxiliary global variable '$tmpdepfile' to be set. ++aix_post_process_depfile () ++{ ++ # If the compiler actually managed to produce a dependency file, ++ # post-process it. ++ if test -f "$tmpdepfile"; then ++ # Each line is of the form 'foo.o: dependency.h'. ++ # Do two passes, one to just change these to ++ # $object: dependency.h ++ # and one to simply output ++ # dependency.h: ++ # which is needed to avoid the deleted-header problem. ++ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" ++ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" ++ } > "$depfile" ++ rm -f "$tmpdepfile" ++ else ++ make_dummy_depfile ++ fi ++} ++ ++# A tabulation character. ++tab=' ' ++# A newline character. ++nl=' ++' ++# Character ranges might be problematic outside the C locale. ++# These definitions help. ++upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ ++lower=abcdefghijklmnopqrstuvwxyz ++digits=0123456789 ++alpha=${upper}${lower} ++ + if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 + fi + + # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. + depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} + tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + + rm -f "$tmpdepfile" + ++# Avoid interferences from the environment. ++gccflag= dashmflag= ++ + # Some modes work just like other modes, but use different flags. We + # parameterize here, but still list the modes in the big case below, + # to make depend.m4 easier to write. Note that we *cannot* use a case + # here, because this file can only contain one case statement. + if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc + fi + + if test "$depmode" = dashXmstdout; then +- # This is just like dashmstdout with a different argument. +- dashmflag=-xM +- depmode=dashmstdout ++ # This is just like dashmstdout with a different argument. ++ dashmflag=-xM ++ depmode=dashmstdout ++fi ++ ++cygpath_u="cygpath -u -f -" ++if test "$depmode" = msvcmsys; then ++ # This is just like msvisualcpp but w/o cygpath translation. ++ # Just convert the backslash-escaped backslashes to single forward ++ # slashes to satisfy depend.m4 ++ cygpath_u='sed s,\\\\,/,g' ++ depmode=msvisualcpp ++fi ++ ++if test "$depmode" = msvc7msys; then ++ # This is just like msvc7 but w/o cygpath translation. ++ # Just convert the backslash-escaped backslashes to single forward ++ # slashes to satisfy depend.m4 ++ cygpath_u='sed s,\\\\,/,g' ++ depmode=msvc7 ++fi ++ ++if test "$depmode" = xlc; then ++ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. ++ gccflag=-qmakedep=gcc,-MF ++ depmode=gcc + fi + + case "$depmode" in + gcc3) + ## gcc 3 implements dependency tracking that does exactly what + ## we want. Yay! Note: for some reason libtool 1.4 doesn't like + ## it if -MD -MP comes after the -MF stuff. Hmm. + ## Unfortunately, FreeBSD c89 acceptance of flags depends upon +@@ -102,64 +185,67 @@ gcc3) + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + + gcc) ++## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ++## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ++## (see the conditional assignment to $gccflag above). + ## There are various ways to get dependency output from gcc. Here's + ## why we pick this rather obscure method: + ## - Don't want to use -MD because we'd like the dependencies to end + ## up in a subdir. Having to rename by hand is ugly. + ## (We might end up doing this anyway to support other compilers.) + ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +-## -MM, not -M (despite what the docs say). ++## -MM, not -M (despite what the docs say). Also, it might not be ++## supported by the other compilers which use the 'gcc' depmode. + ## - Using -M directly means running the compiler twice (even worse + ## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" +- alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +-## The second -e expression handles DOS-style file names with drive letters. ++ # The second -e expression handles DOS-style file names with drive ++ # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +-## This next piece of magic avoids the `deleted header file' problem. ++## This next piece of magic avoids the "deleted header file" problem. + ## The problem is that when a header file which appears in a .P file + ## is deleted, the dependency causes make to die (because there is + ## typically no way to rebuild the header). We avoid this by adding + ## dummy dependencies for each header file. Too bad gcc doesn't do + ## this for us directly. +- tr ' ' ' +-' < "$tmpdepfile" | +-## Some versions of gcc put a space before the `:'. On the theory ++## Some versions of gcc put a space before the ':'. On the theory + ## that the space means something, we add a space to the output as +-## well. ++## well. hp depmode also adds that space, but also prefixes the VPATH ++## to the object. Take care to not repeat it in the output. + ## Some versions of the HPUX 10.20 sed can't process this invocation + ## correctly. Breaking it into two sed invocations is a workaround. +- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + + hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 +@@ -167,250 +253,339 @@ hp) + + sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" +- + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; +- # the IRIX cc adds comments like `#:fec' to the end of the ++ # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. +- tr ' ' ' +-' < "$tmpdepfile" \ +- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ +- tr ' +-' ' ' >> $depfile +- echo >> $depfile +- ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ ++ | tr "$nl" ' ' >> "$depfile" ++ echo >> "$depfile" + # The second pass generates a dummy entry for each header file. +- tr ' ' ' +-' < "$tmpdepfile" \ +- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ +- >> $depfile ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ ++ >> "$depfile" + else +- # The sourcefile does not contain any dependencies, so just +- # store a dummy comment line, to avoid errors with the Makefile +- # "include basename.Plo" scheme. +- echo "#dummy" > "$depfile" ++ make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + ++xlc) ++ # This case exists only to let depend.m4 do its work. It works by ++ # looking at the text of this script. This case will never be run, ++ # since it is checked for above. ++ exit 1 ++ ;; ++ + aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the +- # current directory. Also, the AIX compiler puts `$object:' at the ++ # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. +- stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` +- tmpdepfile="$stripped.u" ++ set_dir_from "$object" ++ set_base_from "$object" + if test "$libtool" = yes; then ++ tmpdepfile1=$dir$base.u ++ tmpdepfile2=$base.u ++ tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else ++ tmpdepfile1=$dir$base.u ++ tmpdepfile2=$dir$base.u ++ tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? +- +- if test -f "$tmpdepfile"; then : +- else +- stripped=`echo "$stripped" | sed 's,^.*/,,'` +- tmpdepfile="$stripped.u" ++ if test $stat -ne 0; then ++ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" ++ exit $stat + fi + +- if test $stat -eq 0; then : +- else ++ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" ++ do ++ test -f "$tmpdepfile" && break ++ done ++ aix_post_process_depfile ++ ;; ++ ++tcc) ++ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 ++ # FIXME: That version still under development at the moment of writing. ++ # Make that this statement remains true also for stable, released ++ # versions. ++ # It will wrap lines (doesn't matter whether long or short) with a ++ # trailing '\', as in: ++ # ++ # foo.o : \ ++ # foo.c \ ++ # foo.h \ ++ # ++ # It will put a trailing '\' even on the last line, and will use leading ++ # spaces rather than leading tabs (at least since its commit 0394caf7 ++ # "Emit spaces for -MD"). ++ "$@" -MD -MF "$tmpdepfile" ++ stat=$? ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi +- +- if test -f "$tmpdepfile"; then +- outname="$stripped.o" +- # Each line is of the form `foo.o: dependent.h'. +- # Do two passes, one to just change these to +- # `$object: dependent.h' and one to simply `dependent.h:'. +- sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" +- sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" +- else +- # The sourcefile does not contain any dependencies, so just +- # store a dummy comment line, to avoid errors with the Makefile +- # "include basename.Plo" scheme. +- echo "#dummy" > "$depfile" +- fi ++ rm -f "$depfile" ++ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. ++ # We have to change lines of the first kind to '$object: \'. ++ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" ++ # And for each line of the second kind, we have to emit a 'dep.h:' ++ # dummy dependency, to avoid the deleted-header problem. ++ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +-icc) +- # Intel's C compiler understands `-MD -MF file'. However on +- # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c +- # ICC 7.0 will fill foo.d with something like +- # foo.o: sub/foo.c +- # foo.o: sub/foo.h +- # which is wrong. We want: +- # sub/foo.o: sub/foo.c +- # sub/foo.o: sub/foo.h +- # sub/foo.c: +- # sub/foo.h: +- # ICC 7.1 will output ++## The order of this option in the case statement is important, since the ++## shell code in configure will try each of these formats in the order ++## listed in this file. A plain '-MD' option would be understood by many ++## compilers, so we must ensure this comes after the gcc and icc options. ++pgcc) ++ # Portland's C compiler understands '-MD'. ++ # Will always output deps to 'file.d' where file is the root name of the ++ # source file under compilation, even if file resides in a subdirectory. ++ # The object file name does not affect the name of the '.d' file. ++ # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h +- # and will wrap long lines using \ : ++ # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... ++ set_dir_from "$object" ++ # Use the source, not the object, to determine the base name, since ++ # that's sadly what pgcc will do too. ++ set_base_from "$source" ++ tmpdepfile=$base.d + +- "$@" -MD -MF "$tmpdepfile" +- stat=$? +- if test $stat -eq 0; then : +- else ++ # For projects that build the same source file twice into different object ++ # files, the pgcc approach of using the *source* file root name can cause ++ # problems in parallel builds. Use a locking strategy to avoid stomping on ++ # the same $tmpdepfile. ++ lockdir=$base.d-lock ++ trap " ++ echo '$0: caught signal, cleaning up...' >&2 ++ rmdir '$lockdir' ++ exit 1 ++ " 1 2 13 15 ++ numtries=100 ++ i=$numtries ++ while test $i -gt 0; do ++ # mkdir is a portable test-and-set. ++ if mkdir "$lockdir" 2>/dev/null; then ++ # This process acquired the lock. ++ "$@" -MD ++ stat=$? ++ # Release the lock. ++ rmdir "$lockdir" ++ break ++ else ++ # If the lock is being held by a different process, wait ++ # until the winning process is done or we timeout. ++ while test -d "$lockdir" && test $i -gt 0; do ++ sleep 1 ++ i=`expr $i - 1` ++ done ++ fi ++ i=`expr $i - 1` ++ done ++ trap - 1 2 13 15 ++ if test $i -le 0; then ++ echo "$0: failed to acquire lock after $numtries attempts" >&2 ++ echo "$0: check lockdir '$lockdir'" >&2 ++ exit 1 ++ fi ++ ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. +- sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | +- sed -e 's/$/ :/' >> "$depfile" ++ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + + hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. +- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` +- test "x$dir" = "x$object" && dir= +- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` ++ set_dir_from "$object" ++ set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then +- sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" +- # Add `dependent.h:' lines. +- sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" ++ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" ++ # Add 'dependent.h:' lines. ++ sed -ne '2,${ ++ s/^ *// ++ s/ \\*$// ++ s/$/:/ ++ p ++ }' "$tmpdepfile" >> "$depfile" + else +- echo "#dummy" > "$depfile" ++ make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + + tru64) +- # The Tru64 compiler uses -MD to generate dependencies as a side +- # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. +- # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put +- # dependencies in `foo.d' instead, so we check for that too. +- # Subdirectories are respected. +- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` +- test "x$dir" = "x$object" && dir= +- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` ++ # The Tru64 compiler uses -MD to generate dependencies as a side ++ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. ++ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put ++ # dependencies in 'foo.d' instead, so we check for that too. ++ # Subdirectories are respected. ++ set_dir_from "$object" ++ set_base_from "$object" + +- if test "$libtool" = yes; then +- # With Tru64 cc, shared objects can also be used to make a +- # static library. This mechanism is used in libtool 1.4 series to +- # handle both shared and static libraries in a single compilation. +- # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. +- # +- # With libtool 1.5 this exception was removed, and libtool now +- # generates 2 separate objects for the 2 libraries. These two +- # compilations output dependencies in $dir.libs/$base.o.d and +- # in $dir$base.o.d. We have to check for both files, because +- # one of the two compilations can be disabled. We should prefer +- # $dir$base.o.d over $dir.libs/$base.o.d because the latter is +- # automatically cleaned when .libs/ is deleted, while ignoring +- # the former would cause a distcleancheck panic. +- tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 +- tmpdepfile2=$dir$base.o.d # libtool 1.5 +- tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 +- tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 +- "$@" -Wc,-MD +- else +- tmpdepfile1=$dir$base.o.d +- tmpdepfile2=$dir$base.d +- tmpdepfile3=$dir$base.d +- tmpdepfile4=$dir$base.d +- "$@" -MD +- fi ++ if test "$libtool" = yes; then ++ # Libtool generates 2 separate objects for the 2 libraries. These ++ # two compilations output dependencies in $dir.libs/$base.o.d and ++ # in $dir$base.o.d. We have to check for both files, because ++ # one of the two compilations can be disabled. We should prefer ++ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is ++ # automatically cleaned when .libs/ is deleted, while ignoring ++ # the former would cause a distcleancheck panic. ++ tmpdepfile1=$dir$base.o.d # libtool 1.5 ++ tmpdepfile2=$dir.libs/$base.o.d # Likewise. ++ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 ++ "$@" -Wc,-MD ++ else ++ tmpdepfile1=$dir$base.d ++ tmpdepfile2=$dir$base.d ++ tmpdepfile3=$dir$base.d ++ "$@" -MD ++ fi + +- stat=$? +- if test $stat -eq 0; then : +- else +- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" +- exit $stat +- fi ++ stat=$? ++ if test $stat -ne 0; then ++ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" ++ exit $stat ++ fi + +- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" +- do +- test -f "$tmpdepfile" && break +- done +- if test -f "$tmpdepfile"; then +- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" +- # That's a tab and a space in the []. +- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" +- else +- echo "#dummy" > "$depfile" +- fi +- rm -f "$tmpdepfile" +- ;; ++ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" ++ do ++ test -f "$tmpdepfile" && break ++ done ++ # Same post-processing that is required for AIX mode. ++ aix_post_process_depfile ++ ;; ++ ++msvc7) ++ if test "$libtool" = yes; then ++ showIncludes=-Wc,-showIncludes ++ else ++ showIncludes=-showIncludes ++ fi ++ "$@" $showIncludes > "$tmpdepfile" ++ stat=$? ++ grep -v '^Note: including file: ' "$tmpdepfile" ++ if test $stat -ne 0; then ++ rm -f "$tmpdepfile" ++ exit $stat ++ fi ++ rm -f "$depfile" ++ echo "$object : \\" > "$depfile" ++ # The first sed program below extracts the file names and escapes ++ # backslashes for cygpath. The second sed program outputs the file ++ # name when reading, but also accumulates all include files in the ++ # hold buffer in order to output them again at the end. This only ++ # works with sed implementations that can handle large buffers. ++ sed < "$tmpdepfile" -n ' ++/^Note: including file: *\(.*\)/ { ++ s//\1/ ++ s/\\/\\\\/g ++ p ++}' | $cygpath_u | sort -u | sed -n ' ++s/ /\\ /g ++s/\(.*\)/'"$tab"'\1 \\/p ++s/.\(.*\) \\/\1:/ ++H ++$ { ++ s/.*/'"$tab"'/ ++ G ++ p ++}' >> "$depfile" ++ echo >> "$depfile" # make sure the fragment doesn't end with a backslash ++ rm -f "$tmpdepfile" ++ ;; ++ ++msvc7msys) ++ # This case exists only to let depend.m4 do its work. It works by ++ # looking at the text of this script. This case will never be run, ++ # since it is checked for above. ++ exit 1 ++ ;; + + #nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + + dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then +- while test $1 != '--mode=compile'; do ++ while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + +- # Remove `-o $object'. ++ # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) +@@ -420,93 +595,103 @@ dashmstdout) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M +- # Require at least two characters before searching for `:' ++ # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: +- # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. ++ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | +- sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" ++ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" +- tr ' ' ' +-' < "$tmpdepfile" | \ +-## Some versions of the HPUX 10.20 sed can't process this invocation +-## correctly. Breaking it into two sed invocations is a workaround. +- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" ++ # Some versions of the HPUX 10.20 sed can't process this sed invocation ++ # correctly. Breaking it into two sed invocations is a workaround. ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + + dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + + makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then +- while test $1 != '--mode=compile'; do ++ while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift +- cleared=no +- for arg in "$@"; do ++ cleared=no eat=no ++ for arg ++ do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac ++ if test $eat = yes; then ++ eat=no ++ continue ++ fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. ++ -arch) ++ eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done +- obj_suffix="`echo $object | sed 's/^.*\././'`" ++ obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" +- cat < "$tmpdepfile" > "$depfile" +- sed '1,2d' "$tmpdepfile" | tr ' ' ' +-' | \ +-## Some versions of the HPUX 10.20 sed can't process this invocation +-## correctly. Breaking it into two sed invocations is a workaround. +- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" ++ # makedepend may prepend the VPATH from the source file name to the object. ++ # No need to regex-escape $object, excess matching of '.' is harmless. ++ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" ++ # Some versions of the HPUX 10.20 sed can't process the last invocation ++ # correctly. Breaking it into two sed invocations is a workaround. ++ sed '1,2d' "$tmpdepfile" \ ++ | tr ' ' "$nl" \ ++ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + + cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then +- while test $1 != '--mode=compile'; do ++ while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + +- # Remove `-o $object'. ++ # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) +@@ -515,58 +700,79 @@ cpp) + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + +- "$@" -E | +- sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ +- -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | +- sed '$ s: \\$::' > "$tmpdepfile" ++ "$@" -E \ ++ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ ++ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ ++ | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + + msvisualcpp) + # Important note: in order to support this mode, a compiler *must* +- # always write the preprocessed file to stdout, regardless of -o, +- # because we must use -o when running libtool. ++ # always write the preprocessed file to stdout. + "$@" || exit $? ++ ++ # Remove the call to Libtool. ++ if test "$libtool" = yes; then ++ while test "X$1" != 'X--mode=compile'; do ++ shift ++ done ++ shift ++ fi ++ + IFS=" " + for arg + do + case "$arg" in ++ -o) ++ shift ++ ;; ++ $object) ++ shift ++ ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") +- set fnord "$@" +- shift +- shift +- ;; ++ set fnord "$@" ++ shift ++ shift ++ ;; + *) +- set fnord "$@" "$arg" +- shift +- shift +- ;; ++ set fnord "$@" "$arg" ++ shift ++ shift ++ ;; + esac + done +- "$@" -E | +- sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" ++ "$@" -E 2>/dev/null | ++ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" +- . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" +- echo " " >> "$depfile" +- . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" ++ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" ++ echo "$tab" >> "$depfile" ++ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + ++msvcmsys) ++ # This case exists only to let depend.m4 do its work. It works by ++ # looking at the text of this script. This case will never be run, ++ # since it is checked for above. ++ exit 1 ++ ;; ++ + none) + exec "$@" + ;; + + *) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +@@ -575,10 +781,11 @@ esac + exit 0 + + # Local Variables: + # mode: shell-script + # sh-indentation: 2 + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "scriptversion=" + # time-stamp-format: "%:y-%02m-%02d.%02H" +-# time-stamp-end: "$" ++# time-stamp-time-zone: "UTC" ++# time-stamp-end: "; # UTC" + # End: +diff --git a/js/src/ctypes/libffi/doc/stamp-vti b/js/src/ctypes/libffi/doc/stamp-vti +--- a/js/src/ctypes/libffi/doc/stamp-vti ++++ b/js/src/ctypes/libffi/doc/stamp-vti +@@ -1,4 +1,4 @@ +-@set UPDATED 14 February 2008 +-@set UPDATED-MONTH February 2008 +-@set EDITION 3.0.8 +-@set VERSION 3.0.8 ++@set UPDATED 25 March 2014 ++@set UPDATED-MONTH March 2014 ++@set EDITION 3.1-rc1 ++@set VERSION 3.1-rc1 +--- a/js/src/ctypes/libffi/fficonfig.h.in ++++ b/js/src/ctypes/libffi/fficonfig.h.in +@@ -12,23 +12,29 @@ + #undef C_ALLOCA + + /* Define to the flags needed for the .section .eh_frame directive. */ + #undef EH_FRAME_FLAGS + + /* Define this if you want extra debugging. */ + #undef FFI_DEBUG + ++/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ ++#undef FFI_EXEC_TRAMPOLINE_TABLE ++ ++/* Define this if you want to enable pax emulated trampolines */ ++#undef FFI_MMAP_EXEC_EMUTRAMP_PAX ++ + /* Cannot use malloc on this target, so, we revert to alternative means */ + #undef FFI_MMAP_EXEC_WRIT + +-/* Define this is you do not want support for the raw API. */ ++/* Define this if you do not want support for the raw API. */ + #undef FFI_NO_RAW_API + +-/* Define this is you do not want support for aggregate types. */ ++/* Define this if you do not want support for aggregate types. */ + #undef FFI_NO_STRUCTS + + /* Define to 1 if you have `alloca', as a function or macro. */ + #undef HAVE_ALLOCA + + /* Define to 1 if you have and it should be used (not on Ultrix). + */ + #undef HAVE_ALLOCA_H +@@ -62,16 +68,19 @@ + #undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE + + /* Define to 1 if you have the header file. */ + #undef HAVE_INTTYPES_H + + /* Define if you have the long double type and it is bigger than a double */ + #undef HAVE_LONG_DOUBLE + ++/* Define if you support more than one size of the long double type */ ++#undef HAVE_LONG_DOUBLE_VARIANT ++ + /* Define to 1 if you have the `memcpy' function. */ + #undef HAVE_MEMCPY + + /* Define to 1 if you have the header file. */ + #undef HAVE_MEMORY_H + + /* Define to 1 if you have the `mmap' function. */ + #undef HAVE_MMAP +@@ -141,27 +150,33 @@ + #undef PACKAGE_VERSION + + /* The size of `double', as computed by sizeof. */ + #undef SIZEOF_DOUBLE + + /* The size of `long double', as computed by sizeof. */ + #undef SIZEOF_LONG_DOUBLE + ++/* The size of `size_t', as computed by sizeof. */ ++#undef SIZEOF_SIZE_T ++ + /* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + #undef STACK_DIRECTION + + /* Define to 1 if you have the ANSI C header files. */ + #undef STDC_HEADERS + ++/* Define if symbols are underscored. */ ++#undef SYMBOL_UNDERSCORE ++ + /* Define this if you are using Purify and want to suppress spurious messages. + */ + #undef USING_PURIFY + + /* Version number of package */ + #undef VERSION + + /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most +@@ -171,16 +186,19 @@ + # define WORDS_BIGENDIAN 1 + # endif + #else + # ifndef WORDS_BIGENDIAN + # undef WORDS_BIGENDIAN + # endif + #endif + ++/* Define to `unsigned int' if does not define. */ ++#undef size_t ++ + + #ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE + #ifdef LIBFFI_ASM + #define FFI_HIDDEN(name) .hidden name + #else + #define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) + #endif + #else +diff --git a/js/src/ctypes/libffi/generate-darwin-source-and-headers.py b/js/src/ctypes/libffi/generate-darwin-source-and-headers.py +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/generate-darwin-source-and-headers.py +@@ -0,0 +1,209 @@ ++#!/usr/bin/env python ++import subprocess ++import os ++import errno ++import collections ++import glob ++import argparse ++ ++class Platform(object): ++ pass ++ ++class simulator_platform(Platform): ++ directory = 'darwin_ios' ++ sdk = 'iphonesimulator' ++ arch = 'i386' ++ triple = 'i386-apple-darwin11' ++ version_min = '-miphoneos-version-min=5.1.1' ++ ++ prefix = "#ifdef __i386__\n\n" ++ suffix = "\n\n#endif" ++ src_dir = 'x86' ++ src_files = ['darwin.S', 'win32.S', 'ffi.c'] ++ ++ ++class simulator64_platform(Platform): ++ directory = 'darwin_ios' ++ sdk = 'iphonesimulator' ++ arch = 'x86_64' ++ triple = 'x86_64-apple-darwin13' ++ version_min = '-miphoneos-version-min=7.0' ++ ++ prefix = "#ifdef __x86_64__\n\n" ++ suffix = "\n\n#endif" ++ src_dir = 'x86' ++ src_files = ['darwin64.S', 'ffi64.c'] ++ ++ ++class device_platform(Platform): ++ directory = 'darwin_ios' ++ sdk = 'iphoneos' ++ arch = 'armv7' ++ triple = 'arm-apple-darwin11' ++ version_min = '-miphoneos-version-min=5.1.1' ++ ++ prefix = "#ifdef __arm__\n\n" ++ suffix = "\n\n#endif" ++ src_dir = 'arm' ++ src_files = ['sysv.S', 'trampoline.S', 'ffi.c'] ++ ++ ++class device64_platform(Platform): ++ directory = 'darwin_ios' ++ sdk = 'iphoneos' ++ arch = 'arm64' ++ triple = 'aarch64-apple-darwin13' ++ version_min = '-miphoneos-version-min=7.0' ++ ++ prefix = "#ifdef __arm64__\n\n" ++ suffix = "\n\n#endif" ++ src_dir = 'aarch64' ++ src_files = ['sysv.S', 'ffi.c'] ++ ++ ++class desktop32_platform(Platform): ++ directory = 'darwin_osx' ++ sdk = 'macosx' ++ arch = 'i386' ++ triple = 'i386-apple-darwin10' ++ version_min = '-mmacosx-version-min=10.6' ++ src_dir = 'x86' ++ src_files = ['darwin.S', 'win32.S', 'ffi.c'] ++ ++ prefix = "#ifdef __i386__\n\n" ++ suffix = "\n\n#endif" ++ ++ ++class desktop64_platform(Platform): ++ directory = 'darwin_osx' ++ sdk = 'macosx' ++ arch = 'x86_64' ++ triple = 'x86_64-apple-darwin10' ++ version_min = '-mmacosx-version-min=10.6' ++ ++ prefix = "#ifdef __x86_64__\n\n" ++ suffix = "\n\n#endif" ++ src_dir = 'x86' ++ src_files = ['darwin64.S', 'ffi64.c'] ++ ++ ++def mkdir_p(path): ++ try: ++ os.makedirs(path) ++ except OSError as exc: # Python >2.5 ++ if exc.errno == errno.EEXIST: ++ pass ++ else: ++ raise ++ ++ ++def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''): ++ mkdir_p(dst_dir) ++ out_filename = filename ++ ++ if file_suffix: ++ split_name = os.path.splitext(filename) ++ out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1]) ++ ++ with open(os.path.join(src_dir, filename)) as in_file: ++ with open(os.path.join(dst_dir, out_filename), 'w') as out_file: ++ if prefix: ++ out_file.write(prefix) ++ ++ out_file.write(in_file.read()) ++ ++ if suffix: ++ out_file.write(suffix) ++ ++ ++def list_files(src_dir, pattern=None, filelist=None): ++ if pattern: filelist = glob.iglob(os.path.join(src_dir, pattern)) ++ for file in filelist: ++ yield os.path.basename(file) ++ ++ ++def copy_files(src_dir, dst_dir, pattern=None, filelist=None, file_suffix=None, prefix=None, suffix=None): ++ for filename in list_files(src_dir, pattern=pattern, filelist=filelist): ++ move_file(src_dir, dst_dir, filename, file_suffix=file_suffix, prefix=prefix, suffix=suffix) ++ ++ ++def copy_src_platform_files(platform): ++ src_dir = os.path.join('src', platform.src_dir) ++ dst_dir = os.path.join(platform.directory, 'src', platform.src_dir) ++ copy_files(src_dir, dst_dir, filelist=platform.src_files, file_suffix=platform.arch, prefix=platform.prefix, suffix=platform.suffix) ++ ++ ++def build_target(platform, platform_headers): ++ def xcrun_cmd(cmd): ++ return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch) ++ ++ tag='%s-%s' % (platform.sdk, platform.arch) ++ build_dir = 'build_%s' % tag ++ mkdir_p(build_dir) ++ env = dict(CC=xcrun_cmd('clang'), ++ LD=xcrun_cmd('ld'), ++ CFLAGS='%s' % (platform.version_min)) ++ working_dir = os.getcwd() ++ try: ++ os.chdir(build_dir) ++ subprocess.check_call(['../configure', '-host', platform.triple], env=env) ++ finally: ++ os.chdir(working_dir) ++ ++ for src_dir in [build_dir, os.path.join(build_dir, 'include')]: ++ copy_files(src_dir, ++ os.path.join(platform.directory, 'include'), ++ pattern='*.h', ++ file_suffix=platform.arch, ++ prefix=platform.prefix, ++ suffix=platform.suffix) ++ ++ for filename in list_files(src_dir, pattern='*.h'): ++ platform_headers[filename].add((platform.prefix, platform.arch, platform.suffix)) ++ ++ ++def make_tramp(): ++ with open('src/arm/trampoline.S', 'w') as tramp_out: ++ p = subprocess.Popen(['bash', 'src/arm/gentramp.sh'], stdout=tramp_out) ++ p.wait() ++ ++ ++def generate_source_and_headers(generate_osx=True, generate_ios=True): ++ copy_files('src', 'darwin_common/src', pattern='*.c') ++ copy_files('include', 'darwin_common/include', pattern='*.h') ++ ++ if generate_ios: ++ make_tramp() ++ copy_src_platform_files(simulator_platform) ++ copy_src_platform_files(simulator64_platform) ++ copy_src_platform_files(device_platform) ++ copy_src_platform_files(device64_platform) ++ if generate_osx: ++ copy_src_platform_files(desktop32_platform) ++ copy_src_platform_files(desktop64_platform) ++ ++ platform_headers = collections.defaultdict(set) ++ ++ if generate_ios: ++ build_target(simulator_platform, platform_headers) ++ build_target(simulator64_platform, platform_headers) ++ build_target(device_platform, platform_headers) ++ build_target(device64_platform, platform_headers) ++ if generate_osx: ++ build_target(desktop32_platform, platform_headers) ++ build_target(desktop64_platform, platform_headers) ++ ++ mkdir_p('darwin_common/include') ++ for header_name, tag_tuples in platform_headers.iteritems(): ++ basename, suffix = os.path.splitext(header_name) ++ with open(os.path.join('darwin_common/include', header_name), 'w') as header: ++ for tag_tuple in tag_tuples: ++ header.write('%s#include <%s_%s%s>\n%s\n' % (tag_tuple[0], basename, tag_tuple[1], suffix, tag_tuple[2])) ++ ++if __name__ == '__main__': ++ parser = argparse.ArgumentParser() ++ parser.add_argument('--only-ios', action='store_true', default=False) ++ parser.add_argument('--only-osx', action='store_true', default=False) ++ args = parser.parse_args() ++ ++ generate_source_and_headers(generate_osx=not args.only_ios, generate_ios=not args.only_osx) +diff --git a/js/src/ctypes/libffi/include/Makefile.in b/js/src/ctypes/libffi/include/Makefile.in +--- a/js/src/ctypes/libffi/include/Makefile.in ++++ b/js/src/ctypes/libffi/include/Makefile.in +@@ -1,26 +1,70 @@ +-# Makefile.in generated by automake 1.11.1 from Makefile.am. ++# Makefile.in generated by automake 1.13.4 from Makefile.am. + # @configure_input@ + +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +-# Inc. ++# Copyright (C) 1994-2013 Free Software Foundation, Inc. ++ + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY, to the extent permitted by law; without + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + + @SET_MAKE@ + + VPATH = @srcdir@ ++am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' ++am__make_running_with_option = \ ++ case $${target_option-} in \ ++ ?) ;; \ ++ *) echo "am__make_running_with_option: internal error: invalid" \ ++ "target option '$${target_option-}' specified" >&2; \ ++ exit 1;; \ ++ esac; \ ++ has_opt=no; \ ++ sane_makeflags=$$MAKEFLAGS; \ ++ if $(am__is_gnu_make); then \ ++ sane_makeflags=$$MFLAGS; \ ++ else \ ++ case $$MAKEFLAGS in \ ++ *\\[\ \ ]*) \ ++ bs=\\; \ ++ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ ++ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ ++ esac; \ ++ fi; \ ++ skip_next=no; \ ++ strip_trailopt () \ ++ { \ ++ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ ++ }; \ ++ for flg in $$sane_makeflags; do \ ++ test $$skip_next = yes && { skip_next=no; continue; }; \ ++ case $$flg in \ ++ *=*|--*) continue;; \ ++ -*I) strip_trailopt 'I'; skip_next=yes;; \ ++ -*I?*) strip_trailopt 'I';; \ ++ -*O) strip_trailopt 'O'; skip_next=yes;; \ ++ -*O?*) strip_trailopt 'O';; \ ++ -*l) strip_trailopt 'l'; skip_next=yes;; \ ++ -*l?*) strip_trailopt 'l';; \ ++ -[dEDm]) skip_next=yes;; \ ++ -[JT]) skip_next=yes;; \ ++ esac; \ ++ case $$flg in \ ++ *$$target_option*) has_opt=yes; break;; \ ++ esac; \ ++ done; \ ++ test $$has_opt = yes ++am__make_dryrun = (target_option=n; $(am__make_running_with_option)) ++am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) + pkgdatadir = $(datadir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkglibexecdir = $(libexecdir)/@PACKAGE@ + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +@@ -31,29 +75,58 @@ PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ + target_triplet = @target@ + subdir = include +-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ ++DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/ffi.h.in + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ ++am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ ++ $(top_srcdir)/m4/ax_append_flag.m4 \ ++ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ ++ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ ++ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ ++ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ ++ $(top_srcdir)/m4/ax_configure_args.m4 \ ++ $(top_srcdir)/m4/ax_enable_builddir.m4 \ ++ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ ++ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ ++ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ ++ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ ++ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) + mkinstalldirs = $(install_sh) -d + CONFIG_HEADER = $(top_builddir)/fficonfig.h + CONFIG_CLEAN_FILES = ffi.h ffitarget.h + CONFIG_CLEAN_VPATH_FILES = ++AM_V_P = $(am__v_P_@AM_V@) ++am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) ++am__v_P_0 = false ++am__v_P_1 = : ++AM_V_GEN = $(am__v_GEN_@AM_V@) ++am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) ++am__v_GEN_0 = @echo " GEN " $@; ++am__v_GEN_1 = ++AM_V_at = $(am__v_at_@AM_V@) ++am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) ++am__v_at_0 = @ ++am__v_at_1 = + SOURCES = + DIST_SOURCES = ++am__can_run_installinfo = \ ++ case $$AM_UPDATE_INFO_DIR in \ ++ n|no|NO) false;; \ ++ *) (install-info --version) >/dev/null 2>&1;; \ ++ esac + am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; + am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; + am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; + am__install_max = 40 + am__nobase_strip_setup = \ +@@ -65,24 +138,48 @@ am__nobase_list = $(am__nobase_strip_set + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' + am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' ++am__uninstall_files_from_dir = { \ ++ test -z "$$files" \ ++ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ ++ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ ++ $(am__cd) "$$dir" && rm -f $$files; }; \ ++ } + am__installdirs = "$(DESTDIR)$(includesdir)" + HEADERS = $(nodist_includes_HEADERS) ++am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) ++# Read a list of newline-separated strings from the standard input, ++# and print each of them once, without duplicates. Input order is ++# *not* preserved. ++am__uniquify_input = $(AWK) '\ ++ BEGIN { nonempty = 0; } \ ++ { items[$$0] = 1; nonempty = 1; } \ ++ END { if (nonempty) { for (i in items) print i; }; } \ ++' ++# Make sure the list of sources is unique. This is necessary because, ++# e.g., the same source file might be shared among _SOURCES variables ++# for different programs/libraries. ++am__define_uniq_tagged_files = \ ++ list='$(am__tagged_files)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | $(am__uniquify_input)` + ETAGS = etags + CTAGS = ctags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + ACLOCAL = @ACLOCAL@ + ALLOCA = @ALLOCA@ + AMTAR = @AMTAR@ ++AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ + AM_LTLDFLAGS = @AM_LTLDFLAGS@ + AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ + AR = @AR@ + AUTOCONF = @AUTOCONF@ + AUTOHEADER = @AUTOHEADER@ + AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ + CC = @CC@ +@@ -91,75 +188,82 @@ CCASDEPMODE = @CCASDEPMODE@ + CCASFLAGS = @CCASFLAGS@ + CCDEPMODE = @CCDEPMODE@ + CFLAGS = @CFLAGS@ + CPP = @CPP@ + CPPFLAGS = @CPPFLAGS@ + CYGPATH_W = @CYGPATH_W@ + DEFS = @DEFS@ + DEPDIR = @DEPDIR@ ++DLLTOOL = @DLLTOOL@ + DSYMUTIL = @DSYMUTIL@ + DUMPBIN = @DUMPBIN@ + ECHO_C = @ECHO_C@ + ECHO_N = @ECHO_N@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + EXEEXT = @EXEEXT@ ++FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ + FGREP = @FGREP@ + GREP = @GREP@ + HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ ++HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ + INSTALL = @INSTALL@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LD = @LD@ + LDFLAGS = @LDFLAGS@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LIPO = @LIPO@ + LN_S = @LN_S@ + LTLIBOBJS = @LTLIBOBJS@ + MAINT = @MAINT@ + MAKEINFO = @MAKEINFO@ ++MANIFEST_TOOL = @MANIFEST_TOOL@ + MKDIR_P = @MKDIR_P@ + NM = @NM@ + NMEDIT = @NMEDIT@ + OBJDUMP = @OBJDUMP@ + OBJEXT = @OBJEXT@ + OTOOL = @OTOOL@ + OTOOL64 = @OTOOL64@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ + PACKAGE_STRING = @PACKAGE_STRING@ + PACKAGE_TARNAME = @PACKAGE_TARNAME@ + PACKAGE_URL = @PACKAGE_URL@ + PACKAGE_VERSION = @PACKAGE_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ ++PRTDIAG = @PRTDIAG@ + RANLIB = @RANLIB@ + SED = @SED@ + SET_MAKE = @SET_MAKE@ + SHELL = @SHELL@ + STRIP = @STRIP@ + TARGET = @TARGET@ + TARGETDIR = @TARGETDIR@ + VERSION = @VERSION@ + abs_builddir = @abs_builddir@ + abs_srcdir = @abs_srcdir@ + abs_top_builddir = @abs_top_builddir@ + abs_top_srcdir = @abs_top_srcdir@ ++ac_ct_AR = @ac_ct_AR@ + ac_ct_CC = @ac_ct_CC@ + ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ + am__include = @am__include@ + am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ + am__tar = @am__tar@ + am__untar = @am__untar@ ++ax_enable_builddir_sed = @ax_enable_builddir_sed@ + bindir = @bindir@ + build = @build@ + build_alias = @build_alias@ + build_cpu = @build_cpu@ + build_os = @build_os@ + build_vendor = @build_vendor@ + builddir = @builddir@ + datadir = @datadir@ +@@ -175,27 +279,27 @@ host_vendor = @host_vendor@ + htmldir = @htmldir@ + includedir = @includedir@ + infodir = @infodir@ + install_sh = @install_sh@ + libdir = @libdir@ + libexecdir = @libexecdir@ + localedir = @localedir@ + localstatedir = @localstatedir@ +-lt_ECHO = @lt_ECHO@ + mandir = @mandir@ + mkdir_p = @mkdir_p@ + oldincludedir = @oldincludedir@ + pdfdir = @pdfdir@ + prefix = @prefix@ + program_transform_name = @program_transform_name@ + psdir = @psdir@ + sbindir = @sbindir@ + sharedstatedir = @sharedstatedir@ + srcdir = @srcdir@ ++sys_symbol_underscore = @sys_symbol_underscore@ + sysconfdir = @sysconfdir@ + target = @target@ + target_alias = @target_alias@ + target_cpu = @target_cpu@ + target_os = @target_os@ + target_vendor = @target_vendor@ + toolexecdir = @toolexecdir@ + toolexeclibdir = @toolexeclibdir@ +@@ -245,83 +349,84 @@ ffi.h: $(top_builddir)/config.status $(s + + mostlyclean-libtool: + -rm -f *.lo + + clean-libtool: + -rm -rf .libs _libs + install-nodist_includesHEADERS: $(nodist_includes_HEADERS) + @$(NORMAL_INSTALL) +- test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)" + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ ++ if test -n "$$list"; then \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(includesdir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(includesdir)" || exit 1; \ ++ fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \ + done + + uninstall-nodist_includesHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ +- test -n "$$files" || exit 0; \ +- echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \ +- cd "$(DESTDIR)$(includesdir)" && rm -f $$files ++ dir='$(DESTDIR)$(includesdir)'; $(am__uninstall_files_from_dir) + +-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +- END { if (nonempty) { for (i in files) print i; }; }'`; \ +- mkid -fID $$unique +-tags: TAGS ++ID: $(am__tagged_files) ++ $(am__define_uniq_tagged_files); mkid -fID $$unique ++tags: tags-am ++TAGS: tags + +-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) ++tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +- END { if (nonempty) { for (i in files) print i; }; }'`; \ ++ $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +-ctags: CTAGS +-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +- END { if (nonempty) { for (i in files) print i; }; }'`; \ ++ctags: ctags-am ++ ++CTAGS: ctags ++ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) ++ $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" ++cscopelist: cscopelist-am ++ ++cscopelist-am: $(am__tagged_files) ++ list='$(am__tagged_files)'; \ ++ case "$(srcdir)" in \ ++ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ ++ *) sdir=$(subdir)/$(srcdir) ;; \ ++ esac; \ ++ for i in $$list; do \ ++ if test -f "$$i"; then \ ++ echo "$(subdir)/$$i"; \ ++ else \ ++ echo "$$sdir/$$i"; \ ++ fi; \ ++ done >> $(top_builddir)/cscope.files + + distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + + distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ +@@ -363,20 +468,25 @@ install-exec: install-exec-am + install-data: install-data-am + uninstall: uninstall-am + + install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + + installcheck: installcheck-am + install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++ if test -z '$(STRIP)'; then \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ install; \ ++ else \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ ++ fi + mostlyclean-generic: + + clean-generic: + + distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) +@@ -447,25 +557,26 @@ pdf-am: + ps: ps-am + + ps-am: + + uninstall-am: uninstall-nodist_includesHEADERS + + .MAKE: install-am install-strip + +-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +- clean-libtool ctags distclean distclean-generic \ +- distclean-libtool distclean-tags distdir dvi dvi-am html \ +- html-am info info-am install install-am install-data \ +- install-data-am install-dvi install-dvi-am install-exec \ +- install-exec-am install-html install-html-am install-info \ +- install-info-am install-man install-nodist_includesHEADERS \ +- install-pdf install-pdf-am install-ps install-ps-am \ +- install-strip installcheck installcheck-am installdirs \ +- maintainer-clean maintainer-clean-generic mostlyclean \ +- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- tags uninstall uninstall-am uninstall-nodist_includesHEADERS ++.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ ++ clean-libtool cscopelist-am ctags ctags-am distclean \ ++ distclean-generic distclean-libtool distclean-tags distdir dvi \ ++ dvi-am html html-am info info-am install install-am \ ++ install-data install-data-am install-dvi install-dvi-am \ ++ install-exec install-exec-am install-html install-html-am \ ++ install-info install-info-am install-man \ ++ install-nodist_includesHEADERS install-pdf install-pdf-am \ ++ install-ps install-ps-am install-strip installcheck \ ++ installcheck-am installdirs maintainer-clean \ ++ maintainer-clean-generic mostlyclean mostlyclean-generic \ ++ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ ++ uninstall-am uninstall-nodist_includesHEADERS + + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: +diff --git a/js/src/ctypes/libffi/include/ffi.h.in b/js/src/ctypes/libffi/include/ffi.h.in +--- a/js/src/ctypes/libffi/include/ffi.h.in ++++ b/js/src/ctypes/libffi/include/ffi.h.in +@@ -1,21 +1,22 @@ + /* -----------------------------------------------------------------*-C-*- +- libffi @VERSION@ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. ++ libffi @VERSION@ - Copyright (c) 2011 Anthony Green ++ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + +- Permission is hereby granted, free of charge, to any person obtaining +- a copy of this software and associated documentation files (the +- ``Software''), to deal in the Software without restriction, including +- without limitation the rights to use, copy, modify, merge, publish, +- distribute, sublicense, and/or sell copies of the Software, and to +- permit persons to whom the Software is furnished to do so, subject to +- the following conditions: ++ Permission is hereby granted, free of charge, to any person ++ obtaining a copy of this software and associated documentation ++ files (the ``Software''), to deal in the Software without ++ restriction, including without limitation the rights to use, copy, ++ modify, merge, publish, distribute, sublicense, and/or sell copies ++ of the Software, and to permit persons to whom the Software is ++ furnished to do so, subject to the following conditions: + +- The above copyright notice and this permission notice shall be included +- in all copies or substantial portions of the Software. ++ The above copyright notice and this permission notice shall be ++ included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +@@ -80,21 +81,25 @@ extern "C" { + + #define FFI_64_BIT_MAX 9223372036854775807 + + #ifdef LONG_LONG_MAX + # define FFI_LONG_LONG_MAX LONG_LONG_MAX + #else + # ifdef LLONG_MAX + # define FFI_LONG_LONG_MAX LLONG_MAX ++# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ ++# undef FFI_64_BIT_MAX ++# define FFI_64_BIT_MAX 9223372036854775807LL ++# endif /* _AIX52 or newer */ + # else + # ifdef __GNUC__ + # define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ + # endif +-# ifdef _AIX ++# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ + # ifndef __PPC64__ + # if defined (__IBMC__) || defined (__IBMCPP__) + # define FFI_LONG_LONG_MAX LONGLONG_MAX + # endif + # endif /* __PPC64__ */ + # undef FFI_64_BIT_MAX + # define FFI_64_BIT_MAX 9223372036854775807LL + # endif +@@ -156,32 +161,46 @@ typedef struct _ffi_type + # define ffi_type_slong ffi_type_sint32 + #elif LONG_MAX == FFI_64_BIT_MAX + # define ffi_type_ulong ffi_type_uint64 + # define ffi_type_slong ffi_type_sint64 + #else + #error "long size not supported" + #endif + ++/* Need minimal decorations for DLLs to works on Windows. */ ++/* GCC has autoimport and autoexport. Rely on Libtool to */ ++/* help MSVC export from a DLL, but always declare data */ ++/* to be imported for MSVC clients. This costs an extra */ ++/* indirection for MSVC clients using the static version */ ++/* of the library, but don't worry about that. Besides, */ ++/* as a workaround, they can define FFI_BUILDING if they */ ++/* *know* they are going to link with the static library. */ ++#if defined _MSC_VER && !defined FFI_BUILDING ++#define FFI_EXTERN extern __declspec(dllimport) ++#else ++#define FFI_EXTERN extern ++#endif ++ + /* These are defined in types.c */ +-extern ffi_type ffi_type_void; +-extern ffi_type ffi_type_uint8; +-extern ffi_type ffi_type_sint8; +-extern ffi_type ffi_type_uint16; +-extern ffi_type ffi_type_sint16; +-extern ffi_type ffi_type_uint32; +-extern ffi_type ffi_type_sint32; +-extern ffi_type ffi_type_uint64; +-extern ffi_type ffi_type_sint64; +-extern ffi_type ffi_type_float; +-extern ffi_type ffi_type_double; +-extern ffi_type ffi_type_pointer; ++FFI_EXTERN ffi_type ffi_type_void; ++FFI_EXTERN ffi_type ffi_type_uint8; ++FFI_EXTERN ffi_type ffi_type_sint8; ++FFI_EXTERN ffi_type ffi_type_uint16; ++FFI_EXTERN ffi_type ffi_type_sint16; ++FFI_EXTERN ffi_type ffi_type_uint32; ++FFI_EXTERN ffi_type ffi_type_sint32; ++FFI_EXTERN ffi_type ffi_type_uint64; ++FFI_EXTERN ffi_type ffi_type_sint64; ++FFI_EXTERN ffi_type ffi_type_float; ++FFI_EXTERN ffi_type ffi_type_double; ++FFI_EXTERN ffi_type ffi_type_pointer; + + #if @HAVE_LONG_DOUBLE@ +-extern ffi_type ffi_type_longdouble; ++FFI_EXTERN ffi_type ffi_type_longdouble; + #else + #define ffi_type_longdouble ffi_type_double + #endif + #endif /* LIBFFI_HIDE_BASIC_TYPES */ + + typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, +@@ -197,16 +216,30 @@ typedef struct { + ffi_type *rtype; + unsigned bytes; + unsigned flags; + #ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; + #endif + } ffi_cif; + ++#if HAVE_LONG_DOUBLE_VARIANT ++/* Used to adjust size/alignment of ffi types. */ ++void ffi_prep_types (ffi_abi abi); ++# endif ++ ++/* Used internally, but overridden by some architectures */ ++ffi_status ffi_prep_cif_core(ffi_cif *cif, ++ ffi_abi abi, ++ unsigned int isvariadic, ++ unsigned int nfixedargs, ++ unsigned int ntotalargs, ++ ffi_type *rtype, ++ ffi_type **atypes); ++ + /* ---- Definitions for the raw API -------------------------------------- */ + + #ifndef FFI_SIZEOF_ARG + # if LONG_MAX == 2147483647 + # define FFI_SIZEOF_ARG 4 + # elif LONG_MAX == FFI_64_BIT_MAX + # define FFI_SIZEOF_ARG 8 + # endif +@@ -264,24 +297,32 @@ size_t ffi_java_raw_size (ffi_cif *cif); + /* ---- Definitions for closures ----------------------------------------- */ + + #if FFI_CLOSURES + + #ifdef _MSC_VER + __declspec(align(8)) + #endif + typedef struct { ++#if @FFI_EXEC_TRAMPOLINE_TABLE@ ++ void *trampoline_table; ++ void *trampoline_table_entry; ++#else + char tramp[FFI_TRAMPOLINE_SIZE]; ++#endif + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; + #ifdef __GNUC__ + } ffi_closure __attribute__((aligned (8))); + #else + } ffi_closure; ++# ifdef __sgi ++# pragma pack 0 ++# endif + #endif + + void *ffi_closure_alloc (size_t size, void **code); + void ffi_closure_free (void *); + + ffi_status + ffi_prep_closure (ffi_closure*, + ffi_cif *, +@@ -290,19 +331,26 @@ ffi_prep_closure (ffi_closure*, + + ffi_status + ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + ++#ifdef __sgi ++# pragma pack 8 ++#endif + typedef struct { ++#if @FFI_EXEC_TRAMPOLINE_TABLE@ ++ void *trampoline_table; ++ void *trampoline_table_entry; ++#else + char tramp[FFI_TRAMPOLINE_SIZE]; +- ++#endif + ffi_cif *cif; + + #if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + +@@ -312,17 +360,22 @@ typedef struct { + #endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + + } ffi_raw_closure; + + typedef struct { ++#if @FFI_EXEC_TRAMPOLINE_TABLE@ ++ void *trampoline_table; ++ void *trampoline_table_entry; ++#else + char tramp[FFI_TRAMPOLINE_SIZE]; ++#endif + + ffi_cif *cif; + + #if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ +@@ -368,16 +421,23 @@ ffi_prep_java_raw_closure_loc (ffi_java_ + /* ---- Public interface definition -------------------------------------- */ + + ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + ++ffi_status ffi_prep_cif_var(ffi_cif *cif, ++ ffi_abi abi, ++ unsigned int nfixedargs, ++ unsigned int ntotalargs, ++ ffi_type *rtype, ++ ffi_type **atypes); ++ + void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + + /* Useful for eliminating compiler warnings */ + #define FFI_FN(f) ((void (*)(void))f) + +diff --git a/js/src/ctypes/libffi/include/ffi_common.h b/js/src/ctypes/libffi/include/ffi_common.h +--- a/js/src/ctypes/libffi/include/ffi_common.h ++++ b/js/src/ctypes/libffi/include/ffi_common.h +@@ -1,50 +1,55 @@ + /* ----------------------------------------------------------------------- +- ffi_common.h - Copyright (c) 1996 Red Hat, Inc. +- Copyright (C) 2007 Free Software Foundation, Inc +- ++ ffi_common.h - Copyright (C) 2011, 2012, 2013 Anthony Green ++ Copyright (C) 2007 Free Software Foundation, Inc ++ Copyright (c) 1996 Red Hat, Inc. ++ + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + + #ifndef FFI_COMMON_H + #define FFI_COMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + + #include + + /* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ + #ifdef __GNUC__ +-/* mingw64 defines this already in malloc.h. */ +-#ifndef alloca +-# define alloca __builtin_alloca +-#endif ++# if HAVE_ALLOCA_H ++# include ++# else ++ /* mingw64 defines this already in malloc.h. */ ++# ifndef alloca ++# define alloca __builtin_alloca ++# endif ++# endif + # define MAYBE_UNUSED __attribute__((__unused__)) + #else + # define MAYBE_UNUSED + # if HAVE_ALLOCA_H + # include + # else + # ifdef _AIX +- #pragma alloca ++# pragma alloca + # else + # ifndef alloca /* predefined by HP cc +Olibcalls */ + # ifdef _MSC_VER + # define alloca _alloca + # else + char *alloca (); +-# endif + # endif + # endif + # endif ++# endif + #endif + + /* Check for the existence of memcpy. */ + #if STDC_HEADERS + # include + #else + # ifndef HAVE_MEMCPY + # define memcpy(d, s, n) bcopy ((s), (d), (n)) +@@ -69,27 +74,29 @@ void ffi_type_test(ffi_type *a, char *fi + #define FFI_ASSERT_VALID_TYPE(x) + #endif + + #define ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) + #define ALIGN_DOWN(v, a) (((size_t) (v)) & -a) + + /* Perform machine dependent cif processing */ + ffi_status ffi_prep_cif_machdep(ffi_cif *cif); ++ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, ++ unsigned int nfixedargs, unsigned int ntotalargs); + + /* Extended cif, used in callback from assembly routine */ + typedef struct + { + ffi_cif *cif; + void *rvalue; + void **avalue; + } extended_cif; + + /* Terse sized type definitions. */ +-#if defined(_MSC_VER) || defined(__sgi) ++#if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) + typedef unsigned char UINT8; + typedef signed char SINT8; + typedef unsigned short UINT16; + typedef signed short SINT16; + typedef unsigned int UINT32; + typedef signed int SINT32; + # ifdef _MSC_VER + typedef unsigned __int64 UINT64; +@@ -107,16 +114,19 @@ typedef signed int SINT16 __attribute_ + typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); + typedef signed int SINT32 __attribute__((__mode__(__SI__))); + typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); + typedef signed int SINT64 __attribute__((__mode__(__DI__))); + #endif + + typedef float FLOAT32; + ++#ifndef __GNUC__ ++#define __builtin_expect(x, expected_value) (x) ++#endif ++#define LIKELY(x) __builtin_expect(!!(x),1) ++#define UNLIKELY(x) __builtin_expect((x)!=0,0) + + #ifdef __cplusplus + } + #endif + + #endif +- +- +diff --git a/js/src/ctypes/libffi/install-sh b/js/src/ctypes/libffi/install-sh +--- a/js/src/ctypes/libffi/install-sh ++++ b/js/src/ctypes/libffi/install-sh +@@ -1,12 +1,12 @@ + #!/bin/sh + # install - install a program, script, or datafile + +-scriptversion=2004-12-17.09 ++scriptversion=2011-11-20.07; # UTC + + # This originates from X11R5 (mit/util/scripts/install.sh), which was + # later released in X11R6 (xc/config/util/install.sh) with the + # following copyright and license. + # + # Copyright (C) 1994 X Consortium + # + # Permission is hereby granted, free of charge, to any person obtaining a copy +@@ -30,294 +30,498 @@ scriptversion=2004-12-17.09 + # be used in advertising or otherwise to promote the sale, use or other deal- + # ings in this Software without prior written authorization from the X Consor- + # tium. + # + # + # FSF changes to this file are in the public domain. + # + # Calling this script install-sh is preferred over install.sh, to prevent +-# `make' implicit rules from creating a file called install from it ++# 'make' implicit rules from creating a file called install from it + # when there is no Makefile. + # + # This script is compatible with the BSD install script, but was written +-# from scratch. It can only install one file at a time, a restriction +-# shared with many OS's install programs. ++# from scratch. ++ ++nl=' ++' ++IFS=" "" $nl" + + # set DOITPROG to echo to test this script + + # Don't use :- since 4.3BSD and earlier shells don't like it. +-doit="${DOITPROG-}" ++doit=${DOITPROG-} ++if test -z "$doit"; then ++ doit_exec=exec ++else ++ doit_exec=$doit ++fi + +-# put in absolute paths if you don't have them in your path; or use env. vars. ++# Put in absolute file names if you don't have them in your path; ++# or use environment vars. + +-mvprog="${MVPROG-mv}" +-cpprog="${CPPROG-cp}" +-chmodprog="${CHMODPROG-chmod}" +-chownprog="${CHOWNPROG-chown}" +-chgrpprog="${CHGRPPROG-chgrp}" +-stripprog="${STRIPPROG-strip}" +-rmprog="${RMPROG-rm}" +-mkdirprog="${MKDIRPROG-mkdir}" ++chgrpprog=${CHGRPPROG-chgrp} ++chmodprog=${CHMODPROG-chmod} ++chownprog=${CHOWNPROG-chown} ++cmpprog=${CMPPROG-cmp} ++cpprog=${CPPROG-cp} ++mkdirprog=${MKDIRPROG-mkdir} ++mvprog=${MVPROG-mv} ++rmprog=${RMPROG-rm} ++stripprog=${STRIPPROG-strip} + +-chmodcmd="$chmodprog 0755" ++posix_glob='?' ++initialize_posix_glob=' ++ test "$posix_glob" != "?" || { ++ if (set -f) 2>/dev/null; then ++ posix_glob= ++ else ++ posix_glob=: ++ fi ++ } ++' ++ ++posix_mkdir= ++ ++# Desired mode of installed file. ++mode=0755 ++ ++chgrpcmd= ++chmodcmd=$chmodprog + chowncmd= +-chgrpcmd= ++mvcmd=$mvprog ++rmcmd="$rmprog -f" + stripcmd= +-rmcmd="$rmprog -f" +-mvcmd="$mvprog" ++ + src= + dst= + dir_arg= +-dstarg= ++dst_arg= ++ ++copy_on_change=false + no_target_directory= + +-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE ++usage="\ ++Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + + In the 1st form, copy SRCFILE to DSTFILE. + In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. + In the 4th, create DIRECTORIES. + + Options: +--c (ignored) +--d create directories instead of installing files. +--g GROUP $chgrpprog installed files to GROUP. +--m MODE $chmodprog installed files to MODE. +--o USER $chownprog installed files to USER. +--s $stripprog installed files. +--t DIRECTORY install into DIRECTORY. +--T report an error if DSTFILE is a directory. +---help display this help and exit. +---version display version info and exit. ++ --help display this help and exit. ++ --version display version info and exit. ++ ++ -c (ignored) ++ -C install only if different (preserve the last data modification time) ++ -d create directories instead of installing files. ++ -g GROUP $chgrpprog installed files to GROUP. ++ -m MODE $chmodprog installed files to MODE. ++ -o USER $chownprog installed files to USER. ++ -s $stripprog installed files. ++ -t DIRECTORY install into DIRECTORY. ++ -T report an error if DSTFILE is a directory. + + Environment variables override the default commands: +- CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG ++ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG ++ RMPROG STRIPPROG + " + +-while test -n "$1"; do ++while test $# -ne 0; do + case $1 in +- -c) shift +- continue;; ++ -c) ;; + +- -d) dir_arg=true +- shift +- continue;; ++ -C) copy_on_change=true;; ++ ++ -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" +- shift +- shift +- continue;; ++ shift;; + +- --help) echo "$usage"; exit 0;; ++ --help) echo "$usage"; exit $?;; + +- -m) chmodcmd="$chmodprog $2" +- shift +- shift +- continue;; ++ -m) mode=$2 ++ case $mode in ++ *' '* | *' '* | *' ++'* | *'*'* | *'?'* | *'['*) ++ echo "$0: invalid mode: $mode" >&2 ++ exit 1;; ++ esac ++ shift;; + + -o) chowncmd="$chownprog $2" +- shift +- shift +- continue;; ++ shift;; + +- -s) stripcmd=$stripprog +- shift +- continue;; ++ -s) stripcmd=$stripprog;; + +- -t) dstarg=$2 +- shift +- shift +- continue;; ++ -t) dst_arg=$2 ++ # Protect names problematic for 'test' and other utilities. ++ case $dst_arg in ++ -* | [=\(\)!]) dst_arg=./$dst_arg;; ++ esac ++ shift;; + +- -T) no_target_directory=true +- shift +- continue;; ++ -T) no_target_directory=true;; + +- --version) echo "$0 $scriptversion"; exit 0;; ++ --version) echo "$0 $scriptversion"; exit $?;; + +- *) # When -d is used, all remaining arguments are directories to create. +- # When -t is used, the destination is already specified. +- test -n "$dir_arg$dstarg" && break +- # Otherwise, the last argument is the destination. Remove it from $@. +- for arg +- do +- if test -n "$dstarg"; then +- # $@ is not empty: it contains at least $arg. +- set fnord "$@" "$dstarg" +- shift # fnord +- fi +- shift # arg +- dstarg=$arg +- done ++ --) shift + break;; ++ ++ -*) echo "$0: invalid option: $1" >&2 ++ exit 1;; ++ ++ *) break;; + esac ++ shift + done + +-if test -z "$1"; then ++if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then ++ # When -d is used, all remaining arguments are directories to create. ++ # When -t is used, the destination is already specified. ++ # Otherwise, the last argument is the destination. Remove it from $@. ++ for arg ++ do ++ if test -n "$dst_arg"; then ++ # $@ is not empty: it contains at least $arg. ++ set fnord "$@" "$dst_arg" ++ shift # fnord ++ fi ++ shift # arg ++ dst_arg=$arg ++ # Protect names problematic for 'test' and other utilities. ++ case $dst_arg in ++ -* | [=\(\)!]) dst_arg=./$dst_arg;; ++ esac ++ done ++fi ++ ++if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi +- # It's OK to call `install-sh -d' without argument. ++ # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 + fi + ++if test -z "$dir_arg"; then ++ do_exit='(exit $ret); exit $ret' ++ trap "ret=129; $do_exit" 1 ++ trap "ret=130; $do_exit" 2 ++ trap "ret=141; $do_exit" 13 ++ trap "ret=143; $do_exit" 15 ++ ++ # Set umask so as not to create temps with too-generous modes. ++ # However, 'strip' requires both read and write access to temps. ++ case $mode in ++ # Optimize common cases. ++ *644) cp_umask=133;; ++ *755) cp_umask=22;; ++ ++ *[0-7]) ++ if test -z "$stripcmd"; then ++ u_plus_rw= ++ else ++ u_plus_rw='% 200' ++ fi ++ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; ++ *) ++ if test -z "$stripcmd"; then ++ u_plus_rw= ++ else ++ u_plus_rw=,u+rw ++ fi ++ cp_umask=$mode$u_plus_rw;; ++ esac ++fi ++ + for src + do +- # Protect names starting with `-'. ++ # Protect names problematic for 'test' and other utilities. + case $src in +- -*) src=./$src ;; ++ -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src +- src= ++ dstdir=$dst ++ test -d "$dstdir" ++ dstdir_status=$? ++ else + +- if test -d "$dst"; then +- mkdircmd=: +- chmodcmd= +- else +- mkdircmd=$mkdirprog +- fi +- else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + +- if test -z "$dstarg"; then ++ if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi +- +- dst=$dstarg +- # Protect names starting with `-'. +- case $dst in +- -*) dst=./$dst ;; +- esac ++ dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then +- echo "$0: $dstarg: Is a directory" >&2 ++ echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi +- dst=$dst/`basename "$src"` ++ dstdir=$dst ++ dst=$dstdir/`basename "$src"` ++ dstdir_status=0 ++ else ++ # Prefer dirname, but fall back on a substitute if dirname fails. ++ dstdir=` ++ (dirname "$dst") 2>/dev/null || ++ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$dst" : 'X\(//\)[^/]' \| \ ++ X"$dst" : 'X\(//\)$' \| \ ++ X"$dst" : 'X\(/\)' \| . 2>/dev/null || ++ echo X"$dst" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q' ++ ` ++ ++ test -d "$dstdir" ++ dstdir_status=$? + fi + fi + +- # This sed command emulates the dirname command. +- dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` ++ obsolete_mkdir_used=false + +- # Make sure that the destination directory exists. ++ if test $dstdir_status != 0; then ++ case $posix_mkdir in ++ '') ++ # Create intermediate dirs using mode 755 as modified by the umask. ++ # This is like FreeBSD 'install' as of 1997-10-28. ++ umask=`umask` ++ case $stripcmd.$umask in ++ # Optimize common cases. ++ *[2367][2367]) mkdir_umask=$umask;; ++ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + +- # Skip lots of stat calls in the usual case. +- if test ! -d "$dstdir"; then +- defaultIFS=' +- ' +- IFS="${IFS-$defaultIFS}" ++ *[0-7]) ++ mkdir_umask=`expr $umask + 22 \ ++ - $umask % 100 % 40 + $umask % 20 \ ++ - $umask % 10 % 4 + $umask % 2 ++ `;; ++ *) mkdir_umask=$umask,go-w;; ++ esac + +- oIFS=$IFS +- # Some sh's can't handle IFS=/ for some reason. +- IFS='%' +- set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` +- shift +- IFS=$oIFS ++ # With -d, create the new directory with the user-specified mode. ++ # Otherwise, rely on $mkdir_umask. ++ if test -n "$dir_arg"; then ++ mkdir_mode=-m$mode ++ else ++ mkdir_mode= ++ fi + +- pathcomp= ++ posix_mkdir=false ++ case $umask in ++ *[123567][0-7][0-7]) ++ # POSIX mkdir -p sets u+wx bits regardless of umask, which ++ # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ++ ;; ++ *) ++ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ ++ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + +- while test $# -ne 0 ; do +- pathcomp=$pathcomp$1 ++ if (umask $mkdir_umask && ++ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 ++ then ++ if test -z "$dir_arg" || { ++ # Check for POSIX incompatibilities with -m. ++ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or ++ # other-writable bit of parent directory when it shouldn't. ++ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ++ ls_ld_tmpdir=`ls -ld "$tmpdir"` ++ case $ls_ld_tmpdir in ++ d????-?r-*) different_mode=700;; ++ d????-?--*) different_mode=755;; ++ *) false;; ++ esac && ++ $mkdirprog -m$different_mode -p -- "$tmpdir" && { ++ ls_ld_tmpdir_1=`ls -ld "$tmpdir"` ++ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" ++ } ++ } ++ then posix_mkdir=: ++ fi ++ rmdir "$tmpdir/d" "$tmpdir" ++ else ++ # Remove any dirs left behind by ancient mkdir implementations. ++ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null ++ fi ++ trap '' 0;; ++ esac;; ++ esac ++ ++ if ++ $posix_mkdir && ( ++ umask $mkdir_umask && ++ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ++ ) ++ then : ++ else ++ ++ # The umask is ridiculous, or mkdir does not conform to POSIX, ++ # or it failed possibly due to a race condition. Create the ++ # directory the slow way, step by step, checking for races as we go. ++ ++ case $dstdir in ++ /*) prefix='/';; ++ [-=\(\)!]*) prefix='./';; ++ *) prefix='';; ++ esac ++ ++ eval "$initialize_posix_glob" ++ ++ oIFS=$IFS ++ IFS=/ ++ $posix_glob set -f ++ set fnord $dstdir + shift +- if test ! -d "$pathcomp"; then +- $mkdirprog "$pathcomp" +- # mkdir can fail with a `File exist' error in case several +- # install-sh are creating the directory concurrently. This +- # is OK. +- test -d "$pathcomp" || exit ++ $posix_glob set +f ++ IFS=$oIFS ++ ++ prefixes= ++ ++ for d ++ do ++ test X"$d" = X && continue ++ ++ prefix=$prefix$d ++ if test -d "$prefix"; then ++ prefixes= ++ else ++ if $posix_mkdir; then ++ (umask=$mkdir_umask && ++ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break ++ # Don't fail if two instances are running concurrently. ++ test -d "$prefix" || exit 1 ++ else ++ case $prefix in ++ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; ++ *) qprefix=$prefix;; ++ esac ++ prefixes="$prefixes '$qprefix'" ++ fi ++ fi ++ prefix=$prefix/ ++ done ++ ++ if test -n "$prefixes"; then ++ # Don't fail if two instances are running concurrently. ++ (umask $mkdir_umask && ++ eval "\$doit_exec \$mkdirprog $prefixes") || ++ test -d "$dstdir" || exit 1 ++ obsolete_mkdir_used=true + fi +- pathcomp=$pathcomp/ +- done ++ fi + fi + + if test -n "$dir_arg"; then +- $doit $mkdircmd "$dst" \ +- && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ +- && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ +- && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ +- && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } +- ++ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && ++ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && ++ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || ++ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else +- dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 +- trap '(exit $?); exit' 1 2 13 15 + + # Copy the file name to the temp name. +- $doit $cpprog "$src" "$dsttmp" && ++ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # +- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ +- && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ +- && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ +- && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && ++ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && ++ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && ++ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && ++ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + +- # Now rename the file to the real destination. +- { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ +- || { +- # The rename failed, perhaps because mv can't rename something else +- # to itself, or perhaps because mv is so ancient that it does not +- # support -f. ++ # If -C, don't bother to copy if it wouldn't change the file. ++ if $copy_on_change && ++ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && ++ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + +- # Now remove or move aside any old file at destination location. +- # We try this two ways since rm can't unlink itself on some +- # systems and the destination file might be busy for other +- # reasons. In this case, the final cleanup might fail but the new +- # file should still install successfully. +- { +- if test -f "$dstdir/$dstfile"; then +- $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ +- || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ +- || { +- echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 +- (exit 1); exit 1 +- } +- else +- : +- fi +- } && ++ eval "$initialize_posix_glob" && ++ $posix_glob set -f && ++ set X $old && old=:$2:$4:$5:$6 && ++ set X $new && new=:$2:$4:$5:$6 && ++ $posix_glob set +f && + +- # Now rename the file to the real destination. +- $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" +- } +- } +- fi || { (exit 1); exit 1; } ++ test "$old" = "$new" && ++ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 ++ then ++ rm -f "$dsttmp" ++ else ++ # Rename the file to the real destination. ++ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || ++ ++ # The rename failed, perhaps because mv can't rename something else ++ # to itself, or perhaps because mv is so ancient that it does not ++ # support -f. ++ { ++ # Now remove or move aside any old file at destination location. ++ # We try this two ways since rm can't unlink itself on some ++ # systems and the destination file might be busy for other ++ # reasons. In this case, the final cleanup might fail but the new ++ # file should still install successfully. ++ { ++ test ! -f "$dst" || ++ $doit $rmcmd -f "$dst" 2>/dev/null || ++ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && ++ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } ++ } || ++ { echo "$0: cannot unlink or rename $dst" >&2 ++ (exit 1); exit 1 ++ } ++ } && ++ ++ # Now rename the file to the real destination. ++ $doit $mvcmd "$dsttmp" "$dst" ++ } ++ fi || exit 1 ++ ++ trap '' 0 ++ fi + done + +-# The final little trick to "correctly" pass the exit status to the exit trap. +-{ +- (exit 0); exit 0 +-} +- + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "scriptversion=" + # time-stamp-format: "%:y-%02m-%02d.%02H" +-# time-stamp-end: "$" ++# time-stamp-time-zone: "UTC" ++# time-stamp-end: "; # UTC" + # End: +diff --git a/js/src/ctypes/libffi/libffi.pc.in b/js/src/ctypes/libffi/libffi.pc.in +--- a/js/src/ctypes/libffi/libffi.pc.in ++++ b/js/src/ctypes/libffi/libffi.pc.in +@@ -1,10 +1,11 @@ + prefix=@prefix@ + exec_prefix=@exec_prefix@ + libdir=@libdir@ ++toolexeclibdir=@toolexeclibdir@ + includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include + + Name: @PACKAGE_NAME@ + Description: Library supporting Foreign Function Interfaces + Version: @PACKAGE_VERSION@ +-Libs: -L${libdir} -lffi ++Libs: -L${toolexeclibdir} -lffi + Cflags: -I${includedir} +diff --git a/js/src/ctypes/libffi/libffi.xcodeproj/project.pbxproj b/js/src/ctypes/libffi/libffi.xcodeproj/project.pbxproj +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/libffi.xcodeproj/project.pbxproj +@@ -0,0 +1,637 @@ ++// !$*UTF8*$! ++{ ++ archiveVersion = 1; ++ classes = { ++ }; ++ objectVersion = 46; ++ objects = { ++ ++/* Begin PBXBuildFile section */ ++ DBFA714A187F1D8600A76262 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; ++ DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713F187F1D8600A76262 /* ffi_common.h */; }; ++ DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7140187F1D8600A76262 /* fficonfig.h */; }; ++ DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; ++ DBFA714E187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; ++ DBFA714F187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; ++ DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; ++ DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; ++ DBFA7158187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; ++ DBFA7159187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; ++ DBFA715A187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; ++ DBFA715B187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; ++ DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; ++ DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; ++ DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; ++ DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; ++ DBFA717B187F1D9B00A76262 /* trampoline_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */; }; ++ DBFA717C187F1D9B00A76262 /* darwin64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */; }; ++ DBFA717D187F1D9B00A76262 /* darwin_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7174187F1D9B00A76262 /* darwin_i386.S */; }; ++ DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; ++ DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7176187F1D9B00A76262 /* ffi_i386.c */; }; ++ DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7182187F1DA100A76262 /* ffi_i386.h */; }; ++ DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; ++ DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7184187F1DA100A76262 /* fficonfig_i386.h */; }; ++ DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */; }; ++ DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7186187F1DA100A76262 /* ffitarget_i386.h */; }; ++ DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; ++ DBFA7194187F1DA100A76262 /* darwin64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */; }; ++ DBFA7195187F1DA100A76262 /* darwin_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718B187F1DA100A76262 /* darwin_i386.S */; }; ++ DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; ++ DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718D187F1DA100A76262 /* ffi_i386.c */; }; ++/* End PBXBuildFile section */ ++ ++/* Begin PBXCopyFilesBuildPhase section */ ++ DB13B1641849DF1E0010F42D /* CopyFiles */ = { ++ isa = PBXCopyFilesBuildPhase; ++ buildActionMask = 8; ++ dstPath = "include/$(PRODUCT_NAME)"; ++ dstSubfolderSpec = 16; ++ files = ( ++ ); ++ runOnlyForDeploymentPostprocessing = 1; ++ }; ++/* End PBXCopyFilesBuildPhase section */ ++ ++/* Begin PBXFileReference section */ ++ DB13B1661849DF1E0010F42D /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; ++ DB13B1911849DF510010F42D /* ffi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = ffi.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; ++ DBFA713E187F1D8600A76262 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; ++ DBFA713F187F1D8600A76262 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = ""; }; ++ DBFA7140187F1D8600A76262 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = ""; }; ++ DBFA7141187F1D8600A76262 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = ""; }; ++ DBFA7143187F1D8600A76262 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = closures.c; sourceTree = ""; }; ++ DBFA7145187F1D8600A76262 /* dlmalloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dlmalloc.c; sourceTree = ""; }; ++ DBFA7147187F1D8600A76262 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prep_cif.c; sourceTree = ""; }; ++ DBFA7148187F1D8600A76262 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_api.c; sourceTree = ""; }; ++ DBFA7149187F1D8600A76262 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = types.c; sourceTree = ""; }; ++ DBFA715E187F1D9B00A76262 /* ffi_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_arm64.h; sourceTree = ""; }; ++ DBFA715F187F1D9B00A76262 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = ""; }; ++ DBFA7160187F1D9B00A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; ++ DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; ++ DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_arm64.h; sourceTree = ""; }; ++ DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = ""; }; ++ DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; ++ DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; ++ DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm64.h; sourceTree = ""; }; ++ DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = ""; }; ++ DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; ++ DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; ++ DBFA716C187F1D9B00A76262 /* ffi_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_arm64.c; sourceTree = ""; }; ++ DBFA716D187F1D9B00A76262 /* sysv_arm64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_arm64.S; sourceTree = ""; }; ++ DBFA716F187F1D9B00A76262 /* ffi_armv7.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_armv7.c; sourceTree = ""; }; ++ DBFA7170187F1D9B00A76262 /* sysv_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_armv7.S; sourceTree = ""; }; ++ DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = trampoline_armv7.S; sourceTree = ""; }; ++ DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64_x86_64.S; sourceTree = ""; }; ++ DBFA7174187F1D9B00A76262 /* darwin_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin_i386.S; sourceTree = ""; }; ++ DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; ++ DBFA7176187F1D9B00A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = ""; }; ++ DBFA7182187F1DA100A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; ++ DBFA7183187F1DA100A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; ++ DBFA7184187F1DA100A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; ++ DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; ++ DBFA7186187F1DA100A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; ++ DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; ++ DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64_x86_64.S; sourceTree = ""; }; ++ DBFA718B187F1DA100A76262 /* darwin_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin_i386.S; sourceTree = ""; }; ++ DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; ++ DBFA718D187F1DA100A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = ""; }; ++/* End PBXFileReference section */ ++ ++/* Begin PBXGroup section */ ++ DB13B15B1849DEB70010F42D = { ++ isa = PBXGroup; ++ children = ( ++ DBFA713C187F1D8600A76262 /* darwin_common */, ++ DBFA715C187F1D9B00A76262 /* darwin_ios */, ++ DBFA7180187F1DA100A76262 /* darwin_osx */, ++ DB13B1671849DF1E0010F42D /* Products */, ++ ); ++ sourceTree = ""; ++ }; ++ DB13B1671849DF1E0010F42D /* Products */ = { ++ isa = PBXGroup; ++ children = ( ++ DB13B1661849DF1E0010F42D /* libffi.a */, ++ DB13B1911849DF510010F42D /* ffi.dylib */, ++ ); ++ name = Products; ++ sourceTree = ""; ++ }; ++ DBFA713C187F1D8600A76262 /* darwin_common */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA713D187F1D8600A76262 /* include */, ++ DBFA7142187F1D8600A76262 /* src */, ++ ); ++ path = "darwin_common"; ++ sourceTree = ""; ++ }; ++ DBFA713D187F1D8600A76262 /* include */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA713E187F1D8600A76262 /* ffi.h */, ++ DBFA713F187F1D8600A76262 /* ffi_common.h */, ++ DBFA7140187F1D8600A76262 /* fficonfig.h */, ++ DBFA7141187F1D8600A76262 /* ffitarget.h */, ++ ); ++ path = include; ++ sourceTree = ""; ++ }; ++ DBFA7142187F1D8600A76262 /* src */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA7143187F1D8600A76262 /* closures.c */, ++ DBFA7145187F1D8600A76262 /* dlmalloc.c */, ++ DBFA7147187F1D8600A76262 /* prep_cif.c */, ++ DBFA7148187F1D8600A76262 /* raw_api.c */, ++ DBFA7149187F1D8600A76262 /* types.c */, ++ ); ++ path = src; ++ sourceTree = ""; ++ }; ++ DBFA715C187F1D9B00A76262 /* darwin_ios */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA715D187F1D9B00A76262 /* include */, ++ DBFA716A187F1D9B00A76262 /* src */, ++ ); ++ path = "darwin_ios"; ++ sourceTree = ""; ++ }; ++ DBFA715D187F1D9B00A76262 /* include */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA715E187F1D9B00A76262 /* ffi_arm64.h */, ++ DBFA715F187F1D9B00A76262 /* ffi_armv7.h */, ++ DBFA7160187F1D9B00A76262 /* ffi_i386.h */, ++ DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */, ++ DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */, ++ DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */, ++ DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */, ++ DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */, ++ DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */, ++ DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */, ++ DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */, ++ DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */, ++ ); ++ path = include; ++ sourceTree = ""; ++ }; ++ DBFA716A187F1D9B00A76262 /* src */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA716B187F1D9B00A76262 /* aarch64 */, ++ DBFA716E187F1D9B00A76262 /* arm */, ++ DBFA7172187F1D9B00A76262 /* x86 */, ++ ); ++ path = src; ++ sourceTree = ""; ++ }; ++ DBFA716B187F1D9B00A76262 /* aarch64 */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA716C187F1D9B00A76262 /* ffi_arm64.c */, ++ DBFA716D187F1D9B00A76262 /* sysv_arm64.S */, ++ ); ++ path = aarch64; ++ sourceTree = ""; ++ }; ++ DBFA716E187F1D9B00A76262 /* arm */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA716F187F1D9B00A76262 /* ffi_armv7.c */, ++ DBFA7170187F1D9B00A76262 /* sysv_armv7.S */, ++ DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */, ++ ); ++ path = arm; ++ sourceTree = ""; ++ }; ++ DBFA7172187F1D9B00A76262 /* x86 */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */, ++ DBFA7174187F1D9B00A76262 /* darwin_i386.S */, ++ DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */, ++ DBFA7176187F1D9B00A76262 /* ffi_i386.c */, ++ ); ++ path = x86; ++ sourceTree = ""; ++ }; ++ DBFA7180187F1DA100A76262 /* darwin_osx */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA7181187F1DA100A76262 /* include */, ++ DBFA7188187F1DA100A76262 /* src */, ++ ); ++ path = "darwin_osx"; ++ sourceTree = ""; ++ }; ++ DBFA7181187F1DA100A76262 /* include */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA7182187F1DA100A76262 /* ffi_i386.h */, ++ DBFA7183187F1DA100A76262 /* ffi_x86_64.h */, ++ DBFA7184187F1DA100A76262 /* fficonfig_i386.h */, ++ DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */, ++ DBFA7186187F1DA100A76262 /* ffitarget_i386.h */, ++ DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */, ++ ); ++ path = include; ++ sourceTree = ""; ++ }; ++ DBFA7188187F1DA100A76262 /* src */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA7189187F1DA100A76262 /* x86 */, ++ ); ++ path = src; ++ sourceTree = ""; ++ }; ++ DBFA7189187F1DA100A76262 /* x86 */ = { ++ isa = PBXGroup; ++ children = ( ++ DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */, ++ DBFA718B187F1DA100A76262 /* darwin_i386.S */, ++ DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */, ++ DBFA718D187F1DA100A76262 /* ffi_i386.c */, ++ ); ++ path = x86; ++ sourceTree = ""; ++ }; ++/* End PBXGroup section */ ++ ++/* Begin PBXHeadersBuildPhase section */ ++ DB13B18F1849DF510010F42D /* Headers */ = { ++ isa = PBXHeadersBuildPhase; ++ buildActionMask = 2147483647; ++ files = ( ++ DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */, ++ DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */, ++ DBFA714A187F1D8600A76262 /* ffi.h in Headers */, ++ DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */, ++ DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */, ++ DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */, ++ DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */, ++ DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */, ++ DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */, ++ DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */, ++ ); ++ runOnlyForDeploymentPostprocessing = 0; ++ }; ++/* End PBXHeadersBuildPhase section */ ++ ++/* Begin PBXNativeTarget section */ ++ DB13B1651849DF1E0010F42D /* libffi-iOS */ = { ++ isa = PBXNativeTarget; ++ buildConfigurationList = DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */; ++ buildPhases = ( ++ DB13B3051849E01C0010F42D /* ShellScript */, ++ DB13B1621849DF1E0010F42D /* Sources */, ++ DB13B1641849DF1E0010F42D /* CopyFiles */, ++ ); ++ buildRules = ( ++ ); ++ dependencies = ( ++ ); ++ name = "libffi-iOS"; ++ productName = ffi; ++ productReference = DB13B1661849DF1E0010F42D /* libffi.a */; ++ productType = "com.apple.product-type.library.static"; ++ }; ++ DB13B1901849DF510010F42D /* libffi-Mac */ = { ++ isa = PBXNativeTarget; ++ buildConfigurationList = DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */; ++ buildPhases = ( ++ DB13B3061849E0490010F42D /* ShellScript */, ++ DB13B18D1849DF510010F42D /* Sources */, ++ DB13B18F1849DF510010F42D /* Headers */, ++ ); ++ buildRules = ( ++ ); ++ dependencies = ( ++ ); ++ name = "libffi-Mac"; ++ productName = ffi; ++ productReference = DB13B1911849DF510010F42D /* ffi.dylib */; ++ productType = "com.apple.product-type.library.dynamic"; ++ }; ++/* End PBXNativeTarget section */ ++ ++/* Begin PBXProject section */ ++ DB13B15C1849DEB70010F42D /* Project object */ = { ++ isa = PBXProject; ++ attributes = { ++ LastUpgradeCheck = 0510; ++ }; ++ buildConfigurationList = DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */; ++ compatibilityVersion = "Xcode 3.2"; ++ developmentRegion = English; ++ hasScannedForEncodings = 0; ++ knownRegions = ( ++ en, ++ ); ++ mainGroup = DB13B15B1849DEB70010F42D; ++ productRefGroup = DB13B1671849DF1E0010F42D /* Products */; ++ projectDirPath = ""; ++ projectRoot = ""; ++ targets = ( ++ DB13B1651849DF1E0010F42D /* libffi-iOS */, ++ DB13B1901849DF510010F42D /* libffi-Mac */, ++ ); ++ }; ++/* End PBXProject section */ ++ ++/* Begin PBXShellScriptBuildPhase section */ ++ DB13B3051849E01C0010F42D /* ShellScript */ = { ++ isa = PBXShellScriptBuildPhase; ++ buildActionMask = 2147483647; ++ files = ( ++ ); ++ inputPaths = ( ++ ); ++ outputPaths = ( ++ ); ++ runOnlyForDeploymentPostprocessing = 0; ++ shellPath = /bin/sh; ++ shellScript = "/usr/bin/python generate-darwin-source-and-headers.py --only-ios"; ++ }; ++ DB13B3061849E0490010F42D /* ShellScript */ = { ++ isa = PBXShellScriptBuildPhase; ++ buildActionMask = 2147483647; ++ files = ( ++ ); ++ inputPaths = ( ++ ); ++ outputPaths = ( ++ ); ++ runOnlyForDeploymentPostprocessing = 0; ++ shellPath = /bin/sh; ++ shellScript = "/usr/bin/python generate-darwin-source-and-headers.py --only-osx"; ++ }; ++/* End PBXShellScriptBuildPhase section */ ++ ++/* Begin PBXSourcesBuildPhase section */ ++ DB13B1621849DF1E0010F42D /* Sources */ = { ++ isa = PBXSourcesBuildPhase; ++ buildActionMask = 2147483647; ++ files = ( ++ DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */, ++ DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */, ++ DBFA717B187F1D9B00A76262 /* trampoline_armv7.S in Sources */, ++ DBFA714E187F1D8600A76262 /* closures.c in Sources */, ++ DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */, ++ DBFA717D187F1D9B00A76262 /* darwin_i386.S in Sources */, ++ DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */, ++ DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */, ++ DBFA7158187F1D8600A76262 /* raw_api.c in Sources */, ++ DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */, ++ DBFA717C187F1D9B00A76262 /* darwin64_x86_64.S in Sources */, ++ DBFA715A187F1D8600A76262 /* types.c in Sources */, ++ DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */, ++ ); ++ runOnlyForDeploymentPostprocessing = 0; ++ }; ++ DB13B18D1849DF510010F42D /* Sources */ = { ++ isa = PBXSourcesBuildPhase; ++ buildActionMask = 2147483647; ++ files = ( ++ DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */, ++ DBFA7195187F1DA100A76262 /* darwin_i386.S in Sources */, ++ DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */, ++ DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */, ++ DBFA715B187F1D8600A76262 /* types.c in Sources */, ++ DBFA7159187F1D8600A76262 /* raw_api.c in Sources */, ++ DBFA714F187F1D8600A76262 /* closures.c in Sources */, ++ DBFA7194187F1DA100A76262 /* darwin64_x86_64.S in Sources */, ++ ); ++ runOnlyForDeploymentPostprocessing = 0; ++ }; ++/* End PBXSourcesBuildPhase section */ ++ ++/* Begin XCBuildConfiguration section */ ++ DB13B1601849DEB70010F42D /* Debug */ = { ++ isa = XCBuildConfiguration; ++ buildSettings = { ++ HEADER_SEARCH_PATHS = ( ++ "$(inherited)", ++ "darwin_common/include", ++ ); ++ ONLY_ACTIVE_ARCH = YES; ++ }; ++ name = Debug; ++ }; ++ DB13B1611849DEB70010F42D /* Release */ = { ++ isa = XCBuildConfiguration; ++ buildSettings = { ++ HEADER_SEARCH_PATHS = ( ++ "$(inherited)", ++ "darwin_common/include", ++ ); ++ }; ++ name = Release; ++ }; ++ DB13B1871849DF1E0010F42D /* Debug */ = { ++ isa = XCBuildConfiguration; ++ buildSettings = { ++ ALWAYS_SEARCH_USER_PATHS = NO; ++ ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; ++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; ++ CLANG_CXX_LIBRARY = "libc++"; ++ CLANG_ENABLE_MODULES = YES; ++ CLANG_ENABLE_OBJC_ARC = YES; ++ CLANG_WARN_BOOL_CONVERSION = YES; ++ CLANG_WARN_CONSTANT_CONVERSION = YES; ++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; ++ CLANG_WARN_EMPTY_BODY = YES; ++ CLANG_WARN_ENUM_CONVERSION = YES; ++ CLANG_WARN_INT_CONVERSION = YES; ++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; ++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ++ COPY_PHASE_STRIP = NO; ++ DSTROOT = /tmp/ffi.dst; ++ GCC_C_LANGUAGE_STANDARD = gnu99; ++ GCC_DYNAMIC_NO_PIC = NO; ++ GCC_OPTIMIZATION_LEVEL = 0; ++ GCC_PREPROCESSOR_DEFINITIONS = ( ++ "DEBUG=1", ++ "$(inherited)", ++ ); ++ GCC_SYMBOLS_PRIVATE_EXTERN = NO; ++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; ++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; ++ GCC_WARN_UNDECLARED_SELECTOR = YES; ++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; ++ GCC_WARN_UNUSED_FUNCTION = YES; ++ GCC_WARN_UNUSED_VARIABLE = YES; ++ HEADER_SEARCH_PATHS = ( ++ "$(inherited)", ++ "darwin_ios/include", ++ ); ++ IPHONEOS_DEPLOYMENT_TARGET = 5.0; ++ "IPHONEOS_DEPLOYMENT_TARGET[arch=arm64]" = 7.0; ++ OTHER_LDFLAGS = "-ObjC"; ++ PRODUCT_NAME = ffi; ++ SDKROOT = iphoneos; ++ SKIP_INSTALL = YES; ++ }; ++ name = Debug; ++ }; ++ DB13B1881849DF1E0010F42D /* Release */ = { ++ isa = XCBuildConfiguration; ++ buildSettings = { ++ ALWAYS_SEARCH_USER_PATHS = NO; ++ ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; ++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; ++ CLANG_CXX_LIBRARY = "libc++"; ++ CLANG_ENABLE_MODULES = YES; ++ CLANG_ENABLE_OBJC_ARC = YES; ++ CLANG_WARN_BOOL_CONVERSION = YES; ++ CLANG_WARN_CONSTANT_CONVERSION = YES; ++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; ++ CLANG_WARN_EMPTY_BODY = YES; ++ CLANG_WARN_ENUM_CONVERSION = YES; ++ CLANG_WARN_INT_CONVERSION = YES; ++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; ++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ++ COPY_PHASE_STRIP = YES; ++ DSTROOT = /tmp/ffi.dst; ++ ENABLE_NS_ASSERTIONS = NO; ++ GCC_C_LANGUAGE_STANDARD = gnu99; ++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; ++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; ++ GCC_WARN_UNDECLARED_SELECTOR = YES; ++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; ++ GCC_WARN_UNUSED_FUNCTION = YES; ++ GCC_WARN_UNUSED_VARIABLE = YES; ++ HEADER_SEARCH_PATHS = ( ++ "$(inherited)", ++ "darwin_ios/include", ++ ); ++ IPHONEOS_DEPLOYMENT_TARGET = 5.0; ++ "IPHONEOS_DEPLOYMENT_TARGET[arch=arm64]" = 7.0; ++ OTHER_LDFLAGS = "-ObjC"; ++ PRODUCT_NAME = ffi; ++ SDKROOT = iphoneos; ++ SKIP_INSTALL = YES; ++ VALIDATE_PRODUCT = YES; ++ }; ++ name = Release; ++ }; ++ DB13B1B11849DF520010F42D /* Debug */ = { ++ isa = XCBuildConfiguration; ++ buildSettings = { ++ ALWAYS_SEARCH_USER_PATHS = NO; ++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; ++ CLANG_CXX_LIBRARY = "libc++"; ++ CLANG_ENABLE_OBJC_ARC = YES; ++ CLANG_WARN_BOOL_CONVERSION = YES; ++ CLANG_WARN_CONSTANT_CONVERSION = YES; ++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; ++ CLANG_WARN_EMPTY_BODY = YES; ++ CLANG_WARN_ENUM_CONVERSION = YES; ++ CLANG_WARN_INT_CONVERSION = YES; ++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; ++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ++ COPY_PHASE_STRIP = NO; ++ DYLIB_COMPATIBILITY_VERSION = 1; ++ DYLIB_CURRENT_VERSION = 1; ++ GCC_C_LANGUAGE_STANDARD = gnu99; ++ GCC_DYNAMIC_NO_PIC = NO; ++ GCC_ENABLE_OBJC_EXCEPTIONS = YES; ++ GCC_OPTIMIZATION_LEVEL = 0; ++ GCC_PREPROCESSOR_DEFINITIONS = ( ++ "DEBUG=1", ++ "$(inherited)", ++ ); ++ GCC_SYMBOLS_PRIVATE_EXTERN = NO; ++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; ++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; ++ GCC_WARN_UNDECLARED_SELECTOR = YES; ++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; ++ GCC_WARN_UNUSED_FUNCTION = YES; ++ GCC_WARN_UNUSED_VARIABLE = YES; ++ HEADER_SEARCH_PATHS = ( ++ "$(inherited)", ++ "darwin_osx/include", ++ ); ++ MACOSX_DEPLOYMENT_TARGET = 10.6; ++ ONLY_ACTIVE_ARCH = YES; ++ OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; ++ PRODUCT_NAME = ffi; ++ SDKROOT = macosx; ++ }; ++ name = Debug; ++ }; ++ DB13B1B21849DF520010F42D /* Release */ = { ++ isa = XCBuildConfiguration; ++ buildSettings = { ++ ALWAYS_SEARCH_USER_PATHS = NO; ++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; ++ CLANG_CXX_LIBRARY = "libc++"; ++ CLANG_ENABLE_OBJC_ARC = YES; ++ CLANG_WARN_BOOL_CONVERSION = YES; ++ CLANG_WARN_CONSTANT_CONVERSION = YES; ++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; ++ CLANG_WARN_EMPTY_BODY = YES; ++ CLANG_WARN_ENUM_CONVERSION = YES; ++ CLANG_WARN_INT_CONVERSION = YES; ++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; ++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ++ COPY_PHASE_STRIP = YES; ++ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ++ DYLIB_COMPATIBILITY_VERSION = 1; ++ DYLIB_CURRENT_VERSION = 1; ++ ENABLE_NS_ASSERTIONS = NO; ++ GCC_C_LANGUAGE_STANDARD = gnu99; ++ GCC_ENABLE_OBJC_EXCEPTIONS = YES; ++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; ++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; ++ GCC_WARN_UNDECLARED_SELECTOR = YES; ++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; ++ GCC_WARN_UNUSED_FUNCTION = YES; ++ GCC_WARN_UNUSED_VARIABLE = YES; ++ HEADER_SEARCH_PATHS = ( ++ "$(inherited)", ++ "darwin_osx/include", ++ ); ++ MACOSX_DEPLOYMENT_TARGET = 10.6; ++ OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; ++ PRODUCT_NAME = ffi; ++ SDKROOT = macosx; ++ }; ++ name = Release; ++ }; ++/* End XCBuildConfiguration section */ ++ ++/* Begin XCConfigurationList section */ ++ DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */ = { ++ isa = XCConfigurationList; ++ buildConfigurations = ( ++ DB13B1601849DEB70010F42D /* Debug */, ++ DB13B1611849DEB70010F42D /* Release */, ++ ); ++ defaultConfigurationIsVisible = 0; ++ defaultConfigurationName = Release; ++ }; ++ DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */ = { ++ isa = XCConfigurationList; ++ buildConfigurations = ( ++ DB13B1871849DF1E0010F42D /* Debug */, ++ DB13B1881849DF1E0010F42D /* Release */, ++ ); ++ defaultConfigurationIsVisible = 0; ++ defaultConfigurationName = Release; ++ }; ++ DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */ = { ++ isa = XCConfigurationList; ++ buildConfigurations = ( ++ DB13B1B11849DF520010F42D /* Debug */, ++ DB13B1B21849DF520010F42D /* Release */, ++ ); ++ defaultConfigurationIsVisible = 0; ++ defaultConfigurationName = Release; ++ }; ++/* End XCConfigurationList section */ ++ }; ++ rootObject = DB13B15C1849DEB70010F42D /* Project object */; ++} +diff --git a/js/src/ctypes/libffi/libtool-ldflags b/js/src/ctypes/libffi/libtool-ldflags +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/libtool-ldflags +@@ -0,0 +1,106 @@ ++#! /bin/sh ++ ++# Script to translate LDFLAGS into a form suitable for use with libtool. ++ ++# Copyright (C) 2005 Free Software Foundation, Inc. ++# ++# This file is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ++# MA 02110-1301, USA. ++ ++# Contributed by CodeSourcery, LLC. ++ ++# This script is designed to be used from a Makefile that uses libtool ++# to build libraries as follows: ++# ++# LTLDFLAGS = $(shell libtool-ldflags $(LDFLAGS)) ++# ++# Then, use (LTLDFLAGS) in place of $(LDFLAGS) in your link line. ++ ++# The output of the script. This string is built up as we process the ++# arguments. ++result= ++prev_arg= ++ ++for arg ++do ++ case $arg in ++ -f*|--*) ++ # Libtool does not ascribe any special meaning options ++ # that begin with -f or with a double-dash. So, it will ++ # think these options are linker options, and prefix them ++ # with "-Wl,". Then, the compiler driver will ignore the ++ # options. So, we prefix these options with -Xcompiler to ++ # make clear to libtool that they are in fact compiler ++ # options. ++ case $prev_arg in ++ -Xpreprocessor|-Xcompiler|-Xlinker) ++ # This option is already prefixed; don't prefix it again. ++ ;; ++ *) ++ result="$result -Xcompiler" ++ ;; ++ esac ++ ;; ++ *) ++ # We do not want to add -Xcompiler to other options because ++ # that would prevent libtool itself from recognizing them. ++ ;; ++ esac ++ prev_arg=$arg ++ ++ # If $(LDFLAGS) is (say): ++ # a "b'c d" e ++ # then the user expects that: ++ # $(LD) $(LDFLAGS) ++ # will pass three arguments to $(LD): ++ # 1) a ++ # 2) b'c d ++ # 3) e ++ # We must ensure, therefore, that the arguments are appropriately ++ # quoted so that using: ++ # libtool --mode=link ... $(LTLDFLAGS) ++ # will result in the same number of arguments being passed to ++ # libtool. In other words, when this script was invoked, the shell ++ # removed one level of quoting, present in $(LDFLAGS); we have to put ++ # it back. ++ ++ # Quote any embedded single quotes. ++ case $arg in ++ *"'"*) ++ # The following command creates the script: ++ # 1s,^X,,;s|'|'"'"'|g ++ # which removes a leading X, and then quotes and embedded single ++ # quotes. ++ sed_script="1s,^X,,;s|'|'\"'\"'|g" ++ # Add a leading "X" so that if $arg starts with a dash, ++ # the echo command will not try to interpret the argument ++ # as a command-line option. ++ arg="X$arg" ++ # Generate the quoted string. ++ quoted_arg=`echo "$arg" | sed -e "$sed_script"` ++ ;; ++ *) ++ quoted_arg=$arg ++ ;; ++ esac ++ # Surround the entire argument with single quotes. ++ quoted_arg="'"$quoted_arg"'" ++ ++ # Add it to the string. ++ result="$result $quoted_arg" ++done ++ ++# Output the string we have built up. ++echo "$result" +diff --git a/js/src/ctypes/libffi/libtool-version b/js/src/ctypes/libffi/libtool-version +--- a/js/src/ctypes/libffi/libtool-version ++++ b/js/src/ctypes/libffi/libtool-version +@@ -21,9 +21,9 @@ + # + # 5. If any interfaces have been added since the last public release, + # then increment age. + # + # 6. If any interfaces have been removed since the last public + # release, then set age to 0. + # + # CURRENT:REVISION:AGE +-5:10:0 ++6:1:0 +diff --git a/js/src/ctypes/libffi/ltmain.sh b/js/src/ctypes/libffi/ltmain.sh +--- a/js/src/ctypes/libffi/ltmain.sh ++++ b/js/src/ctypes/libffi/ltmain.sh +@@ -1,14 +1,14 @@ +-# Generated from ltmain.m4sh. +- +-# ltmain.sh (GNU libtool) 2.2.6b ++ ++# libtool (GNU libtool) 2.4.2 + # Written by Gordon Matzigkeit , 1996 + +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, ++# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + # This is free software; see the source for copying conditions. There is NO + # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + # GNU Libtool is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # +@@ -27,109 +27,125 @@ + # can be downloaded from http://www.gnu.org/licenses/gpl.html, + # or obtained by writing to the Free Software Foundation, Inc., + # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + # Usage: $progname [OPTION]... [MODE-ARG]... + # + # Provide generalized library-building support services. + # +-# --config show all configuration variables +-# --debug enable verbose shell tracing +-# -n, --dry-run display commands without modifying any files +-# --features display basic configuration information and exit +-# --mode=MODE use operation mode MODE +-# --preserve-dup-deps don't remove duplicate dependency libraries +-# --quiet, --silent don't print informational messages +-# --tag=TAG use configuration variables from tag TAG +-# -v, --verbose print informational messages (default) +-# --version print version information +-# -h, --help print short or long help message ++# --config show all configuration variables ++# --debug enable verbose shell tracing ++# -n, --dry-run display commands without modifying any files ++# --features display basic configuration information and exit ++# --mode=MODE use operation mode MODE ++# --preserve-dup-deps don't remove duplicate dependency libraries ++# --quiet, --silent don't print informational messages ++# --no-quiet, --no-silent ++# print informational messages (default) ++# --no-warn don't display warning messages ++# --tag=TAG use configuration variables from tag TAG ++# -v, --verbose print more informational messages than default ++# --no-verbose don't print the extra informational messages ++# --version print version information ++# -h, --help, --help-all print short, long, or detailed help message + # + # MODE must be one of the following: + # +-# clean remove files from the build directory +-# compile compile a source file into a libtool object +-# execute automatically set library path, then run a program +-# finish complete the installation of libtool libraries +-# install install libraries or executables +-# link create a library or an executable +-# uninstall remove libraries from an installed directory ++# clean remove files from the build directory ++# compile compile a source file into a libtool object ++# execute automatically set library path, then run a program ++# finish complete the installation of libtool libraries ++# install install libraries or executables ++# link create a library or an executable ++# uninstall remove libraries from an installed directory + # +-# MODE-ARGS vary depending on the MODE. ++# MODE-ARGS vary depending on the MODE. When passed as first option, ++# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. + # Try `$progname --help --mode=MODE' for a more detailed description of MODE. + # + # When reporting a bug, please describe a test case to reproduce it and + # include the following information: + # +-# host-triplet: $host +-# shell: $SHELL +-# compiler: $LTCC +-# compiler flags: $LTCFLAGS +-# linker: $LD (gnu? $with_gnu_ld) +-# $progname: (GNU libtool) 2.2.6b +-# automake: $automake_version +-# autoconf: $autoconf_version ++# host-triplet: $host ++# shell: $SHELL ++# compiler: $LTCC ++# compiler flags: $LTCFLAGS ++# linker: $LD (gnu? $with_gnu_ld) ++# $progname: (GNU libtool) 2.4.2 ++# automake: $automake_version ++# autoconf: $autoconf_version + # + # Report bugs to . +- +-PROGRAM=ltmain.sh ++# GNU libtool home page: . ++# General help using GNU software: . ++ ++PROGRAM=libtool + PACKAGE=libtool +-VERSION=2.2.6b ++VERSION=2.4.2 + TIMESTAMP="" +-package_revision=1.3017 ++package_revision=1.3337 + + # Be Bourne compatible + if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST + else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac + fi + BIN_SH=xpg4; export BIN_SH # for Tru64 + DUALCASE=1; export DUALCASE # for MKS sh + ++# A function that is used when there is no print builtin or printf. ++func_fallback_echo () ++{ ++ eval 'cat <<_LTECHO_EOF ++$1 ++_LTECHO_EOF' ++} ++ + # NLS nuisances: We save the old values to restore during execute mode. +-# Only set LANG and LC_ALL to C if already set. +-# These must not be set unconditionally because not all systems understand +-# e.g. LANG=C (notably SCO). + lt_user_locale= + lt_safe_locale= + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" + done ++LC_ALL=C ++LANGUAGE=C ++export LANGUAGE LC_ALL + + $lt_unset CDPATH + + ++# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh ++# is ksh but when the shell is invoked as "sh" and the current value of ++# the _XPG environment variable is not equal to 1 (one), the special ++# positional parameter $0, within a function call, is the name of the ++# function. ++progpath="$0" + + + + : ${CP="cp -f"} +-: ${ECHO="echo"} +-: ${EGREP="/bin/grep -E"} +-: ${FGREP="/bin/grep -F"} +-: ${GREP="/bin/grep"} +-: ${LN_S="ln -s"} ++test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} + : ${MAKE="make"} + : ${MKDIR="mkdir"} + : ${MV="mv -f"} + : ${RM="rm -f"} +-: ${SED="/bin/sed"} + : ${SHELL="${CONFIG_SHELL-/bin/sh}"} + : ${Xsed="$SED -e 1s/^X//"} + + # Global variables: + EXIT_SUCCESS=0 + EXIT_FAILURE=1 + EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. + EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. +@@ -139,69 +155,240 @@ exit_status=$EXIT_SUCCESS + # Make sure IFS has a sensible default + lt_nl=' + ' + IFS=" $lt_nl" + + dirname="s,/[^/]*$,," + basename="s,^.*/,," + ++# func_dirname file append nondir_replacement ++# Compute the dirname of FILE. If nonempty, add APPEND to the result, ++# otherwise set result to NONDIR_REPLACEMENT. ++func_dirname () ++{ ++ func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` ++ if test "X$func_dirname_result" = "X${1}"; then ++ func_dirname_result="${3}" ++ else ++ func_dirname_result="$func_dirname_result${2}" ++ fi ++} # func_dirname may be replaced by extended shell implementation ++ ++ ++# func_basename file ++func_basename () ++{ ++ func_basename_result=`$ECHO "${1}" | $SED "$basename"` ++} # func_basename may be replaced by extended shell implementation ++ ++ + # func_dirname_and_basename file append nondir_replacement + # perform func_basename and func_dirname in a single function + # call: + # dirname: Compute the dirname of FILE. If nonempty, + # add APPEND to the result, otherwise set result + # to NONDIR_REPLACEMENT. + # value returned in "$func_dirname_result" + # basename: Compute filename of FILE. + # value retuned in "$func_basename_result" + # Implementation must be kept synchronized with func_dirname + # and func_basename. For efficiency, we do not delegate to + # those functions but instead duplicate the functionality here. + func_dirname_and_basename () + { +- # Extract subdirectory from the argument. +- func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` +- if test "X$func_dirname_result" = "X${1}"; then +- func_dirname_result="${3}" +- else +- func_dirname_result="$func_dirname_result${2}" ++ # Extract subdirectory from the argument. ++ func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` ++ if test "X$func_dirname_result" = "X${1}"; then ++ func_dirname_result="${3}" ++ else ++ func_dirname_result="$func_dirname_result${2}" ++ fi ++ func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` ++} # func_dirname_and_basename may be replaced by extended shell implementation ++ ++ ++# func_stripname prefix suffix name ++# strip PREFIX and SUFFIX off of NAME. ++# PREFIX and SUFFIX must not contain globbing or regex special ++# characters, hashes, percent signs, but SUFFIX may contain a leading ++# dot (in which case that matches only a dot). ++# func_strip_suffix prefix name ++func_stripname () ++{ ++ case ${2} in ++ .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; ++ *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; ++ esac ++} # func_stripname may be replaced by extended shell implementation ++ ++ ++# These SED scripts presuppose an absolute path with a trailing slash. ++pathcar='s,^/\([^/]*\).*$,\1,' ++pathcdr='s,^/[^/]*,,' ++removedotparts=':dotsl ++ s@/\./@/@g ++ t dotsl ++ s,/\.$,/,' ++collapseslashes='s@/\{1,\}@/@g' ++finalslash='s,/*$,/,' ++ ++# func_normal_abspath PATH ++# Remove doubled-up and trailing slashes, "." path components, ++# and cancel out any ".." path components in PATH after making ++# it an absolute path. ++# value returned in "$func_normal_abspath_result" ++func_normal_abspath () ++{ ++ # Start from root dir and reassemble the path. ++ func_normal_abspath_result= ++ func_normal_abspath_tpath=$1 ++ func_normal_abspath_altnamespace= ++ case $func_normal_abspath_tpath in ++ "") ++ # Empty path, that just means $cwd. ++ func_stripname '' '/' "`pwd`" ++ func_normal_abspath_result=$func_stripname_result ++ return ++ ;; ++ # The next three entries are used to spot a run of precisely ++ # two leading slashes without using negated character classes; ++ # we take advantage of case's first-match behaviour. ++ ///*) ++ # Unusual form of absolute path, do nothing. ++ ;; ++ //*) ++ # Not necessarily an ordinary path; POSIX reserves leading '//' ++ # and for example Cygwin uses it to access remote file shares ++ # over CIFS/SMB, so we conserve a leading double slash if found. ++ func_normal_abspath_altnamespace=/ ++ ;; ++ /*) ++ # Absolute path, do nothing. ++ ;; ++ *) ++ # Relative path, prepend $cwd. ++ func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ++ ;; ++ esac ++ # Cancel out all the simple stuff to save iterations. We also want ++ # the path to end with a slash for ease of parsing, so make sure ++ # there is one (and only one) here. ++ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ ++ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` ++ while :; do ++ # Processed it all yet? ++ if test "$func_normal_abspath_tpath" = / ; then ++ # If we ascended to the root using ".." the result may be empty now. ++ if test -z "$func_normal_abspath_result" ; then ++ func_normal_abspath_result=/ ++ fi ++ break ++ fi ++ func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ ++ -e "$pathcar"` ++ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ ++ -e "$pathcdr"` ++ # Figure out what to do with it ++ case $func_normal_abspath_tcomponent in ++ "") ++ # Trailing empty path component, ignore it. ++ ;; ++ ..) ++ # Parent dir; strip last assembled component from result. ++ func_dirname "$func_normal_abspath_result" ++ func_normal_abspath_result=$func_dirname_result ++ ;; ++ *) ++ # Actual path component, append it. ++ func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ++ ;; ++ esac ++ done ++ # Restore leading double-slash if one was found on entry. ++ func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result ++} ++ ++# func_relative_path SRCDIR DSTDIR ++# generates a relative path from SRCDIR to DSTDIR, with a trailing ++# slash if non-empty, suitable for immediately appending a filename ++# without needing to append a separator. ++# value returned in "$func_relative_path_result" ++func_relative_path () ++{ ++ func_relative_path_result= ++ func_normal_abspath "$1" ++ func_relative_path_tlibdir=$func_normal_abspath_result ++ func_normal_abspath "$2" ++ func_relative_path_tbindir=$func_normal_abspath_result ++ ++ # Ascend the tree starting from libdir ++ while :; do ++ # check if we have found a prefix of bindir ++ case $func_relative_path_tbindir in ++ $func_relative_path_tlibdir) ++ # found an exact match ++ func_relative_path_tcancelled= ++ break ++ ;; ++ $func_relative_path_tlibdir*) ++ # found a matching prefix ++ func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" ++ func_relative_path_tcancelled=$func_stripname_result ++ if test -z "$func_relative_path_result"; then ++ func_relative_path_result=. ++ fi ++ break ++ ;; ++ *) ++ func_dirname $func_relative_path_tlibdir ++ func_relative_path_tlibdir=${func_dirname_result} ++ if test "x$func_relative_path_tlibdir" = x ; then ++ # Have to descend all the way to the root! ++ func_relative_path_result=../$func_relative_path_result ++ func_relative_path_tcancelled=$func_relative_path_tbindir ++ break ++ fi ++ func_relative_path_result=../$func_relative_path_result ++ ;; ++ esac ++ done ++ ++ # Now calculate path; take care to avoid doubling-up slashes. ++ func_stripname '' '/' "$func_relative_path_result" ++ func_relative_path_result=$func_stripname_result ++ func_stripname '/' '/' "$func_relative_path_tcancelled" ++ if test "x$func_stripname_result" != x ; then ++ func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi +- func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +-} +- +-# Generated shell functions inserted here. +- +-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +-# is ksh but when the shell is invoked as "sh" and the current value of +-# the _XPG environment variable is not equal to 1 (one), the special +-# positional parameter $0, within a function call, is the name of the +-# function. +-progpath="$0" ++ ++ # Normalisation. If bindir is libdir, return empty string, ++ # else relative path ending with a slash; either way, target ++ # file name can be directly appended. ++ if test ! -z "$func_relative_path_result"; then ++ func_stripname './' '' "$func_relative_path_result/" ++ func_relative_path_result=$func_stripname_result ++ fi ++} + + # The name of this program: +-# In the unlikely event $progname began with a '-', it would play havoc with +-# func_echo (imagine progname=-n), so we prepend ./ in that case: + func_dirname_and_basename "$progpath" + progname=$func_basename_result +-case $progname in +- -*) progname=./$progname ;; +-esac + + # Make sure we have an absolute path for reexecution: + case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" +- IFS=: ++ IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +@@ -210,16 +397,25 @@ esac + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. + Xsed="${SED}"' -e 1s/^X//' + sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + + # Same as above, but do not quote variable references. + double_quote_subst='s/\(["`\\]\)/\\\1/g' + ++# Sed substitution that turns a string into a regex matching for the ++# string literally. ++sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' ++ ++# Sed substitution that converts a w32 file name or path ++# which contains forward slashes, into one that contains ++# (escaped) backslashes. A very naive implementation. ++lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' ++ + # Re-`\' parameter expansions in output of double_quote_subst that were + # `\'-ed in input to the same. If an odd number of `\' preceded a '$' + # in input to double_quote_subst, that '$' was protected from expansion. + # Since each input `\' is now two `\'s, look for any number of runs of + # four `\'s followed by two `\'s and then a '$'. `\' that '$'. + bs='\\' + bs2='\\\\' + bs4='\\\\\\\\' +@@ -238,43 +434,50 @@ opt_quiet=false + opt_verbose=false + opt_warning=: + + # func_echo arg... + # Echo program name prefixed message, along with the current mode + # name if it has been set yet. + func_echo () + { +- $ECHO "$progname${mode+: }$mode: $*" ++ $ECHO "$progname: ${opt_mode+$opt_mode: }$*" + } + + # func_verbose arg... + # Echo program name prefixed message in verbose mode only. + func_verbose () + { + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : + } + ++# func_echo_all arg... ++# Invoke $ECHO with all args, space-separated. ++func_echo_all () ++{ ++ $ECHO "$*" ++} ++ + # func_error arg... + # Echo program name prefixed message to standard error. + func_error () + { +- $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 ++ $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 + } + + # func_warning arg... + # Echo program name prefixed warning message to standard error. + func_warning () + { +- $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 ++ $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : + } + + # func_fatal_error arg... + # Echo program name prefixed message to standard error, and exit. + func_fatal_error () +@@ -321,19 +524,19 @@ func_mkdir_p () + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop +- my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` ++ my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done +- my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` ++ my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : +@@ -373,31 +576,31 @@ func_mktempdir () + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + +- $ECHO "X$my_tmpdir" | $Xsed ++ $ECHO "$my_tmpdir" + } + + + # func_quote_for_eval arg + # Aesthetically quote ARG to be evaled later. + # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT + # is double-quoted, suitable for a subsequent eval, whereas + # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters + # which are still active within double quotes backslashified. + func_quote_for_eval () + { + case $1 in + *[\\\`\"\$]*) +- func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; ++ func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. +@@ -414,17 +617,17 @@ func_quote_for_eval () + + # func_quote_for_expand arg + # Aesthetically quote ARG to be evaled later; same as above, + # but do not quote variable references. + func_quote_for_expand () + { + case $1 in + *[\\\`\"]*) +- my_arg=`$ECHO "X$1" | $Xsed \ ++ my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. +@@ -483,131 +686,211 @@ func_show_eval_locale () + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi + } + +- +- ++# func_tr_sh ++# Turn $1 into a string suitable for a shell variable name. ++# Result is stored in $func_tr_sh_result. All characters ++# not in the set a-zA-Z0-9_ are replaced with '_'. Further, ++# if $1 begins with a digit, a '_' is prepended as well. ++func_tr_sh () ++{ ++ case $1 in ++ [0-9]* | *[!a-zA-Z0-9_]*) ++ func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ++ ;; ++ * ) ++ func_tr_sh_result=$1 ++ ;; ++ esac ++} + + + # func_version + # Echo version message to standard output and exit. + func_version () + { +- $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { ++ $opt_debug ++ ++ $SED -n '/(C)/!b go ++ :more ++ /\./!{ ++ N ++ s/\n# / / ++ b more ++ } ++ :go ++ /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? + } + + # func_usage + # Echo short help message to standard output and exit. + func_usage () + { +- $SED -n '/^# Usage:/,/# -h/ { ++ $opt_debug ++ ++ $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" +- $ECHO ++ echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? + } + +-# func_help +-# Echo long help message to standard output and exit. ++# func_help [NOEXIT] ++# Echo long help message to standard output and exit, ++# unless 'noexit' is passed as argument. + func_help () + { ++ $opt_debug ++ + $SED -n '/^# Usage:/,/# Report bugs to/ { ++ :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ +- s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ +- s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ ++ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ ++ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p +- }' < "$progpath" +- exit $? ++ d ++ } ++ /^# .* home page:/b print ++ /^# General help using/b print ++ ' < "$progpath" ++ ret=$? ++ if test -z "$1"; then ++ exit $ret ++ fi + } + + # func_missing_arg argname + # Echo program name prefixed message to standard error and set global + # exit_cmd. + func_missing_arg () + { +- func_error "missing argument for $1" ++ $opt_debug ++ ++ func_error "missing argument for $1." + exit_cmd=exit + } + ++ ++# func_split_short_opt shortopt ++# Set func_split_short_opt_name and func_split_short_opt_arg shell ++# variables after splitting SHORTOPT after the 2nd character. ++func_split_short_opt () ++{ ++ my_sed_short_opt='1s/^\(..\).*$/\1/;q' ++ my_sed_short_rest='1s/^..\(.*\)$/\1/;q' ++ ++ func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` ++ func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` ++} # func_split_short_opt may be replaced by extended shell implementation ++ ++ ++# func_split_long_opt longopt ++# Set func_split_long_opt_name and func_split_long_opt_arg shell ++# variables after splitting LONGOPT at the `=' sign. ++func_split_long_opt () ++{ ++ my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' ++ my_sed_long_arg='1s/^--[^=]*=//' ++ ++ func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` ++ func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` ++} # func_split_long_opt may be replaced by extended shell implementation ++ + exit_cmd=: + + + + + +-# Check that we have a working $ECHO. +-if test "X$1" = X--no-reexec; then +- # Discard the --no-reexec flag, and continue. +- shift +-elif test "X$1" = X--fallback-echo; then +- # Avoid inline document here, it may be left over +- : +-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then +- # Yippee, $ECHO works! +- : +-else +- # Restart under the correct shell, and then maybe $ECHO will work. +- exec $SHELL "$progpath" --no-reexec ${1+"$@"} +-fi +- +-if test "X$1" = X--fallback-echo; then +- # used as fallback echo +- shift +- cat </dev/null || echo $max_cmd_len` ++} # func_len may be replaced by extended shell implementation ++ ++ ++# func_lo2o object ++func_lo2o () ++{ ++ func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` ++} # func_lo2o may be replaced by extended shell implementation ++ ++ ++# func_xform libobj-or-source ++func_xform () ++{ ++ func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` ++} # func_xform may be replaced by extended shell implementation ++ ++ + # func_fatal_configuration arg... + # Echo program name prefixed message to standard error, followed by + # a configuration failure hint, and exit. + func_fatal_configuration () + { + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +@@ -631,26 +914,26 @@ func_config () + + exit $? + } + + # func_features + # Display the features supported by this script. + func_features () + { +- $ECHO "host: $host" ++ echo "host: $host" + if test "$build_libtool_libs" = yes; then +- $ECHO "enable shared libraries" ++ echo "enable shared libraries" + else +- $ECHO "disable shared libraries" ++ echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then +- $ECHO "enable static libraries" ++ echo "enable static libraries" + else +- $ECHO "disable static libraries" ++ echo "disable static libraries" + fi + + exit $? + } + + # func_enable_tag tagname + # Verify that TAGNAME is valid, and either flag an error and exit, or + # enable the TAGNAME tag. We also add TAGNAME to the global $taglist +@@ -687,143 +970,16 @@ func_enable_tag () + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac + } + +-# Parse options once, thoroughly. This comes as soon as possible in +-# the script to make things like `libtool --version' happen quickly. +-{ +- +- # Shorthand for --mode=foo, only valid as the first argument +- case $1 in +- clean|clea|cle|cl) +- shift; set dummy --mode clean ${1+"$@"}; shift +- ;; +- compile|compil|compi|comp|com|co|c) +- shift; set dummy --mode compile ${1+"$@"}; shift +- ;; +- execute|execut|execu|exec|exe|ex|e) +- shift; set dummy --mode execute ${1+"$@"}; shift +- ;; +- finish|finis|fini|fin|fi|f) +- shift; set dummy --mode finish ${1+"$@"}; shift +- ;; +- install|instal|insta|inst|ins|in|i) +- shift; set dummy --mode install ${1+"$@"}; shift +- ;; +- link|lin|li|l) +- shift; set dummy --mode link ${1+"$@"}; shift +- ;; +- uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) +- shift; set dummy --mode uninstall ${1+"$@"}; shift +- ;; +- esac +- +- # Parse non-mode specific arguments: +- while test "$#" -gt 0; do +- opt="$1" +- shift +- +- case $opt in +- --config) func_config ;; +- +- --debug) preserve_args="$preserve_args $opt" +- func_echo "enabling shell trace mode" +- opt_debug='set -x' +- $opt_debug +- ;; +- +- -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break +- execute_dlfiles="$execute_dlfiles $1" +- shift +- ;; +- +- --dry-run | -n) opt_dry_run=: ;; +- --features) func_features ;; +- --finish) mode="finish" ;; +- +- --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break +- case $1 in +- # Valid mode arguments: +- clean) ;; +- compile) ;; +- execute) ;; +- finish) ;; +- install) ;; +- link) ;; +- relink) ;; +- uninstall) ;; +- +- # Catch anything else as an error +- *) func_error "invalid argument for $opt" +- exit_cmd=exit +- break +- ;; +- esac +- +- mode="$1" +- shift +- ;; +- +- --preserve-dup-deps) +- opt_duplicate_deps=: ;; +- +- --quiet|--silent) preserve_args="$preserve_args $opt" +- opt_silent=: +- ;; +- +- --verbose| -v) preserve_args="$preserve_args $opt" +- opt_silent=false +- ;; +- +- --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break +- preserve_args="$preserve_args $opt $1" +- func_enable_tag "$1" # tagname is set here +- shift +- ;; +- +- # Separate optargs to long options: +- -dlopen=*|--mode=*|--tag=*) +- func_opt_split "$opt" +- set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} +- shift +- ;; +- +- -\?|-h) func_usage ;; +- --help) opt_help=: ;; +- --version) func_version ;; +- +- -*) func_fatal_help "unrecognized option \`$opt'" ;; +- +- *) nonopt="$opt" +- break +- ;; +- esac +- done +- +- +- case $host in +- *cygwin* | *mingw* | *pw32* | *cegcc*) +- # don't eliminate duplications in $postdeps and $predeps +- opt_duplicate_compiler_generated_deps=: +- ;; +- *) +- opt_duplicate_compiler_generated_deps=$opt_duplicate_deps +- ;; +- esac +- +- # Having warned about all mis-specified options, bail out if +- # anything was wrong. +- $exit_cmd $EXIT_FAILURE +-} +- + # func_check_version_match + # Ensure that we are using m4 macros, and libtool script from the same + # release of libtool. + func_check_version_match () + { + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then +@@ -850,48 +1006,229 @@ func_check_version_match () + _LT_EOF + fi + + exit $EXIT_MISMATCH + fi + } + + ++# Shorthand for --mode=foo, only valid as the first argument ++case $1 in ++clean|clea|cle|cl) ++ shift; set dummy --mode clean ${1+"$@"}; shift ++ ;; ++compile|compil|compi|comp|com|co|c) ++ shift; set dummy --mode compile ${1+"$@"}; shift ++ ;; ++execute|execut|execu|exec|exe|ex|e) ++ shift; set dummy --mode execute ${1+"$@"}; shift ++ ;; ++finish|finis|fini|fin|fi|f) ++ shift; set dummy --mode finish ${1+"$@"}; shift ++ ;; ++install|instal|insta|inst|ins|in|i) ++ shift; set dummy --mode install ${1+"$@"}; shift ++ ;; ++link|lin|li|l) ++ shift; set dummy --mode link ${1+"$@"}; shift ++ ;; ++uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) ++ shift; set dummy --mode uninstall ${1+"$@"}; shift ++ ;; ++esac ++ ++ ++ ++# Option defaults: ++opt_debug=: ++opt_dry_run=false ++opt_config=false ++opt_preserve_dup_deps=false ++opt_features=false ++opt_finish=false ++opt_help=false ++opt_help_all=false ++opt_silent=: ++opt_warning=: ++opt_verbose=: ++opt_silent=false ++opt_verbose=false ++ ++ ++# Parse options once, thoroughly. This comes as soon as possible in the ++# script to make things like `--version' happen as quickly as we can. ++{ ++ # this just eases exit handling ++ while test $# -gt 0; do ++ opt="$1" ++ shift ++ case $opt in ++ --debug|-x) opt_debug='set -x' ++ func_echo "enabling shell trace mode" ++ $opt_debug ++ ;; ++ --dry-run|--dryrun|-n) ++ opt_dry_run=: ++ ;; ++ --config) ++ opt_config=: ++func_config ++ ;; ++ --dlopen|-dlopen) ++ optarg="$1" ++ opt_dlopen="${opt_dlopen+$opt_dlopen ++}$optarg" ++ shift ++ ;; ++ --preserve-dup-deps) ++ opt_preserve_dup_deps=: ++ ;; ++ --features) ++ opt_features=: ++func_features ++ ;; ++ --finish) ++ opt_finish=: ++set dummy --mode finish ${1+"$@"}; shift ++ ;; ++ --help) ++ opt_help=: ++ ;; ++ --help-all) ++ opt_help_all=: ++opt_help=': help-all' ++ ;; ++ --mode) ++ test $# = 0 && func_missing_arg $opt && break ++ optarg="$1" ++ opt_mode="$optarg" ++case $optarg in ++ # Valid mode arguments: ++ clean|compile|execute|finish|install|link|relink|uninstall) ;; ++ ++ # Catch anything else as an error ++ *) func_error "invalid argument for $opt" ++ exit_cmd=exit ++ break ++ ;; ++esac ++ shift ++ ;; ++ --no-silent|--no-quiet) ++ opt_silent=false ++func_append preserve_args " $opt" ++ ;; ++ --no-warning|--no-warn) ++ opt_warning=false ++func_append preserve_args " $opt" ++ ;; ++ --no-verbose) ++ opt_verbose=false ++func_append preserve_args " $opt" ++ ;; ++ --silent|--quiet) ++ opt_silent=: ++func_append preserve_args " $opt" ++ opt_verbose=false ++ ;; ++ --verbose|-v) ++ opt_verbose=: ++func_append preserve_args " $opt" ++opt_silent=false ++ ;; ++ --tag) ++ test $# = 0 && func_missing_arg $opt && break ++ optarg="$1" ++ opt_tag="$optarg" ++func_append preserve_args " $opt $optarg" ++func_enable_tag "$optarg" ++ shift ++ ;; ++ ++ -\?|-h) func_usage ;; ++ --help) func_help ;; ++ --version) func_version ;; ++ ++ # Separate optargs to long options: ++ --*=*) ++ func_split_long_opt "$opt" ++ set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} ++ shift ++ ;; ++ ++ # Separate non-argument short options: ++ -\?*|-h*|-n*|-v*) ++ func_split_short_opt "$opt" ++ set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} ++ shift ++ ;; ++ ++ --) break ;; ++ -*) func_fatal_help "unrecognized option \`$opt'" ;; ++ *) set dummy "$opt" ${1+"$@"}; shift; break ;; ++ esac ++ done ++ ++ # Validate options: ++ ++ # save first non-option argument ++ if test "$#" -gt 0; then ++ nonopt="$opt" ++ shift ++ fi ++ ++ # preserve --debug ++ test "$opt_debug" = : || func_append preserve_args " --debug" ++ ++ case $host in ++ *cygwin* | *mingw* | *pw32* | *cegcc*) ++ # don't eliminate duplications in $postdeps and $predeps ++ opt_duplicate_compiler_generated_deps=: ++ ;; ++ *) ++ opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ++ ;; ++ esac ++ ++ $opt_help || { ++ # Sanity checks first: ++ func_check_version_match ++ ++ if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then ++ func_fatal_configuration "not configured to build any kind of library" ++ fi ++ ++ # Darwin sucks ++ eval std_shrext=\"$shrext_cmds\" ++ ++ # Only execute mode is allowed to have -dlopen flags. ++ if test -n "$opt_dlopen" && test "$opt_mode" != execute; then ++ func_error "unrecognized option \`-dlopen'" ++ $ECHO "$help" 1>&2 ++ exit $EXIT_FAILURE ++ fi ++ ++ # Change the help message to a mode-specific one. ++ generic_help="$help" ++ help="Try \`$progname --help --mode=$opt_mode' for more information." ++ } ++ ++ ++ # Bail if the options were screwed ++ $exit_cmd $EXIT_FAILURE ++} ++ ++ ++ ++ + ## ----------- ## + ## Main. ## + ## ----------- ## + +-$opt_help || { +- # Sanity checks first: +- func_check_version_match +- +- if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then +- func_fatal_configuration "not configured to build any kind of library" +- fi +- +- test -z "$mode" && func_fatal_error "error: you must specify a MODE." +- +- +- # Darwin sucks +- eval std_shrext=\"$shrext_cmds\" +- +- +- # Only execute mode is allowed to have -dlopen flags. +- if test -n "$execute_dlfiles" && test "$mode" != execute; then +- func_error "unrecognized option \`-dlopen'" +- $ECHO "$help" 1>&2 +- exit $EXIT_FAILURE +- fi +- +- # Change the help message to a mode-specific one. +- generic_help="$help" +- help="Try \`$progname --help --mode=$mode' for more information." +-} +- +- + # func_lalib_p file + # True iff FILE is a libtool `.la' library or `.lo' object file. + # This function is only a basic sanity check; it will hardly flush out + # determined imposters. + func_lalib_p () + { + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ +@@ -945,22 +1282,19 @@ func_ltwrapper_executable_p () + } + + # func_ltwrapper_scriptname file + # Assumes file is an ltwrapper_executable + # uses $file to determine the appropriate filename for a + # temporary ltwrapper_script. + func_ltwrapper_scriptname () + { +- func_ltwrapper_scriptname_result="" +- if func_ltwrapper_executable_p "$1"; then +- func_dirname_and_basename "$1" "" "." +- func_stripname '' '.exe' "$func_basename_result" +- func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +- fi ++ func_dirname_and_basename "$1" "" "." ++ func_stripname '' '.exe' "$func_basename_result" ++ func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + } + + # func_ltwrapper_p file + # True iff FILE is a libtool wrapper script or wrapper executable + # This function is only a basic sanity check; it will hardly flush out + # determined imposters. + func_ltwrapper_p () + { +@@ -996,50 +1330,85 @@ func_source () + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac + } + + ++# func_resolve_sysroot PATH ++# Replace a leading = in PATH with a sysroot. Store the result into ++# func_resolve_sysroot_result ++func_resolve_sysroot () ++{ ++ func_resolve_sysroot_result=$1 ++ case $func_resolve_sysroot_result in ++ =*) ++ func_stripname '=' '' "$func_resolve_sysroot_result" ++ func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ++ ;; ++ esac ++} ++ ++# func_replace_sysroot PATH ++# If PATH begins with the sysroot, replace it with = and ++# store the result into func_replace_sysroot_result. ++func_replace_sysroot () ++{ ++ case "$lt_sysroot:$1" in ++ ?*:"$lt_sysroot"*) ++ func_stripname "$lt_sysroot" '' "$1" ++ func_replace_sysroot_result="=$func_stripname_result" ++ ;; ++ *) ++ # Including no sysroot. ++ func_replace_sysroot_result=$1 ++ ;; ++ esac ++} ++ + # func_infer_tag arg + # Infer tagged configuration to use if any are available and + # if one wasn't chosen via the "--tag" command line option. + # Only attempt this if the compiler in the base compile + # command doesn't match the default compiler. + # arg is usually of the form 'gcc ...' + func_infer_tag () + { + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do +- func_quote_for_eval "$arg" +- CC_quoted="$CC_quoted $func_quote_for_eval_result" ++ func_append_quoted CC_quoted "$arg" + done ++ CC_expanded=`func_echo_all $CC` ++ CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. +- " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; ++ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ ++ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. +- func_quote_for_eval "$arg" +- CC_quoted="$CC_quoted $func_quote_for_eval_result" ++ func_append_quoted CC_quoted "$arg" + done ++ CC_expanded=`func_echo_all $CC` ++ CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in +- " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ++ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ ++ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi +@@ -1092,16 +1461,496 @@ pic_object=$write_lobj + # Name of the non-PIC object + non_pic_object=$write_oldobj + + EOF + $MV "${write_libobj}T" "${write_libobj}" + } + } + ++ ++################################################## ++# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # ++################################################## ++ ++# func_convert_core_file_wine_to_w32 ARG ++# Helper function used by file name conversion functions when $build is *nix, ++# and $host is mingw, cygwin, or some other w32 environment. Relies on a ++# correctly configured wine environment available, with the winepath program ++# in $build's $PATH. ++# ++# ARG is the $build file name to be converted to w32 format. ++# Result is available in $func_convert_core_file_wine_to_w32_result, and will ++# be empty on error (or when ARG is empty) ++func_convert_core_file_wine_to_w32 () ++{ ++ $opt_debug ++ func_convert_core_file_wine_to_w32_result="$1" ++ if test -n "$1"; then ++ # Unfortunately, winepath does not exit with a non-zero error code, so we ++ # are forced to check the contents of stdout. On the other hand, if the ++ # command is not found, the shell will set an exit code of 127 and print ++ # *an error message* to stdout. So we must check for both error code of ++ # zero AND non-empty stdout, which explains the odd construction: ++ func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` ++ if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then ++ func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | ++ $SED -e "$lt_sed_naive_backslashify"` ++ else ++ func_convert_core_file_wine_to_w32_result= ++ fi ++ fi ++} ++# end: func_convert_core_file_wine_to_w32 ++ ++ ++# func_convert_core_path_wine_to_w32 ARG ++# Helper function used by path conversion functions when $build is *nix, and ++# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly ++# configured wine environment available, with the winepath program in $build's ++# $PATH. Assumes ARG has no leading or trailing path separator characters. ++# ++# ARG is path to be converted from $build format to win32. ++# Result is available in $func_convert_core_path_wine_to_w32_result. ++# Unconvertible file (directory) names in ARG are skipped; if no directory names ++# are convertible, then the result may be empty. ++func_convert_core_path_wine_to_w32 () ++{ ++ $opt_debug ++ # unfortunately, winepath doesn't convert paths, only file names ++ func_convert_core_path_wine_to_w32_result="" ++ if test -n "$1"; then ++ oldIFS=$IFS ++ IFS=: ++ for func_convert_core_path_wine_to_w32_f in $1; do ++ IFS=$oldIFS ++ func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" ++ if test -n "$func_convert_core_file_wine_to_w32_result" ; then ++ if test -z "$func_convert_core_path_wine_to_w32_result"; then ++ func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" ++ else ++ func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" ++ fi ++ fi ++ done ++ IFS=$oldIFS ++ fi ++} ++# end: func_convert_core_path_wine_to_w32 ++ ++ ++# func_cygpath ARGS... ++# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when ++# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) ++# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or ++# (2), returns the Cygwin file name or path in func_cygpath_result (input ++# file name or path is assumed to be in w32 format, as previously converted ++# from $build's *nix or MSYS format). In case (3), returns the w32 file name ++# or path in func_cygpath_result (input file name or path is assumed to be in ++# Cygwin format). Returns an empty string on error. ++# ++# ARGS are passed to cygpath, with the last one being the file name or path to ++# be converted. ++# ++# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH ++# environment variable; do not put it in $PATH. ++func_cygpath () ++{ ++ $opt_debug ++ if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then ++ func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` ++ if test "$?" -ne 0; then ++ # on failure, ensure result is empty ++ func_cygpath_result= ++ fi ++ else ++ func_cygpath_result= ++ func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" ++ fi ++} ++#end: func_cygpath ++ ++ ++# func_convert_core_msys_to_w32 ARG ++# Convert file name or path ARG from MSYS format to w32 format. Return ++# result in func_convert_core_msys_to_w32_result. ++func_convert_core_msys_to_w32 () ++{ ++ $opt_debug ++ # awkward: cmd appends spaces to result ++ func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | ++ $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` ++} ++#end: func_convert_core_msys_to_w32 ++ ++ ++# func_convert_file_check ARG1 ARG2 ++# Verify that ARG1 (a file name in $build format) was converted to $host ++# format in ARG2. Otherwise, emit an error message, but continue (resetting ++# func_to_host_file_result to ARG1). ++func_convert_file_check () ++{ ++ $opt_debug ++ if test -z "$2" && test -n "$1" ; then ++ func_error "Could not determine host file name corresponding to" ++ func_error " \`$1'" ++ func_error "Continuing, but uninstalled executables may not work." ++ # Fallback: ++ func_to_host_file_result="$1" ++ fi ++} ++# end func_convert_file_check ++ ++ ++# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH ++# Verify that FROM_PATH (a path in $build format) was converted to $host ++# format in TO_PATH. Otherwise, emit an error message, but continue, resetting ++# func_to_host_file_result to a simplistic fallback value (see below). ++func_convert_path_check () ++{ ++ $opt_debug ++ if test -z "$4" && test -n "$3"; then ++ func_error "Could not determine the host path corresponding to" ++ func_error " \`$3'" ++ func_error "Continuing, but uninstalled executables may not work." ++ # Fallback. This is a deliberately simplistic "conversion" and ++ # should not be "improved". See libtool.info. ++ if test "x$1" != "x$2"; then ++ lt_replace_pathsep_chars="s|$1|$2|g" ++ func_to_host_path_result=`echo "$3" | ++ $SED -e "$lt_replace_pathsep_chars"` ++ else ++ func_to_host_path_result="$3" ++ fi ++ fi ++} ++# end func_convert_path_check ++ ++ ++# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG ++# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT ++# and appending REPL if ORIG matches BACKPAT. ++func_convert_path_front_back_pathsep () ++{ ++ $opt_debug ++ case $4 in ++ $1 ) func_to_host_path_result="$3$func_to_host_path_result" ++ ;; ++ esac ++ case $4 in ++ $2 ) func_append func_to_host_path_result "$3" ++ ;; ++ esac ++} ++# end func_convert_path_front_back_pathsep ++ ++ ++################################################## ++# $build to $host FILE NAME CONVERSION FUNCTIONS # ++################################################## ++# invoked via `$to_host_file_cmd ARG' ++# ++# In each case, ARG is the path to be converted from $build to $host format. ++# Result will be available in $func_to_host_file_result. ++ ++ ++# func_to_host_file ARG ++# Converts the file name ARG from $build format to $host format. Return result ++# in func_to_host_file_result. ++func_to_host_file () ++{ ++ $opt_debug ++ $to_host_file_cmd "$1" ++} ++# end func_to_host_file ++ ++ ++# func_to_tool_file ARG LAZY ++# converts the file name ARG from $build format to toolchain format. Return ++# result in func_to_tool_file_result. If the conversion in use is listed ++# in (the comma separated) LAZY, no conversion takes place. ++func_to_tool_file () ++{ ++ $opt_debug ++ case ,$2, in ++ *,"$to_tool_file_cmd",*) ++ func_to_tool_file_result=$1 ++ ;; ++ *) ++ $to_tool_file_cmd "$1" ++ func_to_tool_file_result=$func_to_host_file_result ++ ;; ++ esac ++} ++# end func_to_tool_file ++ ++ ++# func_convert_file_noop ARG ++# Copy ARG to func_to_host_file_result. ++func_convert_file_noop () ++{ ++ func_to_host_file_result="$1" ++} ++# end func_convert_file_noop ++ ++ ++# func_convert_file_msys_to_w32 ARG ++# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic ++# conversion to w32 is not available inside the cwrapper. Returns result in ++# func_to_host_file_result. ++func_convert_file_msys_to_w32 () ++{ ++ $opt_debug ++ func_to_host_file_result="$1" ++ if test -n "$1"; then ++ func_convert_core_msys_to_w32 "$1" ++ func_to_host_file_result="$func_convert_core_msys_to_w32_result" ++ fi ++ func_convert_file_check "$1" "$func_to_host_file_result" ++} ++# end func_convert_file_msys_to_w32 ++ ++ ++# func_convert_file_cygwin_to_w32 ARG ++# Convert file name ARG from Cygwin to w32 format. Returns result in ++# func_to_host_file_result. ++func_convert_file_cygwin_to_w32 () ++{ ++ $opt_debug ++ func_to_host_file_result="$1" ++ if test -n "$1"; then ++ # because $build is cygwin, we call "the" cygpath in $PATH; no need to use ++ # LT_CYGPATH in this case. ++ func_to_host_file_result=`cygpath -m "$1"` ++ fi ++ func_convert_file_check "$1" "$func_to_host_file_result" ++} ++# end func_convert_file_cygwin_to_w32 ++ ++ ++# func_convert_file_nix_to_w32 ARG ++# Convert file name ARG from *nix to w32 format. Requires a wine environment ++# and a working winepath. Returns result in func_to_host_file_result. ++func_convert_file_nix_to_w32 () ++{ ++ $opt_debug ++ func_to_host_file_result="$1" ++ if test -n "$1"; then ++ func_convert_core_file_wine_to_w32 "$1" ++ func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" ++ fi ++ func_convert_file_check "$1" "$func_to_host_file_result" ++} ++# end func_convert_file_nix_to_w32 ++ ++ ++# func_convert_file_msys_to_cygwin ARG ++# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. ++# Returns result in func_to_host_file_result. ++func_convert_file_msys_to_cygwin () ++{ ++ $opt_debug ++ func_to_host_file_result="$1" ++ if test -n "$1"; then ++ func_convert_core_msys_to_w32 "$1" ++ func_cygpath -u "$func_convert_core_msys_to_w32_result" ++ func_to_host_file_result="$func_cygpath_result" ++ fi ++ func_convert_file_check "$1" "$func_to_host_file_result" ++} ++# end func_convert_file_msys_to_cygwin ++ ++ ++# func_convert_file_nix_to_cygwin ARG ++# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed ++# in a wine environment, working winepath, and LT_CYGPATH set. Returns result ++# in func_to_host_file_result. ++func_convert_file_nix_to_cygwin () ++{ ++ $opt_debug ++ func_to_host_file_result="$1" ++ if test -n "$1"; then ++ # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. ++ func_convert_core_file_wine_to_w32 "$1" ++ func_cygpath -u "$func_convert_core_file_wine_to_w32_result" ++ func_to_host_file_result="$func_cygpath_result" ++ fi ++ func_convert_file_check "$1" "$func_to_host_file_result" ++} ++# end func_convert_file_nix_to_cygwin ++ ++ ++############################################# ++# $build to $host PATH CONVERSION FUNCTIONS # ++############################################# ++# invoked via `$to_host_path_cmd ARG' ++# ++# In each case, ARG is the path to be converted from $build to $host format. ++# The result will be available in $func_to_host_path_result. ++# ++# Path separators are also converted from $build format to $host format. If ++# ARG begins or ends with a path separator character, it is preserved (but ++# converted to $host format) on output. ++# ++# All path conversion functions are named using the following convention: ++# file name conversion function : func_convert_file_X_to_Y () ++# path conversion function : func_convert_path_X_to_Y () ++# where, for any given $build/$host combination the 'X_to_Y' value is the ++# same. If conversion functions are added for new $build/$host combinations, ++# the two new functions must follow this pattern, or func_init_to_host_path_cmd ++# will break. ++ ++ ++# func_init_to_host_path_cmd ++# Ensures that function "pointer" variable $to_host_path_cmd is set to the ++# appropriate value, based on the value of $to_host_file_cmd. ++to_host_path_cmd= ++func_init_to_host_path_cmd () ++{ ++ $opt_debug ++ if test -z "$to_host_path_cmd"; then ++ func_stripname 'func_convert_file_' '' "$to_host_file_cmd" ++ to_host_path_cmd="func_convert_path_${func_stripname_result}" ++ fi ++} ++ ++ ++# func_to_host_path ARG ++# Converts the path ARG from $build format to $host format. Return result ++# in func_to_host_path_result. ++func_to_host_path () ++{ ++ $opt_debug ++ func_init_to_host_path_cmd ++ $to_host_path_cmd "$1" ++} ++# end func_to_host_path ++ ++ ++# func_convert_path_noop ARG ++# Copy ARG to func_to_host_path_result. ++func_convert_path_noop () ++{ ++ func_to_host_path_result="$1" ++} ++# end func_convert_path_noop ++ ++ ++# func_convert_path_msys_to_w32 ARG ++# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic ++# conversion to w32 is not available inside the cwrapper. Returns result in ++# func_to_host_path_result. ++func_convert_path_msys_to_w32 () ++{ ++ $opt_debug ++ func_to_host_path_result="$1" ++ if test -n "$1"; then ++ # Remove leading and trailing path separator characters from ARG. MSYS ++ # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; ++ # and winepath ignores them completely. ++ func_stripname : : "$1" ++ func_to_host_path_tmp1=$func_stripname_result ++ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" ++ func_to_host_path_result="$func_convert_core_msys_to_w32_result" ++ func_convert_path_check : ";" \ ++ "$func_to_host_path_tmp1" "$func_to_host_path_result" ++ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" ++ fi ++} ++# end func_convert_path_msys_to_w32 ++ ++ ++# func_convert_path_cygwin_to_w32 ARG ++# Convert path ARG from Cygwin to w32 format. Returns result in ++# func_to_host_file_result. ++func_convert_path_cygwin_to_w32 () ++{ ++ $opt_debug ++ func_to_host_path_result="$1" ++ if test -n "$1"; then ++ # See func_convert_path_msys_to_w32: ++ func_stripname : : "$1" ++ func_to_host_path_tmp1=$func_stripname_result ++ func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` ++ func_convert_path_check : ";" \ ++ "$func_to_host_path_tmp1" "$func_to_host_path_result" ++ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" ++ fi ++} ++# end func_convert_path_cygwin_to_w32 ++ ++ ++# func_convert_path_nix_to_w32 ARG ++# Convert path ARG from *nix to w32 format. Requires a wine environment and ++# a working winepath. Returns result in func_to_host_file_result. ++func_convert_path_nix_to_w32 () ++{ ++ $opt_debug ++ func_to_host_path_result="$1" ++ if test -n "$1"; then ++ # See func_convert_path_msys_to_w32: ++ func_stripname : : "$1" ++ func_to_host_path_tmp1=$func_stripname_result ++ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" ++ func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" ++ func_convert_path_check : ";" \ ++ "$func_to_host_path_tmp1" "$func_to_host_path_result" ++ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" ++ fi ++} ++# end func_convert_path_nix_to_w32 ++ ++ ++# func_convert_path_msys_to_cygwin ARG ++# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. ++# Returns result in func_to_host_file_result. ++func_convert_path_msys_to_cygwin () ++{ ++ $opt_debug ++ func_to_host_path_result="$1" ++ if test -n "$1"; then ++ # See func_convert_path_msys_to_w32: ++ func_stripname : : "$1" ++ func_to_host_path_tmp1=$func_stripname_result ++ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" ++ func_cygpath -u -p "$func_convert_core_msys_to_w32_result" ++ func_to_host_path_result="$func_cygpath_result" ++ func_convert_path_check : : \ ++ "$func_to_host_path_tmp1" "$func_to_host_path_result" ++ func_convert_path_front_back_pathsep ":*" "*:" : "$1" ++ fi ++} ++# end func_convert_path_msys_to_cygwin ++ ++ ++# func_convert_path_nix_to_cygwin ARG ++# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a ++# a wine environment, working winepath, and LT_CYGPATH set. Returns result in ++# func_to_host_file_result. ++func_convert_path_nix_to_cygwin () ++{ ++ $opt_debug ++ func_to_host_path_result="$1" ++ if test -n "$1"; then ++ # Remove leading and trailing path separator characters from ++ # ARG. msys behavior is inconsistent here, cygpath turns them ++ # into '.;' and ';.', and winepath ignores them completely. ++ func_stripname : : "$1" ++ func_to_host_path_tmp1=$func_stripname_result ++ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" ++ func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" ++ func_to_host_path_result="$func_cygpath_result" ++ func_convert_path_check : : \ ++ "$func_to_host_path_tmp1" "$func_to_host_path_result" ++ func_convert_path_front_back_pathsep ":*" "*:" : "$1" ++ fi ++} ++# end func_convert_path_nix_to_cygwin ++ ++ + # func_mode_compile arg... + func_mode_compile () + { + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes +@@ -1132,22 +1981,22 @@ func_mode_compile () + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) +- pie_flag="$pie_flag $arg" ++ func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) +- later="$later $arg" ++ func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + +@@ -1158,42 +2007,40 @@ func_mode_compile () + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" +- func_quote_for_eval "$arg" +- lastarg="$lastarg $func_quote_for_eval_result" ++ func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. +- base_compile="$base_compile $lastarg" ++ func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. +- func_quote_for_eval "$lastarg" +- base_compile="$base_compile $func_quote_for_eval_result" ++ func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" +@@ -1208,17 +2055,17 @@ func_mode_compile () + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ +- *.[fF][09]? | *.for | *.java | *.obj | *.sx) ++ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) +@@ -1283,17 +2130,17 @@ func_mode_compile () + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then +- output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} ++ output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed +@@ -1314,27 +2161,26 @@ temporary object file, and libtool could + your compiler does not support \`-c' and \`-o' together. If you + repeat this compilation, it may succeed, by chance, but you had better + avoid parallel builds (make -j) in this platform, or get a better + compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi +- removelist="$removelist $output_obj" ++ func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist +- removelist="$removelist $lockfile" ++ func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + +- if test -n "$fix_srcfile_path"; then +- eval srcfile=\"$fix_srcfile_path\" +- fi ++ func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 ++ srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + +@@ -1344,17 +2190,17 @@ compiler." + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir +- command="$command -o $lobj" ++ func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +@@ -1391,21 +2237,21 @@ compiler." + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then +- command="$command -o $obj" ++ func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. +- command="$command$suppress_output" ++ func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ + *** ERROR, $lockfile contains: + `cat $lockfile 2>/dev/null` +@@ -1440,23 +2286,23 @@ compiler." + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS + } + + $opt_help || { +-test "$mode" = compile && func_mode_compile ${1+"$@"} ++ test "$opt_mode" = compile && func_mode_compile ${1+"$@"} + } + + func_mode_help () + { + # We need to display help for each of the modes. +- case $mode in ++ case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +@@ -1477,20 +2323,21 @@ with it are deleted. Otherwise, only FIL + "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + + Compile a source file into a libtool library object. + + This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes +- -prefer-pic try to building PIC objects only +- -prefer-non-pic try to building non-PIC objects only ++ -prefer-pic try to build PIC objects only ++ -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking ++ -Wc,FLAG pass FLAG directly to the compiler + + COMPILE-COMMAND is a command to be used in creating a \`standard' object file + from the given SOURCEFILE. + + The output file name is determined by removing the directory component from + SOURCEFILE, then substituting the C source code suffix \`.c' with the + library object suffix, \`.lo'." + ;; +@@ -1533,17 +2380,17 @@ the \`--dry-run' option if you just want + + Install executables or libraries. + + INSTALL-COMMAND is the installation command. The first component should be + either the \`install' or \`cp' program. + + The following components of INSTALL-COMMAND are treated specially: + +- -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation ++ -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + + The rest of the components are interpreted as arguments to that command (only + BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ + "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... +@@ -1553,16 +2400,18 @@ create an executable program. + + LINK-COMMAND is a command using the C compiler that you would use to create + a program from several object files. + + The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible ++ -bindir BINDIR specify path to binaries directory (for systems where ++ libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries +@@ -1581,16 +2430,21 @@ The following components of LINK-COMMAND + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface ++ -Wc,FLAG ++ -Xcompiler FLAG pass linker-specific FLAG directly to the compiler ++ -Wl,FLAG ++ -Xlinker FLAG pass linker-specific FLAG directly to the linker ++ -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + + All other options (arguments beginning with \`-') are ignored. + + Every other argument is treated as a filename. Files ending in \`.la' are + treated as uninstalled libtool libraries, other files are standard or library + object files. + + If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +@@ -1614,47 +2468,76 @@ RM is the name of the program to use to + (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed + to RM. + + If FILE is a libtool library, all the files associated with it are deleted. + Otherwise, only FILE itself is deleted using RM." + ;; + + *) +- func_fatal_help "invalid operation mode \`$mode'" ++ func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + +- $ECHO ++ echo + $ECHO "Try \`$progname --help' for more information about other modes." +- +- exit $? +-} +- +- # Now that we've collected a possible --mode arg, show help if necessary +- $opt_help && func_mode_help ++} ++ ++# Now that we've collected a possible --mode arg, show help if necessary ++if $opt_help; then ++ if test "$opt_help" = :; then ++ func_mode_help ++ else ++ { ++ func_help noexit ++ for opt_mode in compile link execute install finish uninstall clean; do ++ func_mode_help ++ done ++ } | sed -n '1p; 2,$s/^Usage:/ or: /p' ++ { ++ func_help noexit ++ for opt_mode in compile link execute install finish uninstall clean; do ++ echo ++ func_mode_help ++ done ++ } | ++ sed '1d ++ /^When reporting/,/^Report/{ ++ H ++ d ++ } ++ $x ++ /information about other modes/d ++ /more detailed .*MODE/d ++ s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' ++ fi ++ exit $? ++fi + + + # func_mode_execute arg... + func_mode_execute () + { + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. +- for file in $execute_dlfiles; do ++ for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) ++ func_resolve_sysroot "$file" ++ file=$func_resolve_sysroot_result ++ + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" +@@ -1666,17 +2549,17 @@ func_mode_execute () + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then +- dir="$dir/$objdir" ++ func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) +@@ -1707,34 +2590,33 @@ func_mode_execute () + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in +- -*) ;; ++ -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). +- func_quote_for_eval "$file" +- args="$args $func_quote_for_eval_result" ++ func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + +@@ -1749,185 +2631,245 @@ func_mode_execute () + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" +- $ECHO "export $shlibpath_var" ++ echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi + } + +-test "$mode" = execute && func_mode_execute ${1+"$@"} ++test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + + # func_mode_finish arg... + func_mode_finish () + { + $opt_debug +- libdirs="$nonopt" ++ libs= ++ libdirs= + admincmds= + ++ for opt in "$nonopt" ${1+"$@"} ++ do ++ if test -d "$opt"; then ++ func_append libdirs " $opt" ++ ++ elif test -f "$opt"; then ++ if func_lalib_unsafe_p "$opt"; then ++ func_append libs " $opt" ++ else ++ func_warning "\`$opt' is not a valid libtool archive" ++ fi ++ ++ else ++ func_fatal_error "invalid argument \`$opt'" ++ fi ++ done ++ ++ if test -n "$libs"; then ++ if test -n "$lt_sysroot"; then ++ sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` ++ sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" ++ else ++ sysroot_cmd= ++ fi ++ ++ # Remove sysroot references ++ if $opt_dry_run; then ++ for lib in $libs; do ++ echo "removing references to $lt_sysroot and \`=' prefixes from $lib" ++ done ++ else ++ tmpdir=`func_mktempdir` ++ for lib in $libs; do ++ sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ ++ > $tmpdir/tmp-la ++ mv -f $tmpdir/tmp-la $lib ++ done ++ ${RM}r "$tmpdir" ++ fi ++ fi ++ + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then +- for dir +- do +- libdirs="$libdirs $dir" +- done +- + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds + '"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" +- $opt_dry_run || eval "$cmds" || admincmds="$admincmds ++ $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + +- $ECHO "X----------------------------------------------------------------------" | $Xsed +- $ECHO "Libraries have been installed in:" +- for libdir in $libdirs; do +- $ECHO " $libdir" +- done +- $ECHO +- $ECHO "If you ever happen to want to link against installed libraries" +- $ECHO "in a given directory, LIBDIR, you must either use libtool, and" +- $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" +- $ECHO "flag during linking and do at least one of the following:" +- if test -n "$shlibpath_var"; then +- $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" +- $ECHO " during execution" ++ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then ++ echo "----------------------------------------------------------------------" ++ echo "Libraries have been installed in:" ++ for libdir in $libdirs; do ++ $ECHO " $libdir" ++ done ++ echo ++ echo "If you ever happen to want to link against installed libraries" ++ echo "in a given directory, LIBDIR, you must either use libtool, and" ++ echo "specify the full pathname of the library, or use the \`-LLIBDIR'" ++ echo "flag during linking and do at least one of the following:" ++ if test -n "$shlibpath_var"; then ++ echo " - add LIBDIR to the \`$shlibpath_var' environment variable" ++ echo " during execution" ++ fi ++ if test -n "$runpath_var"; then ++ echo " - add LIBDIR to the \`$runpath_var' environment variable" ++ echo " during linking" ++ fi ++ if test -n "$hardcode_libdir_flag_spec"; then ++ libdir=LIBDIR ++ eval flag=\"$hardcode_libdir_flag_spec\" ++ ++ $ECHO " - use the \`$flag' linker flag" ++ fi ++ if test -n "$admincmds"; then ++ $ECHO " - have your system administrator run these commands:$admincmds" ++ fi ++ if test -f /etc/ld.so.conf; then ++ echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" ++ fi ++ echo ++ ++ echo "See any operating system documentation about shared libraries for" ++ case $host in ++ solaris2.[6789]|solaris2.1[0-9]) ++ echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" ++ echo "pages." ++ ;; ++ *) ++ echo "more information, such as the ld(1) and ld.so(8) manual pages." ++ ;; ++ esac ++ echo "----------------------------------------------------------------------" + fi +- if test -n "$runpath_var"; then +- $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" +- $ECHO " during linking" +- fi +- if test -n "$hardcode_libdir_flag_spec"; then +- libdir=LIBDIR +- eval flag=\"$hardcode_libdir_flag_spec\" +- +- $ECHO " - use the \`$flag' linker flag" +- fi +- if test -n "$admincmds"; then +- $ECHO " - have your system administrator run these commands:$admincmds" +- fi +- if test -f /etc/ld.so.conf; then +- $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" +- fi +- $ECHO +- +- $ECHO "See any operating system documentation about shared libraries for" +- case $host in +- solaris2.[6789]|solaris2.1[0-9]) +- $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" +- $ECHO "pages." +- ;; +- *) +- $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." +- ;; +- esac +- $ECHO "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + } + +-test "$mode" = finish && func_mode_finish ${1+"$@"} ++test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + + # func_mode_install arg... + func_mode_install () + { + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. +- $ECHO "X$nonopt" | $GREP shtool >/dev/null; then ++ case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" +- install_prog="$install_prog$func_quote_for_eval_result" ++ func_append install_prog "$func_quote_for_eval_result" ++ install_shared_prog=$install_prog ++ case " $install_prog " in ++ *[\\\ /]cp\ *) install_cp=: ;; ++ *) install_cp=false ;; ++ esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= ++ no_mode=: + for arg + do ++ arg2= + if test -n "$dest"; then +- files="$files $dest" ++ func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) +- case " $install_prog " in +- *[\\\ /]cp\ *) ;; +- *) prev=$arg ;; +- esac ++ if $install_cp; then :; else ++ prev=$arg ++ fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then ++ if test "x$prev" = x-m && test -n "$install_override_mode"; then ++ arg2=$install_override_mode ++ no_mode=false ++ fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" +- install_prog="$install_prog $func_quote_for_eval_result" ++ func_append install_prog " $func_quote_for_eval_result" ++ if test -n "$arg2"; then ++ func_quote_for_eval "$arg2" ++ fi ++ func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + ++ if test -n "$install_override_mode" && $no_mode; then ++ if $install_cp; then :; else ++ func_quote_for_eval "$install_override_mode" ++ func_append install_shared_prog " -m $func_quote_for_eval_result" ++ fi ++ fi ++ + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + +@@ -1972,65 +2914,68 @@ func_mode_install () + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. +- staticlibs="$staticlibs $file" ++ func_append staticlibs " $file" + ;; + + *.la) ++ func_resolve_sysroot "$file" ++ file=$func_resolve_sysroot_result ++ + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; +- *) current_libdirs="$current_libdirs $libdir" ;; ++ *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; +- *) future_libdirs="$future_libdirs $libdir" ;; ++ *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" +- dir="$dir$objdir" ++ func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. +- inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` ++ inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. +- relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` ++ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else +- relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` ++ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. +@@ -2038,17 +2983,17 @@ func_mode_install () + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. +- func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ ++ func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; +@@ -2078,17 +3023,17 @@ func_mode_install () + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. +- test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ++ test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" +@@ -2178,17 +3123,17 @@ func_mode_install () + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi +- libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test ++ libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" +@@ -2197,17 +3142,17 @@ func_mode_install () + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. +- relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` ++ relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" +@@ -2216,17 +3161,17 @@ func_mode_install () + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. +- file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` ++ file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in +@@ -2252,21 +3197,23 @@ func_mode_install () + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" ++ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 ++ tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then +- func_show_eval "$old_striplib $oldlib" 'exit $?' ++ func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" +@@ -2275,17 +3222,17 @@ func_mode_install () + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + } + +-test "$mode" = install && func_mode_install ${1+"$@"} ++test "$opt_mode" = install && func_mode_install ${1+"$@"} + + + # func_generate_dlsyms outputname originator pic_p + # Extract symbols from dlprefiles and create ${outputname}S.o with + # a dlpreopen symbol table. + func_generate_dlsyms () + { + $opt_debug +@@ -2318,29 +3265,46 @@ func_generate_dlsyms () + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ + /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ + /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + + #ifdef __cplusplus + extern \"C\" { + #endif + ++#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) ++#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" ++#endif ++ ++/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ ++#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) ++/* DATA imports from DLLs on WIN32 con't be const, because runtime ++ relocations are performed -- see ld's documentation on pseudo-relocs. */ ++# define LT_DLSYM_CONST ++#elif defined(__osf__) ++/* This system does not cope well with relocations in const data. */ ++# define LT_DLSYM_CONST ++#else ++# define LT_DLSYM_CONST const ++#endif ++ + /* External symbol declarations for the compiler. */\ + " + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. +- progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` ++ progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do +- func_verbose "extracting global C symbols from \`$progfile'" +- $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" ++ func_to_tool_file "$progfile" func_convert_file_msys_to_w32 ++ func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" ++ $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi +@@ -2366,33 +3330,75 @@ extern \"C\" { + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in +- *cygwin | *mingw* | *cegcc* ) ++ *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" +- $opt_dry_run || { +- eval '$ECHO ": $name " >> "$nlist"' +- eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" +- } ++ case $host in ++ *cygwin* | *mingw* | *cegcc* ) ++ # if an import library, we need to obtain dlname ++ if func_win32_import_lib_p "$dlprefile"; then ++ func_tr_sh "$dlprefile" ++ eval "curr_lafile=\$libfile_$func_tr_sh_result" ++ dlprefile_dlbasename="" ++ if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then ++ # Use subshell, to avoid clobbering current variable values ++ dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` ++ if test -n "$dlprefile_dlname" ; then ++ func_basename "$dlprefile_dlname" ++ dlprefile_dlbasename="$func_basename_result" ++ else ++ # no lafile. user explicitly requested -dlpreopen . ++ $sharedlib_from_linklib_cmd "$dlprefile" ++ dlprefile_dlbasename=$sharedlib_from_linklib_result ++ fi ++ fi ++ $opt_dry_run || { ++ if test -n "$dlprefile_dlbasename" ; then ++ eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' ++ else ++ func_warning "Could not compute DLL name from $name" ++ eval '$ECHO ": $name " >> "$nlist"' ++ fi ++ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 ++ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | ++ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" ++ } ++ else # not an import lib ++ $opt_dry_run || { ++ eval '$ECHO ": $name " >> "$nlist"' ++ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 ++ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" ++ } ++ fi ++ ;; ++ *) ++ $opt_dry_run || { ++ eval '$ECHO ": $name " >> "$nlist"' ++ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 ++ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" ++ } ++ ;; ++ esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T +@@ -2410,59 +3416,42 @@ extern \"C\" { + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else +- $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" ++ echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + +- $ECHO >> "$output_objdir/$my_dlsyms" "\ ++ echo >> "$output_objdir/$my_dlsyms" "\ + + /* The mapping between symbol names and symbols. */ + typedef struct { + const char *name; + void *address; + } lt_dlsymlist; +-" +- case $host in +- *cygwin* | *mingw* | *cegcc* ) +- $ECHO >> "$output_objdir/$my_dlsyms" "\ +-/* DATA imports from DLLs on WIN32 con't be const, because +- runtime relocations are performed -- see ld's documentation +- on pseudo-relocs. */" +- lt_dlsym_const= ;; +- *osf5*) +- echo >> "$output_objdir/$my_dlsyms" "\ +-/* This system does not cope well with relocations in const data */" +- lt_dlsym_const= ;; +- *) +- lt_dlsym_const=const ;; +- esac +- +- $ECHO >> "$output_objdir/$my_dlsyms" "\ +-extern $lt_dlsym_const lt_dlsymlist ++extern LT_DLSYM_CONST lt_dlsymlist + lt_${my_prefix}_LTX_preloaded_symbols[]; +-$lt_dlsym_const lt_dlsymlist ++LT_DLSYM_CONST lt_dlsymlist + lt_${my_prefix}_LTX_preloaded_symbols[] = + {\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac +- $ECHO >> "$output_objdir/$my_dlsyms" "\ ++ echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} + }; + + /* This works around a problem in FreeBSD linker */ + #ifdef FREEBSD_WORKAROUND + static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; + } +@@ -2479,94 +3468,97 @@ static const void *lt_preloaded_setup() + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. +- *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) ++ *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; +- *) symtab_cflags="$symtab_cflags $arg" ;; ++ *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then +- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` +- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` ++ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` ++ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else +- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` +- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` ++ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` ++ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) +- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` +- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` ++ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` ++ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. +- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` +- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` ++ compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` ++ finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi + } + + # func_win32_libid arg + # return the library type of file 'arg' + # + # Need a lot of goo to handle *both* DLLs and import libs + # Has to be a shell function in order to 'eat' the argument + # that is supplied when $file_magic_command is called. ++# Despite the name, also deal with 64 bit binaries. + func_win32_libid () + { + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static ++ # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | +- $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then +- win32_nmres=`eval $NM -f posix -A $1 | ++ $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then ++ func_to_tool_file "$1" func_convert_file_msys_to_w32 ++ win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` +@@ -2585,25 +3577,161 @@ func_win32_libid () + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" + } + ++# func_cygming_dll_for_implib ARG ++# ++# Platform-specific function to extract the ++# name of the DLL associated with the specified ++# import library ARG. ++# Invoked by eval'ing the libtool variable ++# $sharedlib_from_linklib_cmd ++# Result is available in the variable ++# $sharedlib_from_linklib_result ++func_cygming_dll_for_implib () ++{ ++ $opt_debug ++ sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` ++} ++ ++# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs ++# ++# The is the core of a fallback implementation of a ++# platform-specific function to extract the name of the ++# DLL associated with the specified import library LIBNAME. ++# ++# SECTION_NAME is either .idata$6 or .idata$7, depending ++# on the platform and compiler that created the implib. ++# ++# Echos the name of the DLL associated with the ++# specified import library. ++func_cygming_dll_for_implib_fallback_core () ++{ ++ $opt_debug ++ match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` ++ $OBJDUMP -s --section "$1" "$2" 2>/dev/null | ++ $SED '/^Contents of section '"$match_literal"':/{ ++ # Place marker at beginning of archive member dllname section ++ s/.*/====MARK====/ ++ p ++ d ++ } ++ # These lines can sometimes be longer than 43 characters, but ++ # are always uninteresting ++ /:[ ]*file format pe[i]\{,1\}-/d ++ /^In archive [^:]*:/d ++ # Ensure marker is printed ++ /^====MARK====/p ++ # Remove all lines with less than 43 characters ++ /^.\{43\}/!d ++ # From remaining lines, remove first 43 characters ++ s/^.\{43\}//' | ++ $SED -n ' ++ # Join marker and all lines until next marker into a single line ++ /^====MARK====/ b para ++ H ++ $ b para ++ b ++ :para ++ x ++ s/\n//g ++ # Remove the marker ++ s/^====MARK====// ++ # Remove trailing dots and whitespace ++ s/[\. \t]*$// ++ # Print ++ /./p' | ++ # we now have a list, one entry per line, of the stringified ++ # contents of the appropriate section of all members of the ++ # archive which possess that section. Heuristic: eliminate ++ # all those which have a first or second character that is ++ # a '.' (that is, objdump's representation of an unprintable ++ # character.) This should work for all archives with less than ++ # 0x302f exports -- but will fail for DLLs whose name actually ++ # begins with a literal '.' or a single character followed by ++ # a '.'. ++ # ++ # Of those that remain, print the first one. ++ $SED -e '/^\./d;/^.\./d;q' ++} ++ ++# func_cygming_gnu_implib_p ARG ++# This predicate returns with zero status (TRUE) if ++# ARG is a GNU/binutils-style import library. Returns ++# with nonzero status (FALSE) otherwise. ++func_cygming_gnu_implib_p () ++{ ++ $opt_debug ++ func_to_tool_file "$1" func_convert_file_msys_to_w32 ++ func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` ++ test -n "$func_cygming_gnu_implib_tmp" ++} ++ ++# func_cygming_ms_implib_p ARG ++# This predicate returns with zero status (TRUE) if ++# ARG is an MS-style import library. Returns ++# with nonzero status (FALSE) otherwise. ++func_cygming_ms_implib_p () ++{ ++ $opt_debug ++ func_to_tool_file "$1" func_convert_file_msys_to_w32 ++ func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` ++ test -n "$func_cygming_ms_implib_tmp" ++} ++ ++# func_cygming_dll_for_implib_fallback ARG ++# Platform-specific function to extract the ++# name of the DLL associated with the specified ++# import library ARG. ++# ++# This fallback implementation is for use when $DLLTOOL ++# does not support the --identify-strict option. ++# Invoked by eval'ing the libtool variable ++# $sharedlib_from_linklib_cmd ++# Result is available in the variable ++# $sharedlib_from_linklib_result ++func_cygming_dll_for_implib_fallback () ++{ ++ $opt_debug ++ if func_cygming_gnu_implib_p "$1" ; then ++ # binutils import library ++ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` ++ elif func_cygming_ms_implib_p "$1" ; then ++ # ms-generated import library ++ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` ++ else ++ # unknown ++ sharedlib_from_linklib_result="" ++ fi ++} + + + # func_extract_an_archive dir oldlib + func_extract_an_archive () + { + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" +- func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' ++ if test "$lock_old_archive_extraction" = yes; then ++ lockfile=$f_ex_an_ar_oldlib.lock ++ until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do ++ func_echo "Waiting for $lockfile to be removed" ++ sleep 2 ++ done ++ fi ++ func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ ++ 'stat=$?; rm -f "$lockfile"; exit $stat' ++ if test "$lock_old_archive_extraction" = yes; then ++ $opt_dry_run || rm -f "$lockfile" ++ fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi + } + + +@@ -2664,471 +3792,349 @@ func_extract_archives () + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do +- darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` ++ darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac +- my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` ++ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" + } + + +- +-# func_emit_wrapper_part1 [arg=no] +-# +-# Emit the first part of a libtool wrapper script on stdout. +-# For more information, see the description associated with +-# func_emit_wrapper(), below. +-func_emit_wrapper_part1 () +-{ +- func_emit_wrapper_part1_arg1=no +- if test -n "$1" ; then +- func_emit_wrapper_part1_arg1=$1 +- fi +- +- $ECHO "\ +-#! $SHELL +- +-# $output - temporary wrapper script for $objdir/$outputname +-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +-# +-# The $output program cannot be directly executed until all the libtool +-# libraries that it depends on are installed. +-# +-# This wrapper script should never be moved out of the build directory. +-# If it is, it will not operate correctly. +- +-# Sed substitution that helps us do robust quoting. It backslashifies +-# metacharacters that are still active within double-quoted strings. +-Xsed='${SED} -e 1s/^X//' +-sed_quote_subst='$sed_quote_subst' +- +-# Be Bourne compatible +-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then +- emulate sh +- NULLCMD=: +- # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which +- # is contrary to our usage. Disable this feature. +- alias -g '\${1+\"\$@\"}'='\"\$@\"' +- setopt NO_GLOB_SUBST +-else +- case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +-fi +-BIN_SH=xpg4; export BIN_SH # for Tru64 +-DUALCASE=1; export DUALCASE # for MKS sh +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-relink_command=\"$relink_command\" +- +-# This environment variable determines our operation mode. +-if test \"\$libtool_install_magic\" = \"$magic\"; then +- # install mode needs the following variables: +- generated_by_libtool_version='$macro_version' +- notinst_deplibs='$notinst_deplibs' +-else +- # When we are sourced in execute mode, \$file and \$ECHO are already set. +- if test \"\$libtool_execute_magic\" != \"$magic\"; then +- ECHO=\"$qecho\" +- file=\"\$0\" +- # Make sure echo works. +- if test \"X\$1\" = X--no-reexec; then +- # Discard the --no-reexec flag, and continue. +- shift +- elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then +- # Yippee, \$ECHO works! +- : +- else +- # Restart under the correct shell, and then maybe \$ECHO will work. +- exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} +- fi +- fi\ +-" +- $ECHO "\ +- +- # Find the directory that this script lives in. +- thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` +- test \"x\$thisdir\" = \"x\$file\" && thisdir=. +- +- # Follow symbolic links until we get to the real thisdir. +- file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` +- while test -n \"\$file\"; do +- destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` +- +- # If there was a directory component, then change thisdir. +- if test \"x\$destdir\" != \"x\$file\"; then +- case \"\$destdir\" in +- [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; +- *) thisdir=\"\$thisdir/\$destdir\" ;; +- esac +- fi +- +- file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` +- file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` +- done +-" +-} +-# end: func_emit_wrapper_part1 +- +-# func_emit_wrapper_part2 [arg=no] +-# +-# Emit the second part of a libtool wrapper script on stdout. +-# For more information, see the description associated with +-# func_emit_wrapper(), below. +-func_emit_wrapper_part2 () +-{ +- func_emit_wrapper_part2_arg1=no +- if test -n "$1" ; then +- func_emit_wrapper_part2_arg1=$1 +- fi +- +- $ECHO "\ +- +- # Usually 'no', except on cygwin/mingw when embedded into +- # the cwrapper. +- WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 +- if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then +- # special case for '.' +- if test \"\$thisdir\" = \".\"; then +- thisdir=\`pwd\` +- fi +- # remove .libs from thisdir +- case \"\$thisdir\" in +- *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; +- $objdir ) thisdir=. ;; +- esac +- fi +- +- # Try to get the absolute directory name. +- absdir=\`cd \"\$thisdir\" && pwd\` +- test -n \"\$absdir\" && thisdir=\"\$absdir\" +-" +- +- if test "$fast_install" = yes; then +- $ECHO "\ +- program=lt-'$outputname'$exeext +- progdir=\"\$thisdir/$objdir\" +- +- if test ! -f \"\$progdir/\$program\" || +- { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ +- test \"X\$file\" != \"X\$progdir/\$program\"; }; then +- +- file=\"\$\$-\$program\" +- +- if test ! -d \"\$progdir\"; then +- $MKDIR \"\$progdir\" +- else +- $RM \"\$progdir/\$file\" +- fi" +- +- $ECHO "\ +- +- # relink executable if necessary +- if test -n \"\$relink_command\"; then +- if relink_command_output=\`eval \$relink_command 2>&1\`; then : +- else +- $ECHO \"\$relink_command_output\" >&2 +- $RM \"\$progdir/\$file\" +- exit 1 +- fi +- fi +- +- $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || +- { $RM \"\$progdir/\$program\"; +- $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } +- $RM \"\$progdir/\$file\" +- fi" +- else +- $ECHO "\ +- program='$outputname' +- progdir=\"\$thisdir/$objdir\" +-" +- fi +- +- $ECHO "\ +- +- if test -f \"\$progdir/\$program\"; then" +- +- # Export our shlibpath_var if we have one. +- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then +- $ECHO "\ +- # Add our own library path to $shlibpath_var +- $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" +- +- # Some systems cannot cope with colon-terminated $shlibpath_var +- # The second colon is a workaround for a bug in BeOS R4 sed +- $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` +- +- export $shlibpath_var +-" +- fi +- +- # fixup the dll searchpath if we need to. +- if test -n "$dllsearchpath"; then +- $ECHO "\ +- # Add the dll search path components to the executable PATH +- PATH=$dllsearchpath:\$PATH +-" +- fi +- +- $ECHO "\ +- if test \"\$libtool_execute_magic\" != \"$magic\"; then +- # Run the actual program with our arguments. +-" +- case $host in +- # Backslashes separate directories on plain windows +- *-*-mingw | *-*-os2* | *-cegcc*) +- $ECHO "\ +- exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +-" +- ;; +- +- *) +- $ECHO "\ +- exec \"\$progdir/\$program\" \${1+\"\$@\"} +-" +- ;; +- esac +- $ECHO "\ +- \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 +- exit 1 +- fi +- else +- # The program doesn't exist. +- \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 +- \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 +- $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 +- exit 1 +- fi +-fi\ +-" +-} +-# end: func_emit_wrapper_part2 +- +- + # func_emit_wrapper [arg=no] + # + # Emit a libtool wrapper script on stdout. + # Don't directly open a file because we may want to + # incorporate the script contents within a cygwin/mingw + # wrapper executable. Must ONLY be called from within + # func_mode_link because it depends on a number of variables + # set therein. + # + # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR + # variable will take. If 'yes', then the emitted script + # will assume that the directory in which it is stored is + # the $objdir directory. This is a cygwin/mingw-specific + # behavior. + func_emit_wrapper () + { +- func_emit_wrapper_arg1=no +- if test -n "$1" ; then +- func_emit_wrapper_arg1=$1 +- fi +- +- # split this up so that func_emit_cwrapperexe_src +- # can call each part independently. +- func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" +- func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +-} +- +- +-# func_to_host_path arg ++ func_emit_wrapper_arg1=${1-no} ++ ++ $ECHO "\ ++#! $SHELL ++ ++# $output - temporary wrapper script for $objdir/$outputname ++# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION + # +-# Convert paths to host format when used with build tools. +-# Intended for use with "native" mingw (where libtool itself +-# is running under the msys shell), or in the following cross- +-# build environments: +-# $build $host +-# mingw (msys) mingw [e.g. native] +-# cygwin mingw +-# *nix + wine mingw +-# where wine is equipped with the `winepath' executable. +-# In the native mingw case, the (msys) shell automatically +-# converts paths for any non-msys applications it launches, +-# but that facility isn't available from inside the cwrapper. +-# Similar accommodations are necessary for $host mingw and +-# $build cygwin. Calling this function does no harm for other +-# $host/$build combinations not listed above. ++# The $output program cannot be directly executed until all the libtool ++# libraries that it depends on are installed. + # +-# ARG is the path (on $build) that should be converted to +-# the proper representation for $host. The result is stored +-# in $func_to_host_path_result. +-func_to_host_path () +-{ +- func_to_host_path_result="$1" +- if test -n "$1" ; then +- case $host in +- *mingw* ) +- lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' +- case $build in +- *mingw* ) # actually, msys +- # awkward: cmd appends spaces to result +- lt_sed_strip_trailing_spaces="s/[ ]*\$//" +- func_to_host_path_tmp1=`( cmd //c echo "$1" |\ +- $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` +- func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ +- $SED -e "$lt_sed_naive_backslashify"` +- ;; +- *cygwin* ) +- func_to_host_path_tmp1=`cygpath -w "$1"` +- func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ +- $SED -e "$lt_sed_naive_backslashify"` +- ;; +- * ) +- # Unfortunately, winepath does not exit with a non-zero +- # error code, so we are forced to check the contents of +- # stdout. On the other hand, if the command is not +- # found, the shell will set an exit code of 127 and print +- # *an error message* to stdout. So we must check for both +- # error code of zero AND non-empty stdout, which explains +- # the odd construction: +- func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` +- if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then +- func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ +- $SED -e "$lt_sed_naive_backslashify"` +- else +- # Allow warning below. +- func_to_host_path_result="" +- fi +- ;; +- esac +- if test -z "$func_to_host_path_result" ; then +- func_error "Could not determine host path corresponding to" +- func_error " '$1'" +- func_error "Continuing, but uninstalled executables may not work." +- # Fallback: +- func_to_host_path_result="$1" +- fi +- ;; ++# This wrapper script should never be moved out of the build directory. ++# If it is, it will not operate correctly. ++ ++# Sed substitution that helps us do robust quoting. It backslashifies ++# metacharacters that are still active within double-quoted strings. ++sed_quote_subst='$sed_quote_subst' ++ ++# Be Bourne compatible ++if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '\${1+\"\$@\"}'='\"\$@\"' ++ setopt NO_GLOB_SUBST ++else ++ case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac ++fi ++BIN_SH=xpg4; export BIN_SH # for Tru64 ++DUALCASE=1; export DUALCASE # for MKS sh ++ ++# The HP-UX ksh and POSIX shell print the target directory to stdout ++# if CDPATH is set. ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH ++ ++relink_command=\"$relink_command\" ++ ++# This environment variable determines our operation mode. ++if test \"\$libtool_install_magic\" = \"$magic\"; then ++ # install mode needs the following variables: ++ generated_by_libtool_version='$macro_version' ++ notinst_deplibs='$notinst_deplibs' ++else ++ # When we are sourced in execute mode, \$file and \$ECHO are already set. ++ if test \"\$libtool_execute_magic\" != \"$magic\"; then ++ file=\"\$0\"" ++ ++ qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` ++ $ECHO "\ ++ ++# A function that is used when there is no print builtin or printf. ++func_fallback_echo () ++{ ++ eval 'cat <<_LTECHO_EOF ++\$1 ++_LTECHO_EOF' ++} ++ ECHO=\"$qECHO\" ++ fi ++ ++# Very basic option parsing. These options are (a) specific to ++# the libtool wrapper, (b) are identical between the wrapper ++# /script/ and the wrapper /executable/ which is used only on ++# windows platforms, and (c) all begin with the string "--lt-" ++# (application programs are unlikely to have options which match ++# this pattern). ++# ++# There are only two supported options: --lt-debug and ++# --lt-dump-script. There is, deliberately, no --lt-help. ++# ++# The first argument to this parsing function should be the ++# script's $0 value, followed by "$@". ++lt_option_debug= ++func_parse_lt_options () ++{ ++ lt_script_arg0=\$0 ++ shift ++ for lt_opt ++ do ++ case \"\$lt_opt\" in ++ --lt-debug) lt_option_debug=1 ;; ++ --lt-dump-script) ++ lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` ++ test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. ++ lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` ++ cat \"\$lt_dump_D/\$lt_dump_F\" ++ exit 0 ++ ;; ++ --lt-*) ++ \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 ++ exit 1 ++ ;; ++ esac ++ done ++ ++ # Print the debug banner immediately: ++ if test -n \"\$lt_option_debug\"; then ++ echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 ++ fi ++} ++ ++# Used when --lt-debug. Prints its arguments to stdout ++# (redirection is the responsibility of the caller) ++func_lt_dump_args () ++{ ++ lt_dump_args_N=1; ++ for lt_arg ++ do ++ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" ++ lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` ++ done ++} ++ ++# Core function for launching the target application ++func_exec_program_core () ++{ ++" ++ case $host in ++ # Backslashes separate directories on plain windows ++ *-*-mingw | *-*-os2* | *-cegcc*) ++ $ECHO "\ ++ if test -n \"\$lt_option_debug\"; then ++ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 ++ func_lt_dump_args \${1+\"\$@\"} 1>&2 ++ fi ++ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} ++" ++ ;; ++ ++ *) ++ $ECHO "\ ++ if test -n \"\$lt_option_debug\"; then ++ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 ++ func_lt_dump_args \${1+\"\$@\"} 1>&2 ++ fi ++ exec \"\$progdir/\$program\" \${1+\"\$@\"} ++" ++ ;; ++ esac ++ $ECHO "\ ++ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 ++ exit 1 ++} ++ ++# A function to encapsulate launching the target application ++# Strips options in the --lt-* namespace from \$@ and ++# launches target application with the remaining arguments. ++func_exec_program () ++{ ++ case \" \$* \" in ++ *\\ --lt-*) ++ for lt_wr_arg ++ do ++ case \$lt_wr_arg in ++ --lt-*) ;; ++ *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; ++ esac ++ shift ++ done ;; ++ esac ++ func_exec_program_core \${1+\"\$@\"} ++} ++ ++ # Parse options ++ func_parse_lt_options \"\$0\" \${1+\"\$@\"} ++ ++ # Find the directory that this script lives in. ++ thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` ++ test \"x\$thisdir\" = \"x\$file\" && thisdir=. ++ ++ # Follow symbolic links until we get to the real thisdir. ++ file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` ++ while test -n \"\$file\"; do ++ destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` ++ ++ # If there was a directory component, then change thisdir. ++ if test \"x\$destdir\" != \"x\$file\"; then ++ case \"\$destdir\" in ++ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; ++ *) thisdir=\"\$thisdir/\$destdir\" ;; ++ esac ++ fi ++ ++ file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` ++ file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` ++ done ++ ++ # Usually 'no', except on cygwin/mingw when embedded into ++ # the cwrapper. ++ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 ++ if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then ++ # special case for '.' ++ if test \"\$thisdir\" = \".\"; then ++ thisdir=\`pwd\` ++ fi ++ # remove .libs from thisdir ++ case \"\$thisdir\" in ++ *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; ++ $objdir ) thisdir=. ;; + esac + fi +-} +-# end: func_to_host_path +- +-# func_to_host_pathlist arg +-# +-# Convert pathlists to host format when used with build tools. +-# See func_to_host_path(), above. This function supports the +-# following $build/$host combinations (but does no harm for +-# combinations not listed here): +-# $build $host +-# mingw (msys) mingw [e.g. native] +-# cygwin mingw +-# *nix + wine mingw +-# +-# Path separators are also converted from $build format to +-# $host format. If ARG begins or ends with a path separator +-# character, it is preserved (but converted to $host format) +-# on output. +-# +-# ARG is a pathlist (on $build) that should be converted to +-# the proper representation on $host. The result is stored +-# in $func_to_host_pathlist_result. +-func_to_host_pathlist () +-{ +- func_to_host_pathlist_result="$1" +- if test -n "$1" ; then +- case $host in +- *mingw* ) +- lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' +- # Remove leading and trailing path separator characters from +- # ARG. msys behavior is inconsistent here, cygpath turns them +- # into '.;' and ';.', and winepath ignores them completely. +- func_to_host_pathlist_tmp2="$1" +- # Once set for this call, this variable should not be +- # reassigned. It is used in tha fallback case. +- func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ +- $SED -e 's|^:*||' -e 's|:*$||'` +- case $build in +- *mingw* ) # Actually, msys. +- # Awkward: cmd appends spaces to result. +- lt_sed_strip_trailing_spaces="s/[ ]*\$//" +- func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ +- $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` +- func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ +- $SED -e "$lt_sed_naive_backslashify"` +- ;; +- *cygwin* ) +- func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` +- func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ +- $SED -e "$lt_sed_naive_backslashify"` +- ;; +- * ) +- # unfortunately, winepath doesn't convert pathlists +- func_to_host_pathlist_result="" +- func_to_host_pathlist_oldIFS=$IFS +- IFS=: +- for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do +- IFS=$func_to_host_pathlist_oldIFS +- if test -n "$func_to_host_pathlist_f" ; then +- func_to_host_path "$func_to_host_pathlist_f" +- if test -n "$func_to_host_path_result" ; then +- if test -z "$func_to_host_pathlist_result" ; then +- func_to_host_pathlist_result="$func_to_host_path_result" +- else +- func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" +- fi +- fi +- fi +- IFS=: +- done +- IFS=$func_to_host_pathlist_oldIFS +- ;; +- esac +- if test -z "$func_to_host_pathlist_result" ; then +- func_error "Could not determine the host path(s) corresponding to" +- func_error " '$1'" +- func_error "Continuing, but uninstalled executables may not work." +- # Fallback. This may break if $1 contains DOS-style drive +- # specifications. The fix is not to complicate the expression +- # below, but for the user to provide a working wine installation +- # with winepath so that path translation in the cross-to-mingw +- # case works properly. +- lt_replace_pathsep_nix_to_dos="s|:|;|g" +- func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ +- $SED -e "$lt_replace_pathsep_nix_to_dos"` +- fi +- # Now, add the leading and trailing path separators back +- case "$1" in +- :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" +- ;; +- esac +- case "$1" in +- *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" +- ;; +- esac +- ;; +- esac ++ ++ # Try to get the absolute directory name. ++ absdir=\`cd \"\$thisdir\" && pwd\` ++ test -n \"\$absdir\" && thisdir=\"\$absdir\" ++" ++ ++ if test "$fast_install" = yes; then ++ $ECHO "\ ++ program=lt-'$outputname'$exeext ++ progdir=\"\$thisdir/$objdir\" ++ ++ if test ! -f \"\$progdir/\$program\" || ++ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ ++ test \"X\$file\" != \"X\$progdir/\$program\"; }; then ++ ++ file=\"\$\$-\$program\" ++ ++ if test ! -d \"\$progdir\"; then ++ $MKDIR \"\$progdir\" ++ else ++ $RM \"\$progdir/\$file\" ++ fi" ++ ++ $ECHO "\ ++ ++ # relink executable if necessary ++ if test -n \"\$relink_command\"; then ++ if relink_command_output=\`eval \$relink_command 2>&1\`; then : ++ else ++ $ECHO \"\$relink_command_output\" >&2 ++ $RM \"\$progdir/\$file\" ++ exit 1 ++ fi ++ fi ++ ++ $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || ++ { $RM \"\$progdir/\$program\"; ++ $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } ++ $RM \"\$progdir/\$file\" ++ fi" ++ else ++ $ECHO "\ ++ program='$outputname' ++ progdir=\"\$thisdir/$objdir\" ++" ++ fi ++ ++ $ECHO "\ ++ ++ if test -f \"\$progdir/\$program\"; then" ++ ++ # fixup the dll searchpath if we need to. ++ # ++ # Fix the DLL searchpath if we need to. Do this before prepending ++ # to shlibpath, because on Windows, both are PATH and uninstalled ++ # libraries must come first. ++ if test -n "$dllsearchpath"; then ++ $ECHO "\ ++ # Add the dll search path components to the executable PATH ++ PATH=$dllsearchpath:\$PATH ++" ++ fi ++ ++ # Export our shlibpath_var if we have one. ++ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then ++ $ECHO "\ ++ # Add our own library path to $shlibpath_var ++ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" ++ ++ # Some systems cannot cope with colon-terminated $shlibpath_var ++ # The second colon is a workaround for a bug in BeOS R4 sed ++ $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` ++ ++ export $shlibpath_var ++" ++ fi ++ ++ $ECHO "\ ++ if test \"\$libtool_execute_magic\" != \"$magic\"; then ++ # Run the actual program with our arguments. ++ func_exec_program \${1+\"\$@\"} ++ fi ++ else ++ # The program doesn't exist. ++ \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 ++ \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 ++ \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 ++ exit 1 + fi +-} +-# end: func_to_host_pathlist ++fi\ ++" ++} ++ + + # func_emit_cwrapperexe_src + # emit the source code for a wrapper executable on stdout + # Must ONLY be called from within func_mode_link because + # it depends on a number of variable set therein. + func_emit_cwrapperexe_src () + { + cat < + #include + #ifdef _MSC_VER + # include + # include + # include +-# define setmode _setmode + #else + # include + # include + # ifdef __CYGWIN__ + # include +-# define HAVE_SETENV +-# ifdef __STRICT_ANSI__ +-char *realpath (const char *, char *); +-int putenv (char *); +-int setenv (const char *, const char *, int); +-# endif + # endif + #endif + #include + #include + #include + #include + #include + #include + #include + #include + ++/* declarations of non-ANSI functions */ ++#if defined(__MINGW32__) ++# ifdef __STRICT_ANSI__ ++int _putenv (const char *); ++# endif ++#elif defined(__CYGWIN__) ++# ifdef __STRICT_ANSI__ ++char *realpath (const char *, char *); ++int putenv (char *); ++int setenv (const char *, const char *, int); ++# endif ++/* #elif defined (other platforms) ... */ ++#endif ++ ++/* portability defines, excluding path handling macros */ ++#if defined(_MSC_VER) ++# define setmode _setmode ++# define stat _stat ++# define chmod _chmod ++# define getcwd _getcwd ++# define putenv _putenv ++# define S_IXUSR _S_IEXEC ++# ifndef _INTPTR_T_DEFINED ++# define _INTPTR_T_DEFINED ++# define intptr_t int ++# endif ++#elif defined(__MINGW32__) ++# define setmode _setmode ++# define stat _stat ++# define chmod _chmod ++# define getcwd _getcwd ++# define putenv _putenv ++#elif defined(__CYGWIN__) ++# define HAVE_SETENV ++# define FOPEN_WB "wb" ++/* #elif defined (other platforms) ... */ ++#endif ++ + #if defined(PATH_MAX) + # define LT_PATHMAX PATH_MAX + #elif defined(MAXPATHLEN) + # define LT_PATHMAX MAXPATHLEN + #else + # define LT_PATHMAX 1024 + #endif + + #ifndef S_IXOTH + # define S_IXOTH 0 + #endif + #ifndef S_IXGRP + # define S_IXGRP 0 + #endif + +-#ifdef _MSC_VER +-# define S_IXUSR _S_IEXEC +-# define stat _stat +-# ifndef _INTPTR_T_DEFINED +-# define intptr_t int +-# endif +-#endif +- ++/* path handling portability macros */ + #ifndef DIR_SEPARATOR + # define DIR_SEPARATOR '/' + # define PATH_SEPARATOR ':' + #endif + + #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) + # define HAVE_DOS_BASED_FILE_SYSTEM +@@ -3225,104 +4254,77 @@ int setenv (const char *, const char *, + #endif /* DIR_SEPARATOR_2 */ + + #ifndef PATH_SEPARATOR_2 + # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) + #else /* PATH_SEPARATOR_2 */ + # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) + #endif /* PATH_SEPARATOR_2 */ + +-#ifdef __CYGWIN__ +-# define FOPEN_WB "wb" +-#endif +- + #ifndef FOPEN_WB + # define FOPEN_WB "w" + #endif + #ifndef _O_BINARY + # define _O_BINARY 0 + #endif + + #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) + #define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ + } while (0) + +-#undef LTWRAPPER_DEBUGPRINTF +-#if defined DEBUGWRAPPER +-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +-static void +-ltwrapper_debugprintf (const char *fmt, ...) +-{ +- va_list args; +- va_start (args, fmt); +- (void) vfprintf (stderr, fmt, args); +- va_end (args); +-} ++#if defined(LT_DEBUGWRAPPER) ++static int lt_debug = 1; + #else +-# define LTWRAPPER_DEBUGPRINTF(args) ++static int lt_debug = 0; + #endif + +-const char *program_name = NULL; ++const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + + void *xmalloc (size_t num); + char *xstrdup (const char *string); + const char *base_name (const char *name); + char *find_executable (const char *wrapper); + char *chase_symlinks (const char *pathspec); + int make_executable (const char *path); + int check_executable (const char *path); + char *strendzap (char *str, const char *pat); +-void lt_fatal (const char *message, ...); ++void lt_debugprintf (const char *file, int line, const char *fmt, ...); ++void lt_fatal (const char *file, int line, const char *message, ...); ++static const char *nonnull (const char *s); ++static const char *nonempty (const char *s); + void lt_setenv (const char *name, const char *value); + char *lt_extend_str (const char *orig_value, const char *add, int to_end); +-void lt_opt_process_env_set (const char *arg); +-void lt_opt_process_env_prepend (const char *arg); +-void lt_opt_process_env_append (const char *arg); +-int lt_split_name_value (const char *arg, char** name, char** value); + void lt_update_exe_path (const char *name, const char *value); + void lt_update_lib_path (const char *name, const char *value); +- +-static const char *script_text_part1 = ++char **prepare_spawn (char **argv); ++void lt_dump_script (FILE *f); + EOF + +- func_emit_wrapper_part1 yes | +- $SED -e 's/\([\\"]\)/\\\1/g' \ +- -e 's/^/ "/' -e 's/$/\\n"/' +- echo ";" + cat <"))); ++ ++ lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", ++ nonnull (lt_argv_zero)); + for (i = 0; i < newargc; i++) + { +- LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); ++ lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", ++ i, nonnull (newargz[i])); + } + + EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ ++ newargz = prepare_spawn (newargz); + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ +- LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); ++ lt_debugprintf (__FILE__, __LINE__, ++ "(main) failed to launch target \"%s\": %s\n", ++ lt_argv_zero, nonnull (strerror (errno))); + return 127; + } + return rval; + EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); +@@ -3581,17 +4547,17 @@ EOF + cat <<"EOF" + } + + void * + xmalloc (size_t num) + { + void *p = (void *) malloc (num); + if (!p) +- lt_fatal ("Memory exhausted"); ++ lt_fatal (__FILE__, __LINE__, "memory exhausted"); + + return p; + } + + char * + xstrdup (const char *string) + { + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), +@@ -3615,36 +4581,36 @@ base_name (const char *name) + return base; + } + + int + check_executable (const char *path) + { + struct stat st; + +- LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", +- path ? (*path ? path : "EMPTY!") : "NULL!")); ++ lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", ++ nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; + } + + int + make_executable (const char *path) + { + int rval = 0; + struct stat st; + +- LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", +- path ? (*path ? path : "EMPTY!") : "NULL!")); ++ lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", ++ nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +@@ -3660,18 +4626,18 @@ find_executable (const char *wrapper) + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + +- LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", +- wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); ++ lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", ++ nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ + #if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { +@@ -3714,17 +4680,18 @@ find_executable (const char *wrapper) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) +- lt_fatal ("getcwd failed"); ++ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", ++ nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else +@@ -3739,17 +4706,18 @@ find_executable (const char *wrapper) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) +- lt_fatal ("getcwd failed"); ++ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", ++ nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; +@@ -3765,18 +4733,19 @@ chase_symlinks (const char *pathspec) + #else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { +- LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", +- tmp_pathspec)); ++ lt_debugprintf (__FILE__, __LINE__, ++ "checking path component for symlinks: %s\n", ++ tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + +@@ -3788,31 +4757,33 @@ chase_symlinks (const char *pathspec) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { +- char *errstr = strerror (errno); +- lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); ++ lt_fatal (__FILE__, __LINE__, ++ "error accessing file \"%s\": %s", ++ tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { +- lt_fatal ("Could not follow symlinks for %s", pathspec); ++ lt_fatal (__FILE__, __LINE__, ++ "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); + #endif + } + + char * + strendzap (char *str, const char *pat) + { +@@ -3828,43 +4799,69 @@ strendzap (char *str, const char *pat) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; + } + ++void ++lt_debugprintf (const char *file, int line, const char *fmt, ...) ++{ ++ va_list args; ++ if (lt_debug) ++ { ++ (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); ++ va_start (args, fmt); ++ (void) vfprintf (stderr, fmt, args); ++ va_end (args); ++ } ++} ++ + static void +-lt_error_core (int exit_status, const char *mode, ++lt_error_core (int exit_status, const char *file, ++ int line, const char *mode, + const char *message, va_list ap) + { +- fprintf (stderr, "%s: %s: ", program_name, mode); ++ fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); + } + + void +-lt_fatal (const char *message, ...) ++lt_fatal (const char *file, int line, const char *message, ...) + { + va_list ap; + va_start (ap, message); +- lt_error_core (EXIT_FAILURE, "FATAL", message, ap); ++ lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); + } + ++static const char * ++nonnull (const char *s) ++{ ++ return s ? s : "(null)"; ++} ++ ++static const char * ++nonempty (const char *s) ++{ ++ return (s && !*s) ? "(empty)" : nonnull (s); ++} ++ + void + lt_setenv (const char *name, const char *value) + { +- LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", +- (name ? name : ""), +- (value ? value : ""))); ++ lt_debugprintf (__FILE__, __LINE__, ++ "(lt_setenv) setting '%s' to '%s'\n", ++ nonnull (name), nonnull (value)); + { + #ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); + #else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); +@@ -3899,105 +4896,22 @@ lt_extend_str (const char *orig_value, c + } + else + { + new_value = xstrdup (add); + } + return new_value; + } + +-int +-lt_split_name_value (const char *arg, char** name, char** value) +-{ +- const char *p; +- int len; +- if (!arg || !*arg) +- return 1; +- +- p = strchr (arg, (int)'='); +- +- if (!p) +- return 1; +- +- *value = xstrdup (++p); +- +- len = strlen (arg) - strlen (*value); +- *name = XMALLOC (char, len); +- strncpy (*name, arg, len-1); +- (*name)[len - 1] = '\0'; +- +- return 0; +-} +- +-void +-lt_opt_process_env_set (const char *arg) +-{ +- char *name = NULL; +- char *value = NULL; +- +- if (lt_split_name_value (arg, &name, &value) != 0) +- { +- XFREE (name); +- XFREE (value); +- lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); +- } +- +- lt_setenv (name, value); +- XFREE (name); +- XFREE (value); +-} +- +-void +-lt_opt_process_env_prepend (const char *arg) +-{ +- char *name = NULL; +- char *value = NULL; +- char *new_value = NULL; +- +- if (lt_split_name_value (arg, &name, &value) != 0) +- { +- XFREE (name); +- XFREE (value); +- lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); +- } +- +- new_value = lt_extend_str (getenv (name), value, 0); +- lt_setenv (name, new_value); +- XFREE (new_value); +- XFREE (name); +- XFREE (value); +-} +- +-void +-lt_opt_process_env_append (const char *arg) +-{ +- char *name = NULL; +- char *value = NULL; +- char *new_value = NULL; +- +- if (lt_split_name_value (arg, &name, &value) != 0) +- { +- XFREE (name); +- XFREE (value); +- lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); +- } +- +- new_value = lt_extend_str (getenv (name), value, 1); +- lt_setenv (name, new_value); +- XFREE (new_value); +- XFREE (name); +- XFREE (value); +-} +- + void + lt_update_exe_path (const char *name, const char *value) + { +- LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", +- (name ? name : ""), +- (value ? value : ""))); ++ lt_debugprintf (__FILE__, __LINE__, ++ "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", ++ nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { +@@ -4006,33 +4920,180 @@ lt_update_exe_path (const char *name, co + lt_setenv (name, new_value); + XFREE (new_value); + } + } + + void + lt_update_lib_path (const char *name, const char *value) + { +- LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", +- (name ? name : ""), +- (value ? value : ""))); ++ lt_debugprintf (__FILE__, __LINE__, ++ "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", ++ nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } + } + +- + EOF ++ case $host_os in ++ mingw*) ++ cat <<"EOF" ++ ++/* Prepares an argument vector before calling spawn(). ++ Note that spawn() does not by itself call the command interpreter ++ (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ++ ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); ++ GetVersionEx(&v); ++ v.dwPlatformId == VER_PLATFORM_WIN32_NT; ++ }) ? "cmd.exe" : "command.com"). ++ Instead it simply concatenates the arguments, separated by ' ', and calls ++ CreateProcess(). We must quote the arguments since Win32 CreateProcess() ++ interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a ++ special way: ++ - Space and tab are interpreted as delimiters. They are not treated as ++ delimiters if they are surrounded by double quotes: "...". ++ - Unescaped double quotes are removed from the input. Their only effect is ++ that within double quotes, space and tab are treated like normal ++ characters. ++ - Backslashes not followed by double quotes are not special. ++ - But 2*n+1 backslashes followed by a double quote become ++ n backslashes followed by a double quote (n >= 0): ++ \" -> " ++ \\\" -> \" ++ \\\\\" -> \\" ++ */ ++#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" ++#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" ++char ** ++prepare_spawn (char **argv) ++{ ++ size_t argc; ++ char **new_argv; ++ size_t i; ++ ++ /* Count number of arguments. */ ++ for (argc = 0; argv[argc] != NULL; argc++) ++ ; ++ ++ /* Allocate new argument vector. */ ++ new_argv = XMALLOC (char *, argc + 1); ++ ++ /* Put quoted arguments into the new argument vector. */ ++ for (i = 0; i < argc; i++) ++ { ++ const char *string = argv[i]; ++ ++ if (string[0] == '\0') ++ new_argv[i] = xstrdup ("\"\""); ++ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) ++ { ++ int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); ++ size_t length; ++ unsigned int backslashes; ++ const char *s; ++ char *quoted_string; ++ char *p; ++ ++ length = 0; ++ backslashes = 0; ++ if (quote_around) ++ length++; ++ for (s = string; *s != '\0'; s++) ++ { ++ char c = *s; ++ if (c == '"') ++ length += backslashes + 1; ++ length++; ++ if (c == '\\') ++ backslashes++; ++ else ++ backslashes = 0; ++ } ++ if (quote_around) ++ length += backslashes + 1; ++ ++ quoted_string = XMALLOC (char, length + 1); ++ ++ p = quoted_string; ++ backslashes = 0; ++ if (quote_around) ++ *p++ = '"'; ++ for (s = string; *s != '\0'; s++) ++ { ++ char c = *s; ++ if (c == '"') ++ { ++ unsigned int j; ++ for (j = backslashes + 1; j > 0; j--) ++ *p++ = '\\'; ++ } ++ *p++ = c; ++ if (c == '\\') ++ backslashes++; ++ else ++ backslashes = 0; ++ } ++ if (quote_around) ++ { ++ unsigned int j; ++ for (j = backslashes; j > 0; j--) ++ *p++ = '\\'; ++ *p++ = '"'; ++ } ++ *p = '\0'; ++ ++ new_argv[i] = quoted_string; ++ } ++ else ++ new_argv[i] = (char *) string; ++ } ++ new_argv[argc] = NULL; ++ ++ return new_argv; ++} ++EOF ++ ;; ++ esac ++ ++ cat <<"EOF" ++void lt_dump_script (FILE* f) ++{ ++EOF ++ func_emit_wrapper yes | ++ $SED -n -e ' ++s/^\(.\{79\}\)\(..*\)/\1\ ++\2/ ++h ++s/\([\\"]\)/\\\1/g ++s/$/\\n/ ++s/\([^\n]*\).*/ fputs ("\1", f);/p ++g ++D' ++ cat <<"EOF" ++} ++EOF + } + # end: func_emit_cwrapperexe_src + ++# func_win32_import_lib_p ARG ++# True if ARG is an import lib, as indicated by $file_magic_cmd ++func_win32_import_lib_p () ++{ ++ $opt_debug ++ case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in ++ *import*) : ;; ++ *) false ;; ++ esac ++} ++ + # func_mode_link arg... + func_mode_link () + { + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out +@@ -4067,16 +5128,17 @@ func_mode_link () + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no ++ bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= +@@ -4159,16 +5221,21 @@ func_mode_link () + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in ++ bindir) ++ bindir="$arg" ++ prev= ++ continue ++ ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in +@@ -4190,19 +5257,19 @@ func_mode_link () + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then +- dlfiles="$dlfiles $arg" ++ func_append dlfiles " $arg" + else +- dlprefiles="$dlprefiles $arg" ++ func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" +@@ -4216,17 +5283,17 @@ func_mode_link () + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; +- *) deplibs="$deplibs $qarg.ltframework" # this is fixed later ++ *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) +@@ -4235,17 +5302,17 @@ func_mode_link () + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +-# moreargs="$moreargs $fil" ++# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + +@@ -4264,29 +5331,29 @@ func_mode_link () + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then +- dlfiles="$dlfiles $pic_object" ++ func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. +- dlprefiles="$dlprefiles $pic_object" ++ func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + +@@ -4346,55 +5413,55 @@ func_mode_link () + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; +- *) rpath="$rpath $arg" ;; ++ *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; +- *) xrpath="$xrpath $arg" ;; ++ *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) +- weak_libs="$weak_libs $arg" ++ func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) +- linker_flags="$linker_flags $qarg" +- compiler_flags="$compiler_flags $qarg" ++ func_append linker_flags " $qarg" ++ func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) +- compiler_flags="$compiler_flags $qarg" ++ func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) +- linker_flags="$linker_flags $qarg" +- compiler_flags="$compiler_flags $wl$qarg" ++ func_append linker_flags " $qarg" ++ func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= +@@ -4420,16 +5487,21 @@ func_mode_link () + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + ++ -bindir) ++ prev=bindir ++ continue ++ ;; ++ + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue +@@ -4470,78 +5542,85 @@ func_mode_link () + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) +- func_stripname '-L' '' "$arg" +- dir=$func_stripname_result +- if test -z "$dir"; then ++ func_stripname "-L" '' "$arg" ++ if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi ++ func_resolve_sysroot "$func_stripname_result" ++ dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in +- *" -L$dir "*) ;; ++ *" -L$dir "* | *" $arg "*) ++ # Will only happen for absolute or sysroot arguments ++ ;; + *) +- deplibs="$deplibs -L$dir" +- lib_search_path="$lib_search_path $dir" ++ # Preserve sysroot, but never include relative directories ++ case $dir in ++ [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; ++ *) func_append deplibs " -L$dir" ;; ++ esac ++ func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) +- testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` ++ testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; +- *) dllsearchpath="$dllsearchpath:$dir";; ++ *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; +- *) dllsearchpath="$dllsearchpath:$testbindir";; ++ *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in +- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) ++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework +- deplibs="$deplibs System.ltframework" ++ func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work +@@ -4551,43 +5630,44 @@ func_mode_link () + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi +- deplibs="$deplibs $arg" ++ func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. +- -model|-arch|-isysroot) +- compiler_flags="$compiler_flags $arg" ++ -model|-arch|-isysroot|--sysroot) ++ func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + +- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) +- compiler_flags="$compiler_flags $arg" ++ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ ++ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) ++ func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; +- * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; ++ * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; +@@ -4644,23 +5724,27 @@ func_mode_link () + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; ++ =*) ++ func_stripname '=' '' "$dir" ++ dir=$lt_sysroot$func_stripname_result ++ ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; +- *) xrpath="$xrpath $dir" ;; ++ *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; +@@ -4703,35 +5787,35 @@ func_mode_link () + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" +- arg="$arg $wl$func_quote_for_eval_result" +- compiler_flags="$compiler_flags $func_quote_for_eval_result" ++ func_append arg " $func_quote_for_eval_result" ++ func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" +- arg="$arg $wl$func_quote_for_eval_result" +- compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" +- linker_flags="$linker_flags $func_quote_for_eval_result" ++ func_append arg " $wl$func_quote_for_eval_result" ++ func_append compiler_flags " $wl$func_quote_for_eval_result" ++ func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler +@@ -4749,45 +5833,49 @@ func_mode_link () + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + +- # -64, -mips[0-9] enable 64-bit mode on the SGI compiler +- # -r[0-9][0-9]* specifies the processor on the SGI compiler +- # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler +- # +DA*, +DD* enable 64-bit mode on the HP compiler +- # -q* pass through compiler args for the IBM compiler +- # -m*, -t[45]*, -txscale* pass through architecture-specific +- # compiler args for GCC +- # -F/path gives path to uninstalled frameworks, gcc on darwin +- # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC +- # @file GCC response files ++ # Flags to be passed through unchanged, with rationale: ++ # -64, -mips[0-9] enable 64-bit mode for the SGI compiler ++ # -r[0-9][0-9]* specify processor for the SGI compiler ++ # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler ++ # +DA*, +DD* enable 64-bit mode for the HP compiler ++ # -q* compiler args for the IBM compiler ++ # -m*, -t[45]*, -txscale* architecture-specific flags for GCC ++ # -F/path path to uninstalled frameworks, gcc on darwin ++ # -p, -pg, --coverage, -fprofile-* profiling flags for GCC ++ # @file GCC response files ++ # -tp=* Portland pgcc target processor selection ++ # --sysroot=* for sysroot support ++ # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ +- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) ++ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ ++ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" +- compiler_flags="$compiler_flags $arg" ++ func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. +- objs="$objs $arg" ++ func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= +@@ -4808,29 +5896,29 @@ func_mode_link () + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then +- dlfiles="$dlfiles $pic_object" ++ func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. +- dlprefiles="$dlprefiles $pic_object" ++ func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + +@@ -4865,34 +5953,35 @@ func_mode_link () + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. +- deplibs="$deplibs $arg" +- old_deplibs="$old_deplibs $arg" ++ func_append deplibs " $arg" ++ func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + ++ func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. +- dlfiles="$dlfiles $arg" ++ func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. +- dlprefiles="$dlprefiles $arg" ++ func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else +- deplibs="$deplibs $arg" ++ func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. +@@ -4920,25 +6009,27 @@ func_mode_link () + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var +- eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` ++ eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" ++ func_to_tool_file "$output_objdir/" ++ tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; +@@ -4949,37 +6040,37 @@ func_mode_link () + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do +- if $opt_duplicate_deps ; then ++ if $opt_preserve_dup_deps ; then + case "$libs " in +- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; ++ *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi +- libs="$libs $deplib" ++ func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in +- *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; ++ *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac +- pre_post_deps="$pre_post_deps $pre_post_dep" ++ func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= +@@ -5036,52 +6127,55 @@ func_mode_link () + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= ++ func_resolve_sysroot "$lib" + case $lib in +- *.la) func_source "$lib" ;; ++ *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do +- deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` ++ func_basename "$deplib" ++ deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; +- *) deplibs="$deplibs $deplib" ;; ++ *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in +- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) ++ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ ++ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else +- compiler_flags="$compiler_flags $deplib" ++ func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; +- * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; ++ * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" +@@ -5156,65 +6250,71 @@ func_mode_link () + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; +- * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; ++ * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" +- newlib_search_path="$newlib_search_path $func_stripname_result" ++ func_resolve_sysroot "$func_stripname_result" ++ func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" +- newlib_search_path="$newlib_search_path $func_stripname_result" ++ func_resolve_sysroot "$func_stripname_result" ++ func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" +- dir=$func_stripname_result ++ func_resolve_sysroot "$func_stripname_result" ++ dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; +- *) xrpath="$xrpath $dir" ;; ++ *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; +- *.la) lib="$deplib" ;; ++ *.la) ++ func_resolve_sysroot "$deplib" ++ lib=$func_resolve_sysroot_result ++ ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, +@@ -5222,35 +6322,35 @@ func_mode_link () + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` +- if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ ++ if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then +- $ECHO ++ echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." +- $ECHO "*** I have the capability to make that library automatically link in when" +- $ECHO "*** you link to this library. But I can only do this if you have a" +- $ECHO "*** shared version of the library, which you do not appear to have" +- $ECHO "*** because the file extensions .$libext of this argument makes me believe" +- $ECHO "*** that it is just a static archive that I should not use here." ++ echo "*** I have the capability to make that library automatically link in when" ++ echo "*** you link to this library. But I can only do this if you have a" ++ echo "*** shared version of the library, which you do not appear to have" ++ echo "*** because the file extensions .$libext of this argument makes me believe" ++ echo "*** that it is just a static archive that I should not use here." + else +- $ECHO ++ echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; +@@ -5267,21 +6367,21 @@ func_mode_link () + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. +- newdlprefiles="$newdlprefiles $deplib" ++ func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else +- newdlfiles="$newdlfiles $deplib" ++ func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; +@@ -5313,83 +6413,89 @@ func_mode_link () + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then +- tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` ++ tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; +- *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; ++ *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi +- dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ++ dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then +- test -n "$dlopen" && dlfiles="$dlfiles $dlopen" +- test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" ++ test -n "$dlopen" && func_append dlfiles " $dlopen" ++ test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. +- convenience="$convenience $ladir/$objdir/$old_library" +- old_convenience="$old_convenience $ladir/$objdir/$old_library" ++ func_append convenience " $ladir/$objdir/$old_library" ++ func_append old_convenience " $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" +- if $opt_duplicate_deps ; then ++ if $opt_preserve_dup_deps ; then + case "$tmp_libs " in +- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; ++ *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi +- tmp_libs="$tmp_libs $deplib" ++ func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= +- for l in $old_library $library_names; do +- linklib="$l" +- done ++ if test -n "$old_library" && ++ { test "$prefer_static_libs" = yes || ++ test "$prefer_static_libs,$installed" = "built,no"; }; then ++ linklib=$old_library ++ else ++ for l in $old_library $library_names; do ++ linklib="$l" ++ done ++ fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. +- dlprefiles="$dlprefiles $lib $dependency_libs" ++ func_append dlprefiles " $lib $dependency_libs" + else +- newdlfiles="$newdlfiles $lib" ++ func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) +@@ -5401,61 +6507,87 @@ func_mode_link () + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then +- if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then ++ if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else +- dir="$libdir" +- absdir="$libdir" ++ dir="$lt_sysroot$libdir" ++ absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later +- notinst_path="$notinst_path $abs_ladir" ++ func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later +- notinst_path="$notinst_path $abs_ladir" ++ func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi +- # Prefer using a static library (so that no silly _DYNAMIC symbols +- # are required to link). +- if test -n "$old_library"; then +- newdlprefiles="$newdlprefiles $dir/$old_library" +- # Keep a list of preopened convenience libraries to check +- # that they are being used correctly in the link pass. +- test -z "$libdir" && \ +- dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" +- # Otherwise, use the dlname, so that lt_dlopen finds it. +- elif test -n "$dlname"; then +- newdlprefiles="$newdlprefiles $dir/$dlname" +- else +- newdlprefiles="$newdlprefiles $dir/$linklib" +- fi ++ case "$host" in ++ # special handling for platforms with PE-DLLs. ++ *cygwin* | *mingw* | *cegcc* ) ++ # Linker will automatically link against shared library if both ++ # static and shared are present. Therefore, ensure we extract ++ # symbols from the import library if a shared library is present ++ # (otherwise, the dlopen module name will be incorrect). We do ++ # this by putting the import library name into $newdlprefiles. ++ # We recover the dlopen module name by 'saving' the la file ++ # name in a special purpose variable, and (later) extracting the ++ # dlname from the la file. ++ if test -n "$dlname"; then ++ func_tr_sh "$dir/$linklib" ++ eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" ++ func_append newdlprefiles " $dir/$linklib" ++ else ++ func_append newdlprefiles " $dir/$old_library" ++ # Keep a list of preopened convenience libraries to check ++ # that they are being used correctly in the link pass. ++ test -z "$libdir" && \ ++ func_append dlpreconveniencelibs " $dir/$old_library" ++ fi ++ ;; ++ * ) ++ # Prefer using a static library (so that no silly _DYNAMIC symbols ++ # are required to link). ++ if test -n "$old_library"; then ++ func_append newdlprefiles " $dir/$old_library" ++ # Keep a list of preopened convenience libraries to check ++ # that they are being used correctly in the link pass. ++ test -z "$libdir" && \ ++ func_append dlpreconveniencelibs " $dir/$old_library" ++ # Otherwise, use the dlname, so that lt_dlopen finds it. ++ elif test -n "$dlname"; then ++ func_append newdlprefiles " $dir/$dlname" ++ else ++ func_append newdlprefiles " $dir/$linklib" ++ fi ++ ;; ++ esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" +@@ -5463,82 +6595,83 @@ func_mode_link () + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then +- newlib_search_path="$newlib_search_path $ladir" ++ func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" +- newlib_search_path="$newlib_search_path $func_stripname_result" ++ func_resolve_sysroot "$func_stripname_result" ++ func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi +- if $opt_duplicate_deps ; then ++ if $opt_preserve_dup_deps ; then + case "$tmp_libs " in +- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; ++ *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi +- tmp_libs="$tmp_libs $deplib" ++ func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; +- *) temp_rpath="$temp_rpath$absdir:" ;; ++ *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; +- *) compile_rpath="$compile_rpath $absdir" ++ *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; +- *) finalize_rpath="$finalize_rpath $libdir" ++ *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && +@@ -5553,39 +6686,39 @@ func_mode_link () + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded +- notinst_deplibs="$notinst_deplibs $lib" ++ func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then +- notinst_deplibs="$notinst_deplibs $lib" ++ func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then +- $ECHO ++ echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && +@@ -5593,26 +6726,26 @@ func_mode_link () + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; +- *) compile_rpath="$compile_rpath $absdir" ++ *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; +- *) finalize_rpath="$finalize_rpath $libdir" ++ *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names +@@ -5656,17 +6789,17 @@ func_mode_link () + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + +- if test "$linkmode" = prog || test "$mode" != relink; then ++ if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" +@@ -5678,19 +6811,19 @@ func_mode_link () + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then +- $ECHO +- $ECHO "*** And there doesn't seem to be a static archive available" +- $ECHO "*** The link will probably fail, sorry" ++ echo ++ echo "*** And there doesn't seem to be a static archive available" ++ echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac +@@ -5707,22 +6840,22 @@ func_mode_link () + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then +- add_dir="-L$dir" ++ add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) +- add_dir="$add_dir -L$inst_prefix_dir$libdir" ++ func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else +@@ -5734,68 +6867,68 @@ func_mode_link () + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; +- *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; ++ *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; +- *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; ++ *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + +- if test "$linkmode" = prog || test "$mode" = relink; then ++ if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; +- *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; ++ *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) +- add_dir="$add_dir -L$inst_prefix_dir$libdir" ++ func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" +@@ -5820,31 +6953,31 @@ func_mode_link () + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. +- $ECHO ++ echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." +- $ECHO "*** I have the capability to make that library automatically link in when" +- $ECHO "*** you link to this library. But I can only do this if you have a" +- $ECHO "*** shared version of the library, which you do not appear to have." ++ echo "*** I have the capability to make that library automatically link in when" ++ echo "*** you link to this library. But I can only do this if you have a" ++ echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then +- $ECHO "*** But as you try to build a module library, libtool will still create " +- $ECHO "*** a static module, that should work as long as the dlopening application" +- $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." ++ echo "*** But as you try to build a module library, libtool will still create " ++ echo "*** a static module, that should work as long as the dlopening application" ++ echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then +- $ECHO +- $ECHO "*** However, this would only work if libtool was able to extract symbol" +- $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" +- $ECHO "*** not find such a program. So, this module is probably useless." +- $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." ++ echo ++ echo "*** However, this would only work if libtool was able to extract symbol" ++ echo "*** lists from a program, using \`nm' or equivalent, but libtool could" ++ echo "*** not find such a program. So, this module is probably useless." ++ echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi +@@ -5862,47 +6995,56 @@ func_mode_link () + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; +- *) xrpath="$xrpath $temp_xrpath";; ++ *) func_append xrpath " $temp_xrpath";; + esac;; +- *) temp_deplibs="$temp_deplibs $libdir";; ++ *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + +- newlib_search_path="$newlib_search_path $absdir" ++ func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" +- if $opt_duplicate_deps ; then ++ case $deplib in ++ -L*) func_stripname '-L' '' "$deplib" ++ func_resolve_sysroot "$func_stripname_result";; ++ *) func_resolve_sysroot "$deplib" ;; ++ esac ++ if $opt_preserve_dup_deps ; then + case "$tmp_libs " in +- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; ++ *" $func_resolve_sysroot_result "*) ++ func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi +- tmp_libs="$tmp_libs $deplib" ++ func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do ++ path= + case $deplib in + -L*) path="$deplib" ;; + *.la) ++ func_resolve_sysroot "$deplib" ++ deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." +- dir="$func_dirname_result" ++ dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" +@@ -5919,18 +7061,18 @@ func_mode_link () + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi +- compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" +- linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" ++ func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" ++ func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac +@@ -5953,34 +7095,34 @@ func_mode_link () + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else +- compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ++ compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; +- *) lib_search_path="$lib_search_path $dir" ;; ++ *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else +@@ -6028,36 +7170,36 @@ func_mode_link () + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; +- *) tmp_libs="$tmp_libs $deplib" ;; ++ *) func_append tmp_libs " $deplib" ;; + esac + ;; +- *) tmp_libs="$tmp_libs $deplib" ;; ++ *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then +- tmp_libs="$tmp_libs $i" ++ func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then +@@ -6088,17 +7230,17 @@ func_mode_link () + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" +- objs="$objs$old_deplibs" ++ func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result +@@ -6121,20 +7263,20 @@ func_mode_link () + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else +- $ECHO ++ echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" +- libobjs="$libobjs $objs" ++ func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift +@@ -6183,23 +7325,24 @@ func_mode_link () + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in ++ # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; +- freebsd-aout|freebsd-elf|sunos) ++ freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" +@@ -6299,17 +7442,17 @@ func_mode_link () + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + +- linux) ++ linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result +@@ -6322,17 +7465,17 @@ func_mode_link () + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. +- verstring="$verstring:${current}.0" ++ func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) +@@ -6390,120 +7533,121 @@ func_mode_link () + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" +- libobjs="$libobjs $symfileobj" ++ func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + +- if test "$mode" != relink; then ++ if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi +- removelist="$removelist $p" ++ func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then +- oldlibs="$oldlibs $output_objdir/$libname.$libext" ++ func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. +- oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` ++ oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do +- # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` +- # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` +- # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` ++ # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` ++ # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` ++ # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do +- temp_xrpath="$temp_xrpath -R$libdir" ++ func_replace_sysroot "$libdir" ++ func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; +- *) finalize_rpath="$finalize_rpath $libdir" ;; ++ *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; +- *) dlfiles="$dlfiles $lib" ;; ++ *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; +- *) dlprefiles="$dlprefiles $lib" ;; ++ *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in +- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) ++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework +- deplibs="$deplibs System.ltframework" ++ func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then +- deplibs="$deplibs -lc" ++ func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname +@@ -6542,42 +7686,42 @@ EOF + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) +- newdeplibs="$newdeplibs $i" ++ func_append newdeplibs " $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then +- newdeplibs="$newdeplibs $i" ++ func_append newdeplibs " $i" + else + droppeddeps=yes +- $ECHO ++ echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." +- $ECHO "*** I have the capability to make that library automatically link in when" +- $ECHO "*** you link to this library. But I can only do this if you have a" +- $ECHO "*** shared version of the library, which I believe you do not have" +- $ECHO "*** because a test_compile did reveal that the linker did not use it for" +- $ECHO "*** its dynamic dependency list that programs get resolved with at runtime." ++ echo "*** I have the capability to make that library automatically link in when" ++ echo "*** you link to this library. But I can only do this if you have a" ++ echo "*** shared version of the library, which I believe you do not have" ++ echo "*** because a test_compile did reveal that the linker did not use it for" ++ echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi + fi + ;; + *) +- newdeplibs="$newdeplibs $i" ++ func_append newdeplibs " $i" + ;; + esac + done + else + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + case $i in +@@ -6585,360 +7729,375 @@ EOF + func_stripname -l '' "$i" + name=$func_stripname_result + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $i; then + ldd_output=`ldd conftest` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) +- newdeplibs="$newdeplibs $i" ++ func_append newdeplibs " $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then +- newdeplibs="$newdeplibs $i" ++ func_append newdeplibs " $i" + else + droppeddeps=yes +- $ECHO ++ echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." +- $ECHO "*** I have the capability to make that library automatically link in when" +- $ECHO "*** you link to this library. But I can only do this if you have a" +- $ECHO "*** shared version of the library, which you do not appear to have" +- $ECHO "*** because a test_compile did reveal that the linker did not use this one" +- $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime." ++ echo "*** I have the capability to make that library automatically link in when" ++ echo "*** you link to this library. But I can only do this if you have a" ++ echo "*** shared version of the library, which you do not appear to have" ++ echo "*** because a test_compile did reveal that the linker did not use this one" ++ echo "*** as a dynamic dependency that programs can get resolved with at runtime." + fi + fi + else + droppeddeps=yes +- $ECHO ++ echo + $ECHO "*** Warning! Library $i is needed by this library but I was not able to" +- $ECHO "*** make it link in! You will probably need to install it or some" +- $ECHO "*** library that it depends on before this library will be fully" +- $ECHO "*** functional. Installing it before continuing would be even better." ++ echo "*** make it link in! You will probably need to install it or some" ++ echo "*** library that it depends on before this library will be fully" ++ echo "*** functional. Installing it before continuing would be even better." + fi + ;; + *) +- newdeplibs="$newdeplibs $i" ++ func_append newdeplibs " $i" + ;; + esac + done + fi + ;; + file_magic*) + set dummy $deplibs_check_method; shift + file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) +- newdeplibs="$newdeplibs $a_deplib" ++ func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` ++ if test -n "$file_magic_glob"; then ++ libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` ++ else ++ libnameglob=$libname ++ fi ++ test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do +- potential_libs=`ls $i/$libname[.-]* 2>/dev/null` ++ if test "$want_nocaseglob" = yes; then ++ shopt -s nocaseglob ++ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` ++ $nocaseglob ++ else ++ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` ++ fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; +- *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; ++ *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then +- newdeplibs="$newdeplibs $a_deplib" ++ func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes +- $ECHO ++ echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." +- $ECHO "*** I have the capability to make that library automatically link in when" +- $ECHO "*** you link to this library. But I can only do this if you have a" +- $ECHO "*** shared version of the library, which you do not appear to have" +- $ECHO "*** because I did check the linker path looking for a file starting" ++ echo "*** I have the capability to make that library automatically link in when" ++ echo "*** you link to this library. But I can only do this if you have a" ++ echo "*** shared version of the library, which you do not appear to have" ++ echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. +- newdeplibs="$newdeplibs $a_deplib" ++ func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) +- newdeplibs="$newdeplibs $a_deplib" ++ func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test +- if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ ++ if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then +- newdeplibs="$newdeplibs $a_deplib" ++ func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes +- $ECHO ++ echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." +- $ECHO "*** I have the capability to make that library automatically link in when" +- $ECHO "*** you link to this library. But I can only do this if you have a" +- $ECHO "*** shared version of the library, which you do not appear to have" +- $ECHO "*** because I did check the linker path looking for a file starting" ++ echo "*** I have the capability to make that library automatically link in when" ++ echo "*** you link to this library. But I can only do this if you have a" ++ echo "*** shared version of the library, which you do not appear to have" ++ echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. +- newdeplibs="$newdeplibs $a_deplib" ++ func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" +- tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ +- -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` ++ tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' +- tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` ++ tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi +- if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | +- $GREP . >/dev/null; then +- $ECHO ++ case $tmp_deplibs in ++ *[!\ \ ]*) ++ echo + if test "X$deplibs_check_method" = "Xnone"; then +- $ECHO "*** Warning: inter-library dependencies are not supported in this platform." ++ echo "*** Warning: inter-library dependencies are not supported in this platform." + else +- $ECHO "*** Warning: inter-library dependencies are not known to be supported." ++ echo "*** Warning: inter-library dependencies are not known to be supported." + fi +- $ECHO "*** All declared inter-library dependencies are being dropped." ++ echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes +- fi ++ ;; ++ esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework +- newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ++ newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then +- $ECHO +- $ECHO "*** Warning: libtool could not satisfy all declared inter-library" ++ echo ++ echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" +- $ECHO "*** a static module, that should work as long as the dlopening" +- $ECHO "*** application is linked with the -dlopen flag." ++ echo "*** a static module, that should work as long as the dlopening" ++ echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then +- $ECHO +- $ECHO "*** However, this would only work if libtool was able to extract symbol" +- $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" +- $ECHO "*** not find such a program. So, this module is probably useless." +- $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." ++ echo ++ echo "*** However, this would only work if libtool was able to extract symbol" ++ echo "*** lists from a program, using \`nm' or equivalent, but libtool could" ++ echo "*** not find such a program. So, this module is probably useless." ++ echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else +- $ECHO "*** The inter-library dependencies that have been dropped here will be" +- $ECHO "*** automatically added whenever a program is linked with this library" +- $ECHO "*** or is declared to -dlopen it." ++ echo "*** The inter-library dependencies that have been dropped here will be" ++ echo "*** automatically added whenever a program is linked with this library" ++ echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then +- $ECHO +- $ECHO "*** Since this library must not contain undefined symbols," +- $ECHO "*** because either the platform does not support them or" +- $ECHO "*** it was explicitly requested with -no-undefined," +- $ECHO "*** libtool will only create a static version of it." ++ echo ++ echo "*** Since this library must not contain undefined symbols," ++ echo "*** because either the platform does not support them or" ++ echo "*** it was explicitly requested with -no-undefined," ++ echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) +- newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` +- new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` +- deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ++ newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ++ new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ++ deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) +- new_libs="$new_libs -L$path/$objdir" ;; ++ func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; +- *) new_libs="$new_libs $deplib" ;; ++ *) func_append new_libs " $deplib" ;; + esac + ;; +- *) new_libs="$new_libs $deplib" ;; ++ *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then ++ # Remove ${wl} instances when linking with ld. ++ # FIXME: should test the right _cmds variable. ++ case $archive_cmds in ++ *\$LD\ *) wl= ;; ++ esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" +- test "$mode" != relink && rpath="$compile_rpath$rpath" ++ test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then ++ func_replace_sysroot "$libdir" ++ libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) +- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ++ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" +- dep_rpath="$dep_rpath $flag" ++ func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; +- *) perm_rpath="$perm_rpath $libdir" ;; ++ *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" +- if test -n "$hardcode_libdir_flag_spec_ld"; then +- eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" +- else +- eval dep_rpath=\"$hardcode_libdir_flag_spec\" +- fi ++ eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do +- rpath="$rpath$dir:" ++ func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" +- test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" ++ test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names +@@ -6954,28 +8113,28 @@ EOF + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do +- linknames="$linknames $link" ++ func_append linknames " $link" + done + + # Use standard objects if they are pic +- test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` ++ test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" +- delfiles="$delfiles $export_symbols" ++ func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then +@@ -6996,24 +8155,56 @@ EOF + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' +- for cmd in $cmds; do ++ for cmd1 in $cmds; do + IFS="$save_ifs" +- eval cmd=\"$cmd\" +- func_len " $cmd" +- len=$func_len_result +- if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then ++ # Take the normal branch if the nm_file_list_spec branch ++ # doesn't work or if tool conversion is not needed. ++ case $nm_file_list_spec~$to_tool_file_cmd in ++ *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) ++ try_normal_branch=yes ++ eval cmd=\"$cmd1\" ++ func_len " $cmd" ++ len=$func_len_result ++ ;; ++ *) ++ try_normal_branch=no ++ ;; ++ esac ++ if test "$try_normal_branch" = yes \ ++ && { test "$len" -lt "$max_cmd_len" \ ++ || test "$max_cmd_len" -le -1; } ++ then + func_show_eval "$cmd" 'exit $?' + skipped_export=false ++ elif test -n "$nm_file_list_spec"; then ++ func_basename "$output" ++ output_la=$func_basename_result ++ save_libobjs=$libobjs ++ save_output=$output ++ output=${output_objdir}/${output_la}.nm ++ func_to_tool_file "$output" ++ libobjs=$nm_file_list_spec$func_to_tool_file_result ++ func_append delfiles " $output" ++ func_verbose "creating $NM input file list: $output" ++ for obj in $save_libobjs; do ++ func_to_tool_file "$obj" ++ $ECHO "$func_to_tool_file_result" ++ done > "$output" ++ eval cmd=\"$cmd1\" ++ func_show_eval "$cmd" 'exit $?' ++ output=$save_output ++ libobjs=$save_libobjs ++ skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi +@@ -7024,39 +8215,39 @@ EOF + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" +- $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' ++ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter +- delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" ++ func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) +- tmp_deplibs="$tmp_deplibs $test_deplib" ++ func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && +@@ -7066,31 +8257,31 @@ EOF + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" +- generated="$generated $gentop" ++ func_append generated " $gentop" + + func_extract_archives $gentop $convenience +- libobjs="$libobjs $func_extract_archives_result" ++ func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" +- linker_flags="$linker_flags $flag" ++ func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking +- if test "$mode" = relink; then ++ if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds +@@ -7125,53 +8316,59 @@ EOF + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output +- output_la=`$ECHO "X$output" | $Xsed -e "$basename"` ++ func_basename "$output" ++ output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" +- $ECHO 'INPUT (' > $output ++ echo 'INPUT (' > $output + for obj in $save_libobjs + do +- $ECHO "$obj" >> $output ++ func_to_tool_file "$obj" ++ $ECHO "$func_to_tool_file_result" >> $output + done +- $ECHO ')' >> $output +- delfiles="$delfiles $output" ++ echo ')' >> $output ++ func_append delfiles " $output" ++ func_to_tool_file "$output" ++ output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do +- $ECHO "$obj" >> $output ++ func_to_tool_file "$obj" ++ $ECHO "$func_to_tool_file_result" >> $output + done +- delfiles="$delfiles $output" +- output=$firstobj\"$file_list_spec$output\" ++ func_append delfiles " $output" ++ func_to_tool_file "$output" ++ output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 +@@ -7185,41 +8382,44 @@ EOF + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. +- eval concat_cmds=\"$reload_cmds $objlist $last_robj\" ++ reload_objs=$objlist ++ eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. +- eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" ++ reload_objs="$objlist $last_robj" ++ eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext +- objlist=$obj ++ objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ +- eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" ++ reload_objs="$objlist $last_robj" ++ eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi +- delfiles="$delfiles $output" ++ func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" +@@ -7243,17 +8443,17 @@ EOF + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit +- if test "$mode" = relink; then ++ if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done +@@ -7264,29 +8464,29 @@ EOF + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" +- $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' ++ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter +- delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" ++ func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output +@@ -7317,48 +8517,48 @@ EOF + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" +- generated="$generated $gentop" ++ func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles +- libobjs="$libobjs $func_extract_archives_result" ++ func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit +- if test "$mode" = relink; then ++ if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit +- if test "$mode" = relink; then ++ if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + +@@ -7429,28 +8629,31 @@ EOF + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" +- reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` ++ reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" +- generated="$generated $gentop" ++ func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + ++ # If we're not building shared, we need to use non_pic_objs ++ test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" ++ + # Create the old-style object. +- reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test ++ reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' +@@ -7500,78 +8703,78 @@ EOF + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework +- compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` +- finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ++ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` ++ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) +- compile_command="$compile_command ${wl}-bind_at_load" +- finalize_command="$finalize_command ${wl}-bind_at_load" ++ func_append compile_command " ${wl}-bind_at_load" ++ func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" +- compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` +- finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ++ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ++ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) +- new_libs="$new_libs -L$path/$objdir" ;; ++ func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; +- *) new_libs="$new_libs $deplib" ;; ++ *) func_append new_libs " $deplib" ;; + esac + ;; +- *) new_libs="$new_libs $deplib" ;; ++ *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + +- compile_command="$compile_command $compile_deplibs" +- finalize_command="$finalize_command $finalize_deplibs" ++ func_append compile_command " $compile_deplibs" ++ func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; +- *) finalize_rpath="$finalize_rpath $libdir" ;; ++ *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do +@@ -7580,42 +8783,42 @@ EOF + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) +- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ++ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" +- rpath="$rpath $flag" ++ func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; +- *) perm_rpath="$perm_rpath $libdir" ;; ++ *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; +- *) dllsearchpath="$dllsearchpath:$libdir";; ++ *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; +- *) dllsearchpath="$dllsearchpath:$testbindir";; ++ *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" +@@ -7631,78 +8834,84 @@ EOF + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) +- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ++ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" +- rpath="$rpath $flag" ++ func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; +- *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; ++ *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. +- compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` +- finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` ++ compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` ++ finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in ++ *cegcc* | *mingw32ce*) ++ # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. ++ wrappers_required=no ++ ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; +- *cegcc) +- # Disable wrappers for cegcc, we are cross compiling anyway. +- wrappers_required=no +- ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. +- compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` ++ compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + ++ if test -n "$postlink_cmds"; then ++ func_to_tool_file "$output" ++ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` ++ func_execute_cmds "$postlink_cmds" 'exit $?' ++ fi ++ + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + +@@ -7715,72 +8924,85 @@ EOF + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do +- rpath="$rpath$dir:" ++ func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do +- rpath="$rpath$dir:" ++ func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. +- link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` ++ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' ++ ++ if test -n "$postlink_cmds"; then ++ func_to_tool_file "$output" ++ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` ++ func_execute_cmds "$postlink_cmds" 'exit $?' ++ fi ++ + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then +- relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` ++ relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. +- link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` ++ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + ++ if test -n "$postlink_cmds"; then ++ func_to_tool_file "$output_objdir/$outputname" ++ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` ++ func_execute_cmds "$postlink_cmds" 'exit $?' ++ fi ++ + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then +@@ -7788,28 +9010,17 @@ EOF + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" +- relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` +- fi +- +- # Quote $ECHO for shipping. +- if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then +- case $progpath in +- [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; +- *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; +- esac +- qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` +- else +- qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` ++ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" +@@ -7879,60 +9090,60 @@ EOF + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then +- oldobjs="$oldobjs $symfileobj" ++ func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" +- generated="$generated $gentop" ++ func_append generated " $gentop" + + func_extract_archives $gentop $addlibs +- oldobjs="$oldobjs $func_extract_archives_result" ++ func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" +- generated="$generated $gentop" ++ func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles +- oldobjs="$oldobjs $func_extract_archives_result" ++ func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else +- $ECHO "copying selected object files to avoid basename conflicts..." ++ echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" +- generated="$generated $gentop" ++ func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" +@@ -7946,28 +9157,40 @@ EOF + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" +- oldobjs="$oldobjs $gentop/$newobj" ++ func_append oldobjs " $gentop/$newobj" + ;; +- *) oldobjs="$oldobjs $obj" ;; ++ *) func_append oldobjs " $obj" ;; + esac + done + fi ++ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 ++ tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds ++ elif test -n "$archiver_list_spec"; then ++ func_verbose "using command file archive linking..." ++ for obj in $oldobjs ++ do ++ func_to_tool_file "$obj" ++ $ECHO "$func_to_tool_file_result" ++ done > $output_objdir/$libname.libcmd ++ func_to_tool_file "$output_objdir/$libname.libcmd" ++ oldobjs=" $archiver_list_spec$func_to_tool_file_result" ++ cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs +@@ -8031,17 +9254,17 @@ EOF + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" +- relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` ++ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then +@@ -8051,84 +9274,113 @@ EOF + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" +- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` ++ func_resolve_sysroot "$deplib" ++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" +- newdependency_libs="$newdependency_libs $libdir/$name" ++ func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; +- *) newdependency_libs="$newdependency_libs $deplib" ;; ++ -L*) ++ func_stripname -L '' "$deplib" ++ func_replace_sysroot "$func_stripname_result" ++ func_append newdependency_libs " -L$func_replace_sysroot_result" ++ ;; ++ -R*) ++ func_stripname -R '' "$deplib" ++ func_replace_sysroot "$func_stripname_result" ++ func_append newdependency_libs " -R$func_replace_sysroot_result" ++ ;; ++ *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" +- newdlfiles="$newdlfiles $libdir/$name" ++ func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; +- *) newdlfiles="$newdlfiles $lib" ;; ++ *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" +- newdlprefiles="$newdlprefiles $libdir/$name" ++ func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac +- newdlfiles="$newdlfiles $abs" ++ func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac +- newdlprefiles="$newdlprefiles $abs" ++ func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin ++ # In fact, it would be nice if we could use this code for all target ++ # systems that can't hard-code library paths into their executables ++ # and that have no shared library path variable independent of PATH, ++ # but it turns out we can't easily determine that from inspecting ++ # libtool variables, so we have to hard-code the OSs to which it ++ # applies here; at the moment, that means platforms that use the PE ++ # object format with DLL files. See the long comment at the top of ++ # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in +- *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; ++ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) ++ # If a -bindir argument was supplied, place the dll there. ++ if test "x$bindir" != x ; ++ then ++ func_relative_path "$install_libdir" "$bindir" ++ tdlname=$func_relative_path_result$dlname ++ else ++ # Otherwise fall back on heuristic. ++ tdlname=../bin/$dlname ++ fi ++ ;; + esac + $ECHO > $output "\ + # $outputname - a libtool library file + # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION + # + # Please DO NOT delete this file! + # It is necessary for linking the library. + +@@ -8177,17 +9429,17 @@ relink_command=\"$relink_command\"" + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS + } + +-{ test "$mode" = link || test "$mode" = relink; } && ++{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + + # func_mode_uninstall arg... + func_mode_uninstall () + { + $opt_debug + RM="$nonopt" +@@ -8197,45 +9449,44 @@ func_mode_uninstall () + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in +- -f) RM="$RM $arg"; rmforce=yes ;; +- -*) RM="$RM $arg" ;; +- *) files="$files $arg" ;; ++ -f) func_append RM " $arg"; rmforce=yes ;; ++ -*) func_append RM " $arg" ;; ++ *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + +- origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then +- objdir="$origobjdir" ++ odir="$objdir" + else +- objdir="$dir/$origobjdir" ++ odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" +- test "$mode" = uninstall && objdir="$dir" +- +- # Remember objdir for removal later, being careful to avoid duplicates +- if test "$mode" = clean; then ++ test "$opt_mode" = uninstall && odir="$dir" ++ ++ # Remember odir for removal later, being careful to avoid duplicates ++ if test "$opt_mode" = clean; then + case " $rmdirs " in +- *" $objdir "*) ;; +- *) rmdirs="$rmdirs $objdir" ;; ++ *" $odir "*) ;; ++ *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : +@@ -8251,28 +9502,27 @@ func_mode_uninstall () + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do +- rmfiles="$rmfiles $objdir/$n" ++ func_append rmfiles " $odir/$n" + done +- test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" +- +- case "$mode" in ++ test -n "$old_library" && func_append rmfiles " $odir/$old_library" ++ ++ case "$opt_mode" in + clean) +- case " $library_names " in +- # " " in the beginning catches empty $dlname ++ case " $library_names " in + *" $dlname "*) ;; +- *) rmfiles="$rmfiles $objdir/$dlname" ;; ++ *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac +- test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ++ test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then +@@ -8290,90 +9540,89 @@ func_mode_uninstall () + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then +- rmfiles="$rmfiles $dir/$pic_object" ++ func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then +- rmfiles="$rmfiles $dir/$non_pic_object" ++ func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) +- if test "$mode" = clean ; then ++ if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe +- rmfiles="$rmfiles $file" ++ func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result +- rmfiles="$rmfiles $func_ltwrapper_scriptname_result" ++ func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles +- rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" ++ func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then +- rmfiles="$rmfiles $objdir/lt-$name" ++ func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then +- rmfiles="$rmfiles $objdir/lt-${noexename}.c" ++ func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done +- objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status + } + +-{ test "$mode" = uninstall || test "$mode" = clean; } && ++{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +-test -z "$mode" && { ++test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" + } + + test -z "$exec_cmd" && \ +- func_fatal_help "invalid operation mode \`$mode'" ++ func_fatal_help "invalid operation mode \`$opt_mode'" + + if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE + fi + + exit $exit_status + +diff --git a/js/src/ctypes/libffi/m4/asmcfi.m4 b/js/src/ctypes/libffi/m4/asmcfi.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/asmcfi.m4 +@@ -0,0 +1,13 @@ ++AC_DEFUN([GCC_AS_CFI_PSEUDO_OP], ++[AC_CACHE_CHECK([assembler .cfi pseudo-op support], ++ gcc_cv_as_cfi_pseudo_op, [ ++ gcc_cv_as_cfi_pseudo_op=unknown ++ AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],, ++ [gcc_cv_as_cfi_pseudo_op=yes], ++ [gcc_cv_as_cfi_pseudo_op=no]) ++ ]) ++ if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then ++ AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1, ++ [Define if your assembler supports .cfi_* directives.]) ++ fi ++]) +diff --git a/js/src/ctypes/libffi/m4/ax_append_flag.m4 b/js/src/ctypes/libffi/m4/ax_append_flag.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_append_flag.m4 +@@ -0,0 +1,69 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) ++# ++# DESCRIPTION ++# ++# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space ++# added in between. ++# ++# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. ++# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains ++# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly ++# FLAG. ++# ++# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. ++# ++# LICENSE ++# ++# Copyright (c) 2008 Guido U. Draheim ++# Copyright (c) 2011 Maarten Bosmans ++# ++# This program is free software: you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation, either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 2 ++ ++AC_DEFUN([AX_APPEND_FLAG], ++[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX ++AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl ++AS_VAR_SET_IF(FLAGS, ++ [case " AS_VAR_GET(FLAGS) " in ++ *" $1 "*) ++ AC_RUN_LOG([: FLAGS already contains $1]) ++ ;; ++ *) ++ AC_RUN_LOG([: FLAGS="$FLAGS $1"]) ++ AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) ++ ;; ++ esac], ++ [AS_VAR_SET(FLAGS,["$1"])]) ++AS_VAR_POPDEF([FLAGS])dnl ++])dnl AX_APPEND_FLAG +diff --git a/js/src/ctypes/libffi/m4/ax_cc_maxopt.m4 b/js/src/ctypes/libffi/m4/ax_cc_maxopt.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_cc_maxopt.m4 +@@ -0,0 +1,181 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_CC_MAXOPT ++# ++# DESCRIPTION ++# ++# Try to turn on "good" C optimization flags for various compilers and ++# architectures, for some definition of "good". (In our case, good for ++# FFTW and hopefully for other scientific codes. Modify as needed.) ++# ++# The user can override the flags by setting the CFLAGS environment ++# variable. The user can also specify --enable-portable-binary in order to ++# disable any optimization flags that might result in a binary that only ++# runs on the host architecture. ++# ++# Note also that the flags assume that ANSI C aliasing rules are followed ++# by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point ++# computations can be re-ordered as needed. ++# ++# Requires macros: AX_CHECK_COMPILE_FLAG, AX_COMPILER_VENDOR, ++# AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID. ++# ++# LICENSE ++# ++# Copyright (c) 2008 Steven G. Johnson ++# Copyright (c) 2008 Matteo Frigo ++# ++# This program is free software: you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation, either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 13 ++ ++AC_DEFUN([AX_CC_MAXOPT], ++[ ++AC_REQUIRE([AC_PROG_CC]) ++AC_REQUIRE([AX_COMPILER_VENDOR]) ++AC_REQUIRE([AC_CANONICAL_HOST]) ++ ++AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])], ++ acx_maxopt_portable=$enableval, acx_maxopt_portable=no) ++ ++# Try to determine "good" native compiler flags if none specified via CFLAGS ++if test "$ac_test_CFLAGS" != "set"; then ++ CFLAGS="" ++ case $ax_cv_c_compiler_vendor in ++ dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" ++ if test "x$acx_maxopt_portable" = xno; then ++ CFLAGS="$CFLAGS -arch host" ++ fi;; ++ ++ sun) CFLAGS="-native -fast -xO5 -dalign" ++ if test "x$acx_maxopt_portable" = xyes; then ++ CFLAGS="$CFLAGS -xarch=generic" ++ fi;; ++ ++ hp) CFLAGS="+Oall +Optrs_ansi +DSnative" ++ if test "x$acx_maxopt_portable" = xyes; then ++ CFLAGS="$CFLAGS +DAportable" ++ fi;; ++ ++ ibm) if test "x$acx_maxopt_portable" = xno; then ++ xlc_opt="-qarch=auto -qtune=auto" ++ else ++ xlc_opt="-qtune=auto" ++ fi ++ AX_CHECK_COMPILE_FLAG($xlc_opt, ++ CFLAGS="-O3 -qansialias -w $xlc_opt", ++ [CFLAGS="-O3 -qansialias -w" ++ echo "******************************************************" ++ echo "* You seem to have the IBM C compiler. It is *" ++ echo "* recommended for best performance that you use: *" ++ echo "* *" ++ echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" ++ echo "* ^^^ ^^^ *" ++ echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" ++ echo "* CPU you have. (Set the CFLAGS environment var. *" ++ echo "* and re-run configure.) For more info, man cc. *" ++ echo "******************************************************"]) ++ ;; ++ ++ intel) CFLAGS="-O3 -ansi_alias" ++ if test "x$acx_maxopt_portable" = xno; then ++ icc_archflag=unknown ++ icc_flags="" ++ case $host_cpu in ++ i686*|x86_64*) ++ # icc accepts gcc assembly syntax, so these should work: ++ AX_GCC_X86_CPUID(0) ++ AX_GCC_X86_CPUID(1) ++ case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG ++ *:756e6547:*:*) # Intel ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";; ++ *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";; ++ *f??:*:*:*) icc_flags="-xN -xW -xK";; ++ esac ;; ++ esac ;; ++ esac ++ if test "x$icc_flags" != x; then ++ for flag in $icc_flags; do ++ AX_CHECK_COMPILE_FLAG($flag, [icc_archflag=$flag; break]) ++ done ++ fi ++ AC_MSG_CHECKING([for icc architecture flag]) ++ AC_MSG_RESULT($icc_archflag) ++ if test "x$icc_archflag" != xunknown; then ++ CFLAGS="$CFLAGS $icc_archflag" ++ fi ++ fi ++ ;; ++ ++ gnu) ++ # default optimization flags for gcc on all systems ++ CFLAGS="-O3 -fomit-frame-pointer" ++ ++ # -malign-double for x86 systems ++ # LIBFFI -- DON'T DO THIS - CHANGES ABI ++ # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") ++ ++ # -fstrict-aliasing for gcc-2.95+ ++ AX_CHECK_COMPILE_FLAG(-fstrict-aliasing, ++ CFLAGS="$CFLAGS -fstrict-aliasing") ++ ++ # note that we enable "unsafe" fp optimization with other compilers, too ++ AX_CHECK_COMPILE_FLAG(-ffast-math, CFLAGS="$CFLAGS -ffast-math") ++ ++ AX_GCC_ARCHFLAG($acx_maxopt_portable) ++ ;; ++ esac ++ ++ if test -z "$CFLAGS"; then ++ echo "" ++ echo "********************************************************" ++ echo "* WARNING: Don't know the best CFLAGS for this system *" ++ echo "* Use ./configure CFLAGS=... to specify your own flags *" ++ echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" ++ echo "********************************************************" ++ echo "" ++ CFLAGS="-O3" ++ fi ++ ++ AX_CHECK_COMPILE_FLAG($CFLAGS, [], [ ++ echo "" ++ echo "********************************************************" ++ echo "* WARNING: The guessed CFLAGS don't seem to work with *" ++ echo "* your compiler. *" ++ echo "* Use ./configure CFLAGS=... to specify your own flags *" ++ echo "********************************************************" ++ echo "" ++ CFLAGS="" ++ ]) ++ ++fi ++]) +diff --git a/js/src/ctypes/libffi/m4/ax_cflags_warn_all.m4 b/js/src/ctypes/libffi/m4/ax_cflags_warn_all.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_cflags_warn_all.m4 +@@ -0,0 +1,122 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] ++# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] ++# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] ++# ++# DESCRIPTION ++# ++# Try to find a compiler option that enables most reasonable warnings. ++# ++# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result ++# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. ++# ++# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, ++# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and ++# Intel compilers. For a given compiler, the Fortran flags are much more ++# experimental than their C equivalents. ++# ++# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS ++# - $2 add-value-if-not-found : nothing ++# - $3 action-if-found : add value to shellvariable ++# - $4 action-if-not-found : nothing ++# ++# NOTE: These macros depend on AX_APPEND_FLAG. ++# ++# LICENSE ++# ++# Copyright (c) 2008 Guido U. Draheim ++# Copyright (c) 2010 Rhys Ulerich ++# ++# This program is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation; either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 14 ++ ++AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl ++AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl ++AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl ++AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], ++VAR,[VAR="no, unknown" ++ac_save_[]FLAGS="$[]FLAGS" ++for ac_arg dnl ++in "-warn all % -warn all" dnl Intel ++ "-pedantic % -Wall" dnl GCC ++ "-xstrconst % -v" dnl Solaris C ++ "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix ++ "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX ++ "-ansi -ansiE % -fullwarn" dnl IRIX ++ "+ESlit % +w1" dnl HP-UX C ++ "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) ++ "-h conform % -h msglevel 2" dnl Cray C (Unicos) ++ # ++do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` ++ AC_COMPILE_IFELSE([AC_LANG_PROGRAM], ++ [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) ++done ++FLAGS="$ac_save_[]FLAGS" ++]) ++AS_VAR_POPDEF([FLAGS])dnl ++AC_REQUIRE([AX_APPEND_FLAG]) ++case ".$VAR" in ++ .ok|.ok,*) m4_ifvaln($3,$3) ;; ++ .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; ++ *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; ++esac ++AS_VAR_POPDEF([VAR])dnl ++])dnl AX_FLAGS_WARN_ALL ++dnl implementation tactics: ++dnl the for-argument contains a list of options. The first part of ++dnl these does only exist to detect the compiler - usually it is ++dnl a global option to enable -ansi or -extrawarnings. All other ++dnl compilers will fail about it. That was needed since a lot of ++dnl compilers will give false positives for some option-syntax ++dnl like -Woption or -Xoption as they think of it is a pass-through ++dnl to later compile stages or something. The "%" is used as a ++dnl delimiter. A non-option comment can be given after "%%" marks ++dnl which will be shown but not added to the respective C/CXXFLAGS. ++ ++AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl ++AC_LANG_PUSH([C]) ++AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) ++AC_LANG_POP([C]) ++]) ++ ++AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl ++AC_LANG_PUSH([C++]) ++AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) ++AC_LANG_POP([C++]) ++]) ++ ++AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl ++AC_LANG_PUSH([Fortran]) ++AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) ++AC_LANG_POP([Fortran]) ++]) +diff --git a/js/src/ctypes/libffi/m4/ax_check_compile_flag.m4 b/js/src/ctypes/libffi/m4/ax_check_compile_flag.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_check_compile_flag.m4 +@@ -0,0 +1,72 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) ++# ++# DESCRIPTION ++# ++# Check whether the given FLAG works with the current language's compiler ++# or gives an error. (Warnings, however, are ignored) ++# ++# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on ++# success/failure. ++# ++# If EXTRA-FLAGS is defined, it is added to the current language's default ++# flags (e.g. CFLAGS) when the check is done. The check is thus made with ++# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to ++# force the compiler to issue an error when a bad flag is given. ++# ++# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this ++# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. ++# ++# LICENSE ++# ++# Copyright (c) 2008 Guido U. Draheim ++# Copyright (c) 2011 Maarten Bosmans ++# ++# This program is free software: you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation, either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 2 ++ ++AC_DEFUN([AX_CHECK_COMPILE_FLAG], ++[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX ++AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl ++AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ++ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS ++ _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" ++ AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], ++ [AS_VAR_SET(CACHEVAR,[yes])], ++ [AS_VAR_SET(CACHEVAR,[no])]) ++ _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) ++AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], ++ [m4_default([$2], :)], ++ [m4_default([$3], :)]) ++AS_VAR_POPDEF([CACHEVAR])dnl ++])dnl AX_CHECK_COMPILE_FLAGS +diff --git a/js/src/ctypes/libffi/m4/ax_compiler_vendor.m4 b/js/src/ctypes/libffi/m4/ax_compiler_vendor.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_compiler_vendor.m4 +@@ -0,0 +1,84 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_COMPILER_VENDOR ++# ++# DESCRIPTION ++# ++# Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, ++# hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, ++# watcom, etc. The vendor is returned in the cache variable ++# $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. ++# ++# LICENSE ++# ++# Copyright (c) 2008 Steven G. Johnson ++# Copyright (c) 2008 Matteo Frigo ++# ++# This program is free software: you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation, either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 11 ++ ++AC_DEFUN([AX_COMPILER_VENDOR], ++[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, ++ [# note: don't check for gcc first since some other compilers define __GNUC__ ++ vendors="intel: __ICC,__ECC,__INTEL_COMPILER ++ ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ ++ pathscale: __PATHCC__,__PATHSCALE__ ++ clang: __clang__ ++ gnu: __GNUC__ ++ sun: __SUNPRO_C,__SUNPRO_CC ++ hp: __HP_cc,__HP_aCC ++ dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER ++ borland: __BORLANDC__,__TURBOC__ ++ comeau: __COMO__ ++ cray: _CRAYC ++ kai: __KCC ++ lcc: __LCC__ ++ sgi: __sgi,sgi ++ microsoft: _MSC_VER ++ metrowerks: __MWERKS__ ++ watcom: __WATCOMC__ ++ portland: __PGI ++ unknown: UNKNOWN" ++ for ventest in $vendors; do ++ case $ventest in ++ *:) vendor=$ventest; continue ;; ++ *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; ++ esac ++ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ ++ #if !($vencpp) ++ thisisanerror; ++ #endif ++ ])], [break]) ++ done ++ ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` ++ ]) ++]) +diff --git a/js/src/ctypes/libffi/m4/ax_configure_args.m4 b/js/src/ctypes/libffi/m4/ax_configure_args.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_configure_args.m4 +@@ -0,0 +1,70 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_configure_args.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_CONFIGURE_ARGS ++# ++# DESCRIPTION ++# ++# Helper macro for AX_ENABLE_BUILDDIR. ++# ++# The traditional way of starting a subdir-configure is running the script ++# with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have ++# to rely on eval'ing $ac_configure_args however some old autoconf ++# versions do not provide that. To ensure maximum portability of autoconf ++# extension macros this helper can be AC_REQUIRE'd so that ++# $ac_configure_args will alsways be present. ++# ++# Sadly, the traditional "exec $SHELL" of the enable_builddir macros is ++# spoiled now and must be replaced by "eval + exit $?". ++# ++# Example: ++# ++# AC_DEFUN([AX_ENABLE_SUBDIR],[dnl ++# AC_REQUIRE([AX_CONFIGURE_ARGS])dnl ++# eval $SHELL $ac_configure_args || exit $? ++# ...]) ++# ++# LICENSE ++# ++# Copyright (c) 2008 Guido U. Draheim ++# ++# This program is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation; either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 9 ++ ++AC_DEFUN([AX_CONFIGURE_ARGS],[ ++ # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args ++ if test "${ac_configure_args+set}" != "set" ; then ++ ac_configure_args= ++ for ac_arg in ${1+"[$]@"}; do ++ ac_configure_args="$ac_configure_args '$ac_arg'" ++ done ++ fi ++]) +diff --git a/js/src/ctypes/libffi/m4/ax_enable_builddir.m4 b/js/src/ctypes/libffi/m4/ax_enable_builddir.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_enable_builddir.m4 +@@ -0,0 +1,300 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])] ++# ++# DESCRIPTION ++# ++# If the current configure was run within the srcdir then we move all ++# configure-files into a subdir and let the configure steps continue ++# there. We provide an option --disable-builddir to suppress the move into ++# a separate builddir. ++# ++# Defaults: ++# ++# $1 = $host (overridden with $HOST) ++# $2 = Makefile.mk ++# $3 = -all ++# ++# This macro must be called before AM_INIT_AUTOMAKE. It creates a default ++# toplevel srcdir Makefile from the information found in the created ++# toplevel builddir Makefile. It just copies the variables and ++# rule-targets, each extended with a default rule-execution that recurses ++# into the build directory of the current "HOST". You can override the ++# auto-dection through `config.guess` and build-time of course, as in ++# ++# make HOST=i386-mingw-cross ++# ++# which can of course set at configure time as well using ++# ++# configure --host=i386-mingw-cross ++# ++# After the default has been created, additional rules can be appended ++# that will not just recurse into the subdirectories and only ever exist ++# in the srcdir toplevel makefile - these parts are read from the $2 = ++# Makefile.mk file ++# ++# The automatic rules are usually scanning the toplevel Makefile for lines ++# like '#### $host |$builddir' to recognize the place where to recurse ++# into. Usually, the last one is the only one used. However, almost all ++# targets have an additional "*-all" rule which makes the script to ++# recurse into _all_ variants of the current HOST (!!) setting. The "-all" ++# suffix can be overriden for the macro as well. ++# ++# a special rule is only given for things like "dist" that will copy the ++# tarball from the builddir to the sourcedir (or $(PUB)) for reason of ++# convenience. ++# ++# LICENSE ++# ++# Copyright (c) 2009 Guido U. Draheim ++# Copyright (c) 2009 Alan Jenkins ++# ++# This program is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation; either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 23 ++ ++AC_DEFUN([AX_ENABLE_BUILDDIR],[ ++AC_REQUIRE([AC_CANONICAL_HOST])[]dnl ++AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl ++AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl ++AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl ++AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl ++AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl ++AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl ++SUB="." ++AC_ARG_ENABLE([builddir], AS_HELP_STRING( ++ [--disable-builddir],[disable automatic build in subdir of sources]) ++ ,[SUB="$enableval"], [SUB="auto"]) ++if test ".$ac_srcdir_defaulted" != ".no" ; then ++if test ".$srcdir" = ".." ; then ++ if test -f config.status ; then ++ AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build) ++ else ++ test ".$SUB" = "." && SUB="." ++ test ".$SUB" = ".no" && SUB="." ++ test ".$TARGET" = "." && TARGET="$target" ++ test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])" ++ if test ".$SUB" != ".." ; then # we know where to go and ++ AS_MKDIR_P([$SUB]) ++ echo __.$SUB.__ > $SUB/conftest.tmp ++ cd $SUB ++ if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then ++ rm conftest.tmp ++ AC_MSG_RESULT([continue configure in default builddir "./$SUB"]) ++ else ++ AC_MSG_ERROR([could not change to default builddir "./$SUB"]) ++ fi ++ srcdir=`echo "$SUB" | ++ sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'` ++ # going to restart from subdirectory location ++ test -f $srcdir/config.log && mv $srcdir/config.log . ++ test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . ++ test -f $srcdir/conftest.log && mv $srcdir/conftest.log . ++ test -f $srcdir/$cache_file && mv $srcdir/$cache_file . ++ AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"}) ++ case "[$]0" in # restart ++ [/\\]*) eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; ++ *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; ++ esac ; exit $? ++ fi ++ fi ++fi fi ++test ".$SUB" = ".auto" && SUB="." ++dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec" ++AC_PATH_PROG(SED,gsed sed, sed) ++AUX="$am_aux_dir" ++AS_VAR_POPDEF([SED])dnl ++AS_VAR_POPDEF([AUX])dnl ++AS_VAR_POPDEF([SUB])dnl ++AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status .............. ++AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl ++AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl ++AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl ++AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl ++AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl ++pushdef([END],[Makefile.mk])dnl ++pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl ++ SRC="$ax_enable_builddir_srcdir" ++ if test ".$SUB" = ".." ; then ++ if test -f "$TOP/Makefile" ; then ++ AC_MSG_NOTICE([skipping TOP/Makefile - left untouched]) ++ else ++ AC_MSG_NOTICE([skipping TOP/Makefile - not created]) ++ fi ++ else ++ if test -f "$SRC/Makefile" ; then ++ a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile` ++ test "$a" != "$b" && rm "$SRC/Makefile" ++ fi ++ if test -f "$SRC/Makefile" ; then ++ echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk ++ echo " []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk ++ eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" ++ if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null ++ then rm $SRC/Makefile ; fi ++ cp $tmp/conftemp.mk $SRC/makefiles.mk~ ## DEBUGGING ++ fi ++ if test ! -f "$SRC/Makefile" ; then ++ AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile]) ++ x='`' ; cat >$tmp/conftemp.sed <<_EOF ++/^\$/n ++x ++/^\$/bS ++x ++/\\\\\$/{H;d;} ++{H;s/.*//;x;} ++bM ++:S ++x ++/\\\\\$/{h;d;} ++{h;s/.*//;x;} ++:M ++s/\\(\\n\\) /\\1 /g ++/^ /d ++/^[[ ]]*[[\\#]]/d ++/^VPATH *=/d ++s/^srcdir *=.*/srcdir = ./ ++s/^top_srcdir *=.*/top_srcdir = ./ ++/[[:=]]/!d ++/^\\./d ++dnl Now handle rules (i.e. lines containing ":" but not " = "). ++/ = /b ++/ .= /b ++/:/!b ++s/:.*/:/ ++s/ / /g ++s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g ++s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/ ++s/ / /g ++/^all all[]_ALL[[ :]]/i\\ ++all-configured : all[]_ALL ++dnl dist-all exists... and would make for dist-all-all ++s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g ++/[]_ALL[]_ALL/d ++a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ ++ ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ ++ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ++ ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ ++ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done ++dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree) ++/dist[]_ALL *:/a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ ++ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ++ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ++ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ ++ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done ++dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree) ++/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ ++ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ++ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ++ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ ++ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done ++dnl special rule add-on: "distclean" removes all local builddirs completely ++/distclean[]_ALL *:/a\\ ++ @ HOST="\$(HOST)\" \\\\\\ ++ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ ++ ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ ++ ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ++ ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ ++ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ++ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ ++ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ++ ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ ++ ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ ++ ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile ++_EOF ++ cp "$tmp/conftemp.sed" "$SRC/makefile.sed~" ## DEBUGGING ++ $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile ++ if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then ++ AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])]) ++ cat $SRC/END >>$SRC/Makefile ++ fi ; xxxx="####" ++ echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile ++ # sanity check ++ if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then ++ AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts]) ++ $SED -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $SRC/Makefile \ ++ >$SRC/Makefile~ ++ (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null ++ fi ++ else ++ xxxx="\\#\\#\\#\\#" ++ # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed ++ echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed ++ $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp ++ cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~" ## DEBUGGING ++ cp "$tmp/mkfile.tmp" "$SRC/makefiles.out~" ## DEBUGGING ++ if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then ++ AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure]) ++ rm "$tmp/mkfile.tmp" ++ else ++ AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure]) ++ mv "$tmp/mkfile.tmp" "$SRC/Makefile" ++ fi ++ fi ++ AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)]) ++ xxxx="####" ++ echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile ++ fi ++popdef([END])dnl ++AS_VAR_POPDEF([SED])dnl ++AS_VAR_POPDEF([AUX])dnl ++AS_VAR_POPDEF([SRC])dnl ++AS_VAR_POPDEF([TOP])dnl ++AS_VAR_POPDEF([SUB])dnl ++],[dnl ++ax_enable_builddir_srcdir="$srcdir" # $srcdir ++ax_enable_builddir_host="$HOST" # $HOST / $host ++ax_enable_builddir_version="$VERSION" # $VERSION ++ax_enable_builddir_package="$PACKAGE" # $PACKAGE ++ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX ++ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED ++ax_enable_builddir="$ax_enable_builddir" # $SUB ++])dnl ++]) +diff --git a/js/src/ctypes/libffi/m4/ax_gcc_archflag.m4 b/js/src/ctypes/libffi/m4/ax_gcc_archflag.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_gcc_archflag.m4 +@@ -0,0 +1,225 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE]) ++# ++# DESCRIPTION ++# ++# This macro tries to guess the "native" arch corresponding to the target ++# architecture for use with gcc's -march=arch or -mtune=arch flags. If ++# found, the cache variable $ax_cv_gcc_archflag is set to this flag and ++# ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is set to ++# "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is ++# to add $ax_cv_gcc_archflag to the end of $CFLAGS. ++# ++# PORTABLE? should be either [yes] (default) or [no]. In the former case, ++# the flag is set to -mtune (or equivalent) so that the architecture is ++# only used for tuning, but the instruction set used is still portable. In ++# the latter case, the flag is set to -march (or equivalent) so that ++# architecture-specific instructions are enabled. ++# ++# The user can specify --with-gcc-arch= in order to override the ++# macro's choice of architecture, or --without-gcc-arch to disable this. ++# ++# When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is ++# called unless the user specified --with-gcc-arch manually. ++# ++# Requires macros: AX_CHECK_COMPILE_FLAG, AX_GCC_X86_CPUID ++# ++# (The main emphasis here is on recent CPUs, on the principle that doing ++# high-performance computing on old hardware is uncommon.) ++# ++# LICENSE ++# ++# Copyright (c) 2008 Steven G. Johnson ++# Copyright (c) 2008 Matteo Frigo ++# Copyright (c) 2012 Tsukasa Oi ++# ++# This program is free software: you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation, either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 11 ++ ++AC_DEFUN([AX_GCC_ARCHFLAG], ++[AC_REQUIRE([AC_PROG_CC]) ++AC_REQUIRE([AC_CANONICAL_HOST]) ++ ++AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=], [use architecture for gcc -march/-mtune, instead of guessing])], ++ ax_gcc_arch=$withval, ax_gcc_arch=yes) ++ ++AC_MSG_CHECKING([for gcc architecture flag]) ++AC_MSG_RESULT([]) ++AC_CACHE_VAL(ax_cv_gcc_archflag, ++[ ++ax_cv_gcc_archflag="unknown" ++ ++if test "$GCC" = yes; then ++ ++if test "x$ax_gcc_arch" = xyes; then ++ax_gcc_arch="" ++if test "$cross_compiling" = no; then ++case $host_cpu in ++ i[[3456]]86*|x86_64*) # use cpuid codes ++ AX_GCC_X86_CPUID(0) ++ AX_GCC_X86_CPUID(1) ++ case $ax_cv_gcc_x86_cpuid_0 in ++ *:756e6547:*:*) # Intel ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; ++ *5??:*:*:*) ax_gcc_arch=pentium ;; ++ *0?6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; ++ *0?6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; ++ *0?6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; ++ *0?6[[9de]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; ++ *0?6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; ++ *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; ++ *1?6[[7d]]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; ++ *1?6[[aef]]?:*:*:*|*2?6[[5cef]]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;; ++ *1?6c?:*:*:*|*[[23]]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;; ++ *2?6[[ad]]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; ++ *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;; ++ *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; ++ ?000?f3[[347]]:*:*:*|?000?f4[1347]:*:*:*|?000?f6?:*:*:*) ++ case $host_cpu in ++ x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; ++ *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; ++ esac ;; ++ ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; ++ esac ;; ++ *:68747541:*:*) # AMD ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; ++ *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; ++ *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; ++ *60?:*:*:*) ax_gcc_arch=k7 ;; ++ *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; ++ *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; ++ *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; ++ *6[[68a]]?:*:*:*) ++ AX_GCC_X86_CPUID(0x80000006) # L2 cache size ++ case $ax_cv_gcc_x86_cpuid_0x80000006 in ++ *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256 ++ ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; ++ *) ax_gcc_arch="athlon-4 athlon k7" ;; ++ esac ;; ++ ?00??f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; ++ ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;; ++ ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; ++ ?00??f??:*:*:*) ax_gcc_arch="k8" ;; ++ ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; ++ ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; ++ *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; ++ esac ;; ++ *:746e6543:*:*) # IDT ++ case $ax_cv_gcc_x86_cpuid_1 in ++ *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; ++ *58?:*:*:*) ax_gcc_arch=winchip2 ;; ++ *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; ++ *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; ++ esac ;; ++ esac ++ if test x"$ax_gcc_arch" = x; then # fallback ++ case $host_cpu in ++ i586*) ax_gcc_arch=pentium ;; ++ i686*) ax_gcc_arch=pentiumpro ;; ++ esac ++ fi ++ ;; ++ ++ sparc*) ++ AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/]) ++ cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` ++ cputype=`echo "$cputype" | tr -d ' -' | sed 's/SPARCIIi/SPARCII/' | tr $as_cr_LETTERS $as_cr_letters` ++ case $cputype in ++ *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; ++ *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; ++ *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; ++ *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;; ++ *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;; ++ *cypress*) ax_gcc_arch=cypress ;; ++ esac ;; ++ ++ alphaev5) ax_gcc_arch=ev5 ;; ++ alphaev56) ax_gcc_arch=ev56 ;; ++ alphapca56) ax_gcc_arch="pca56 ev56" ;; ++ alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; ++ alphaev6) ax_gcc_arch=ev6 ;; ++ alphaev67) ax_gcc_arch=ev67 ;; ++ alphaev68) ax_gcc_arch="ev68 ev67" ;; ++ alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; ++ alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; ++ alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; ++ ++ powerpc*) ++ cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` ++ cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` ++ case $cputype in ++ *750*) ax_gcc_arch="750 G3" ;; ++ *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;; ++ *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;; ++ *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;; ++ *970*) ax_gcc_arch="970 G5 power4";; ++ *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; ++ *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; ++ 603ev|8240) ax_gcc_arch="$cputype 603e 603";; ++ *) ax_gcc_arch=$cputype ;; ++ esac ++ ax_gcc_arch="$ax_gcc_arch powerpc" ++ ;; ++esac ++fi # not cross-compiling ++fi # guess arch ++ ++if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then ++for arch in $ax_gcc_arch; do ++ if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code ++ flags="-mtune=$arch" ++ # -mcpu=$arch and m$arch generate nonportable code on every arch except ++ # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. ++ case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac ++ else ++ flags="-march=$arch -mcpu=$arch -m$arch" ++ fi ++ for flag in $flags; do ++ AX_CHECK_COMPILE_FLAG($flag, [ax_cv_gcc_archflag=$flag; break]) ++ done ++ test "x$ax_cv_gcc_archflag" = xunknown || break ++done ++fi ++ ++fi # $GCC=yes ++]) ++AC_MSG_CHECKING([for gcc architecture flag]) ++AC_MSG_RESULT($ax_cv_gcc_archflag) ++if test "x$ax_cv_gcc_archflag" = xunknown; then ++ m4_default([$3],:) ++else ++ m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"]) ++fi ++]) +diff --git a/js/src/ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 b/js/src/ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 +@@ -0,0 +1,79 @@ ++# =========================================================================== ++# http://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_GCC_X86_CPUID(OP) ++# ++# DESCRIPTION ++# ++# On Pentium and later x86 processors, with gcc or a compiler that has a ++# compatible syntax for inline assembly instructions, run a small program ++# that executes the cpuid instruction with input OP. This can be used to ++# detect the CPU type. ++# ++# On output, the values of the eax, ebx, ecx, and edx registers are stored ++# as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable ++# ax_cv_gcc_x86_cpuid_OP. ++# ++# If the cpuid instruction fails (because you are running a ++# cross-compiler, or because you are not using gcc, or because you are on ++# a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP ++# is set to the string "unknown". ++# ++# This macro mainly exists to be used in AX_GCC_ARCHFLAG. ++# ++# LICENSE ++# ++# Copyright (c) 2008 Steven G. Johnson ++# Copyright (c) 2008 Matteo Frigo ++# ++# This program is free software: you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation, either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 7 ++ ++AC_DEFUN([AX_GCC_X86_CPUID], ++[AC_REQUIRE([AC_PROG_CC]) ++AC_LANG_PUSH([C]) ++AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1, ++ [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [ ++ int op = $1, eax, ebx, ecx, edx; ++ FILE *f; ++ __asm__("cpuid" ++ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) ++ : "a" (op)); ++ f = fopen("conftest_cpuid", "w"); if (!f) return 1; ++ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); ++ fclose(f); ++ return 0; ++])], ++ [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid], ++ [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid], ++ [ax_cv_gcc_x86_cpuid_$1=unknown])]) ++AC_LANG_POP([C]) ++]) +diff --git a/js/src/ctypes/libffi/m4/libtool.m4 b/js/src/ctypes/libffi/m4/libtool.m4 +--- a/js/src/ctypes/libffi/m4/libtool.m4 ++++ b/js/src/ctypes/libffi/m4/libtool.m4 +@@ -1,21 +1,23 @@ + # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + # + # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +-# 2006, 2007, 2008 Free Software Foundation, Inc. ++# 2006, 2007, 2008, 2009, 2010, 2011 Free Software ++# Foundation, Inc. + # Written by Gordon Matzigkeit, 1996 + # + # This file is free software; the Free Software Foundation gives + # unlimited permission to copy and/or distribute it, with or without + # modifications, as long as this notice is preserved. + + m4_define([_LT_COPYING], [dnl + # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +-# 2006, 2007, 2008 Free Software Foundation, Inc. ++# 2006, 2007, 2008, 2009, 2010, 2011 Free Software ++# Foundation, Inc. + # Written by Gordon Matzigkeit, 1996 + # + # This file is part of GNU Libtool. + # + # GNU Libtool is free software; you can redistribute it and/or + # modify it under the terms of the GNU General Public License as + # published by the Free Software Foundation; either version 2 of + # the License, or (at your option) any later version. +@@ -32,17 +34,17 @@ m4_define([_LT_COPYING], [dnl + # + # You should have received a copy of the GNU General Public License + # along with GNU Libtool; see the file COPYING. If not, a copy + # can be downloaded from http://www.gnu.org/licenses/gpl.html, or + # obtained by writing to the Free Software Foundation, Inc., + # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ]) + +-# serial 56 LT_INIT ++# serial 57 LT_INIT + + + # LT_PREREQ(VERSION) + # ------------------ + # Complain and exit if this libtool version is less that VERSION. + m4_defun([LT_PREREQ], + [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], +@@ -61,32 +63,35 @@ m4_defun([_LT_CHECK_BUILDDIR], + esac + ]) + + + # LT_INIT([OPTIONS]) + # ------------------ + AC_DEFUN([LT_INIT], + [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT ++AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl + AC_BEFORE([$0], [LT_LANG])dnl + AC_BEFORE([$0], [LT_OUTPUT])dnl + AC_BEFORE([$0], [LTDL_INIT])dnl + m4_require([_LT_CHECK_BUILDDIR])dnl + + dnl Autoconf doesn't catch unexpanded LT_ macros by default: + m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl + m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl + dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 + dnl unless we require an AC_DEFUNed macro: + AC_REQUIRE([LTOPTIONS_VERSION])dnl + AC_REQUIRE([LTSUGAR_VERSION])dnl + AC_REQUIRE([LTVERSION_VERSION])dnl + AC_REQUIRE([LTOBSOLETE_VERSION])dnl + m4_require([_LT_PROG_LTMAIN])dnl + ++_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) ++ + dnl Parse OPTIONS + _LT_SET_OPTIONS([$0], [$1]) + + # This can be used to rebuild libtool when needed + LIBTOOL_DEPS="$ltmain" + + # Always use our own libtool. + LIBTOOL='$(SHELL) $(top_builddir)/libtool' +@@ -113,17 +118,17 @@ m4_defun([_LT_CC_BASENAME], + [for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done +-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + ]) + + + # _LT_FILEUTILS_DEFAULTS + # ---------------------- + # It is okay to use these file commands and assume they have been set + # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. + m4_defun([_LT_FILEUTILS_DEFAULTS], +@@ -133,16 +138,21 @@ m4_defun([_LT_FILEUTILS_DEFAULTS], + ])# _LT_FILEUTILS_DEFAULTS + + + # _LT_SETUP + # --------- + m4_defun([_LT_SETUP], + [AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_CANONICAL_BUILD])dnl ++AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl ++AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl ++ ++_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl ++dnl + _LT_DECL([], [host_alias], [0], [The host system])dnl + _LT_DECL([], [host], [0])dnl + _LT_DECL([], [host_os], [0])dnl + dnl + _LT_DECL([], [build_alias], [0], [The build system])dnl + _LT_DECL([], [build], [0])dnl + _LT_DECL([], [build_os], [0])dnl + dnl +@@ -155,66 +165,51 @@ test -z "$LN_S" && LN_S="ln -s" + _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl + dnl + AC_REQUIRE([LT_CMD_MAX_LEN])dnl + _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl + _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl + dnl + m4_require([_LT_FILEUTILS_DEFAULTS])dnl + m4_require([_LT_CHECK_SHELL_FEATURES])dnl ++m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl + m4_require([_LT_CMD_RELOAD])dnl + m4_require([_LT_CHECK_MAGIC_METHOD])dnl ++m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl + m4_require([_LT_CMD_OLD_ARCHIVE])dnl + m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl ++m4_require([_LT_WITH_SYSROOT])dnl + + _LT_CONFIG_LIBTOOL_INIT([ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes INIT. + if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + ]) + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + _LT_CHECK_OBJDIR + + m4_require([_LT_TAG_COMPILER])dnl +-_LT_PROG_ECHO_BACKSLASH + + case $host_os in + aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; + esac + +-# Sed substitution that helps us do robust quoting. It backslashifies +-# metacharacters that are still active within double-quoted strings. +-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' +- +-# Same as above, but do not quote variable references. +-double_quote_subst='s/\([["`\\]]\)/\\\1/g' +- +-# Sed substitution to delay expansion of an escaped shell variable in a +-# double_quote_subst'ed string. +-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +- +-# Sed substitution to delay expansion of an escaped single quote. +-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' +- +-# Sed substitution to avoid accidental globbing in evaled expressions +-no_glob_subst='s/\*/\\\*/g' +- + # Global variables: + ofile=libtool + can_build_shared=yes + + # All known linkers require a `.a' archive for static linking (except MSVC, + # which needs '.lib'). + libext=a + +@@ -245,16 +240,38 @@ esac + # Use C for the default configuration in the libtool script + LT_SUPPORTED_TAG([CC]) + _LT_LANG_C_CONFIG + _LT_LANG_DEFAULT_CONFIG + _LT_CONFIG_COMMANDS + ])# _LT_SETUP + + ++# _LT_PREPARE_SED_QUOTE_VARS ++# -------------------------- ++# Define a few sed substitution that help us do robust quoting. ++m4_defun([_LT_PREPARE_SED_QUOTE_VARS], ++[# Backslashify metacharacters that are still active within ++# double-quoted strings. ++sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' ++ ++# Same as above, but do not quote variable references. ++double_quote_subst='s/\([["`\\]]\)/\\\1/g' ++ ++# Sed substitution to delay expansion of an escaped shell variable in a ++# double_quote_subst'ed string. ++delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' ++ ++# Sed substitution to delay expansion of an escaped single quote. ++delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' ++ ++# Sed substitution to avoid accidental globbing in evaled expressions ++no_glob_subst='s/\*/\\\*/g' ++]) ++ + # _LT_PROG_LTMAIN + # --------------- + # Note that this code is called both from `configure', and `config.status' + # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, + # `config.status' has no value for ac_aux_dir unless we are using Automake, + # so we pass a copy along to make sure it has a sensible value anyway. + m4_defun([_LT_PROG_LTMAIN], + [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +@@ -403,27 +420,27 @@ m4_define([_lt_decl_all_varnames], + + + # _LT_CONFIG_STATUS_DECLARE([VARNAME]) + # ------------------------------------ + # Quote a variable value, and forward it to `config.status' so that its + # declaration there will have the same value as in `configure'. VARNAME + # must have a single quote delimited value for this to work. + m4_define([_LT_CONFIG_STATUS_DECLARE], +-[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) ++[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + + # _LT_CONFIG_STATUS_DECLARATIONS + # ------------------------------ + # We delimit libtool config variables with single quotes, so when + # we write them to config.status, we have to be sure to quote all + # embedded single quotes properly. In configure, this macro expands + # each variable declared with _LT_DECL (and _LT_TAGDECL) into: + # +-# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' ++# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' + m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], + [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + + # _LT_LIBTOOL_TAGS + # ---------------- + # Output comment and list of tags supported by the script +@@ -512,75 +529,96 @@ m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_I + sed_quote_subst='$sed_quote_subst' + double_quote_subst='$double_quote_subst' + delay_variable_subst='$delay_variable_subst' + _LT_CONFIG_STATUS_DECLARATIONS + LTCC='$LTCC' + LTCFLAGS='$LTCFLAGS' + compiler='$compiler_DEFAULT' + ++# A function that is used when there is no print builtin or printf. ++func_fallback_echo () ++{ ++ eval 'cat <<_LTECHO_EOF ++\$[]1 ++_LTECHO_EOF' ++} ++ + # Quote evaled strings. + for var in lt_decl_all_varnames([[ \ + ]], lt_decl_quote_varnames); do +- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in ++ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ++ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac + done + + # Double-quote double-evaled strings. + for var in lt_decl_all_varnames([[ \ + ]], lt_decl_dquote_varnames); do +- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in ++ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ++ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac + done + +-# Fix-up fallback echo if it was mangled by the above quoting rules. +-case \$lt_ECHO in +-*'\\\[$]0 --fallback-echo"')dnl " +- lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` +- ;; +-esac +- + _LT_OUTPUT_LIBTOOL_INIT + ]) + ++# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) ++# ------------------------------------ ++# Generate a child script FILE with all initialization necessary to ++# reuse the environment learned by the parent script, and make the ++# file executable. If COMMENT is supplied, it is inserted after the ++# `#!' sequence but before initialization text begins. After this ++# macro, additional text can be appended to FILE to form the body of ++# the child script. The macro ends with non-zero status if the ++# file could not be fully written (such as if the disk is full). ++m4_ifdef([AS_INIT_GENERATED], ++[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], ++[m4_defun([_LT_GENERATED_FILE_INIT], ++[m4_require([AS_PREPARE])]dnl ++[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl ++[lt_write_fail=0 ++cat >$1 <<_ASEOF || lt_write_fail=1 ++#! $SHELL ++# Generated by $as_me. ++$2 ++SHELL=\${CONFIG_SHELL-$SHELL} ++export SHELL ++_ASEOF ++cat >>$1 <<\_ASEOF || lt_write_fail=1 ++AS_SHELL_SANITIZE ++_AS_PREPARE ++exec AS_MESSAGE_FD>&1 ++_ASEOF ++test $lt_write_fail = 0 && chmod +x $1[]dnl ++m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + + # LT_OUTPUT + # --------- + # This macro allows early generation of the libtool script (before + # AC_OUTPUT is called), incase it is used in configure for compilation + # tests. + AC_DEFUN([LT_OUTPUT], + [: ${CONFIG_LT=./config.lt} + AC_MSG_NOTICE([creating $CONFIG_LT]) +-cat >"$CONFIG_LT" <<_LTEOF +-#! $SHELL +-# Generated by $as_me. +-# Run this file to recreate a libtool stub with the current configuration. +- ++_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], ++[# Run this file to recreate a libtool stub with the current configuration.]) ++ ++cat >>"$CONFIG_LT" <<\_LTEOF + lt_cl_silent=false +-SHELL=\${CONFIG_SHELL-$SHELL} +-_LTEOF +- +-cat >>"$CONFIG_LT" <<\_LTEOF +-AS_SHELL_SANITIZE +-_AS_PREPARE +- +-exec AS_MESSAGE_FD>&1 + exec AS_MESSAGE_LOG_FD>>config.log + { + echo + AS_BOX([Running $as_me.]) + } >&AS_MESSAGE_LOG_FD + + lt_cl_help="\ + \`$as_me' creates a local libtool stub from the current configuration, +@@ -596,17 +634,17 @@ Usage: $[0] [[OPTIONS]] + + Report bugs to ." + + lt_cl_version="\ + m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl + m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) + configured by $[0], generated by m4_PACKAGE_STRING. + +-Copyright (C) 2008 Free Software Foundation, Inc. ++Copyright (C) 2011 Free Software Foundation, Inc. + This config.lt script is free software; the Free Software Foundation + gives unlimited permision to copy, distribute and modify it." + + while test $[#] != 0 + do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; +@@ -641,25 +679,23 @@ AC_MSG_NOTICE([creating $ofile]) + AS_EXIT(0) + _LTEOF + chmod +x "$CONFIG_LT" + + # configure is writing to config.log, but config.lt does its own redirection, + # appending to config.log, which fails on DOS, as config.log is still kept + # open by configure. Here we exec the FD to /dev/null, effectively closing + # config.log, so it can be properly (re)opened and appended to by config.lt. +-if test "$no_create" != yes; then +- lt_cl_success=: +- test "$silent" = yes && +- lt_config_lt_args="$lt_config_lt_args --quiet" +- exec AS_MESSAGE_LOG_FD>/dev/null +- $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +- exec AS_MESSAGE_LOG_FD>>config.log +- $lt_cl_success || AS_EXIT(1) +-fi ++lt_cl_success=: ++test "$silent" = yes && ++ lt_config_lt_args="$lt_config_lt_args --quiet" ++exec AS_MESSAGE_LOG_FD>/dev/null ++$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false ++exec AS_MESSAGE_LOG_FD>>config.log ++$lt_cl_success || AS_EXIT(1) + ])# LT_OUTPUT + + + # _LT_CONFIG(TAG) + # --------------- + # If TAG is the built-in tag, create an initial libtool script with a + # default configuration from the untagged config vars. Otherwise add code + # to config.status for appending the configuration named by TAG from the +@@ -712,25 +748,22 @@ fi + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? +- sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- _LT_PROG_XSI_SHELLFNS +- +- sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- mv -f "$cfgfile" "$ofile" || ++ sed '$q' "$ltmain" >> "$cfgfile" \ ++ || (rm -f "$cfgfile"; exit 1) ++ ++ _LT_PROG_REPLACE_SHELLFNS ++ ++ mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + ], + [cat <<_LT_EOF >> "$ofile" + + dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded + dnl in a comment (ie after a #). + # ### BEGIN LIBTOOL TAG CONFIG: $1 +@@ -765,16 +798,17 @@ m4_define([_LT_TAGS], []) + # LT_LANG(LANG) + # ------------- + # Enable libtool support for the given language if not already enabled. + AC_DEFUN([LT_LANG], + [AC_BEFORE([$0], [LT_OUTPUT])dnl + m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], ++ [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl + ])# LT_LANG +@@ -786,16 +820,41 @@ m4_defun([_LT_LANG], + [m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl + ])# _LT_LANG + + ++m4_ifndef([AC_PROG_GO], [ ++############################################################ ++# NOTE: This macro has been submitted for inclusion into # ++# GNU Autoconf as AC_PROG_GO. When it is available in # ++# a released version of Autoconf we should remove this # ++# macro and use it instead. # ++############################################################ ++m4_defun([AC_PROG_GO], ++[AC_LANG_PUSH(Go)dnl ++AC_ARG_VAR([GOC], [Go compiler command])dnl ++AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl ++_AC_ARG_VAR_LDFLAGS()dnl ++AC_CHECK_TOOL(GOC, gccgo) ++if test -z "$GOC"; then ++ if test -n "$ac_tool_prefix"; then ++ AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) ++ fi ++fi ++if test -z "$GOC"; then ++ AC_CHECK_PROG(GOC, gccgo, gccgo, false) ++fi ++])#m4_defun ++])#m4_ifndef ++ ++ + # _LT_LANG_DEFAULT_CONFIG + # ----------------------- + m4_defun([_LT_LANG_DEFAULT_CONFIG], + [AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + + AC_PROVIDE_IFELSE([AC_PROG_F77], +@@ -816,31 +875,37 @@ AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + ++AC_PROVIDE_IFELSE([AC_PROG_GO], ++ [LT_LANG(GO)], ++ [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) ++ + AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) + ])# _LT_LANG_DEFAULT_CONFIG + + # Obsolete macros: + AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) + AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) + AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) + AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) ++AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) + dnl aclocal-1.4 backwards compatibility: + dnl AC_DEFUN([AC_LIBTOOL_CXX], []) + dnl AC_DEFUN([AC_LIBTOOL_F77], []) + dnl AC_DEFUN([AC_LIBTOOL_FC], []) + dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) ++dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + + # _LT_TAG_COMPILER + # ---------------- + m4_defun([_LT_TAG_COMPILER], + [AC_REQUIRE([AC_PROG_CC])dnl + + _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +@@ -916,35 +981,70 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECK + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? +- if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then ++ # If there is a non-empty error log, and "single_module" ++ # appears in it, assume the flag caused a linker warning ++ if test -s conftest.err && $GREP single_module conftest.err; then ++ cat conftest.err >&AS_MESSAGE_LOG_FD ++ # Otherwise, if the output was created with a 0 exit code from ++ # the compiler, it worked. ++ elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) ++ + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) ++ ++ AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], ++ [lt_cv_ld_force_load=no ++ cat > conftest.c << _LT_EOF ++int forced_loaded() { return 2;} ++_LT_EOF ++ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD ++ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD ++ echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD ++ $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD ++ echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD ++ $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD ++ cat > conftest.c << _LT_EOF ++int main() { return 0;} ++_LT_EOF ++ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD ++ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err ++ _lt_result=$? ++ if test -s conftest.err && $GREP force_load conftest.err; then ++ cat conftest.err >&AS_MESSAGE_LOG_FD ++ elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then ++ lt_cv_ld_force_load=yes ++ else ++ cat conftest.err >&AS_MESSAGE_LOG_FD ++ fi ++ rm -f conftest.err libconftest.a conftest conftest.c ++ rm -rf conftest.dSYM ++ ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment +@@ -962,257 +1062,202 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECK + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi +- if test "$DSYMUTIL" != ":"; then ++ if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + ]) + + +-# _LT_DARWIN_LINKER_FEATURES +-# -------------------------- ++# _LT_DARWIN_LINKER_FEATURES([TAG]) ++# --------------------------------- + # Checks for linker and compiler features on darwin + m4_defun([_LT_DARWIN_LINKER_FEATURES], + [ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +- _LT_TAGVAR(whole_archive_flag_spec, $1)='' ++ if test "$lt_cv_ld_force_load" = "yes"; then ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' ++ m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], ++ [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) ++ else ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='' ++ fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then +- output_verbose_link_cmd=echo ++ output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], + [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + ],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ]) + +-# _LT_SYS_MODULE_PATH_AIX +-# ----------------------- ++# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) ++# ---------------------------------- + # Links a minimal program and checks the executable + # for the system default hardcoded library path. In most cases, + # this is /usr/lib:/lib, but when the MPI compilers are used + # the location of the communication and MPI libs are included too. + # If we don't find anything, use the default library path according + # to the aix ld manual. ++# Store the results from the different compilers for each TAGNAME. ++# Allow to override them for all tags through lt_cv_aix_libpath. + m4_defun([_LT_SYS_MODULE_PATH_AIX], + [m4_require([_LT_DECL_SED])dnl +-AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +-lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\(.*\)$/\1/ +- p +- } +- }' +-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-# Check for a 64-bit object if we didn't find anything. +-if test -z "$aix_libpath"; then +- aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +-fi],[]) +-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++if test "${lt_cv_aix_libpath+set}" = set; then ++ aix_libpath=$lt_cv_aix_libpath ++else ++ AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], ++ [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ ++ lt_aix_libpath_sed='[ ++ /Import File Strings/,/^$/ { ++ /^0/ { ++ s/^0 *\([^ ]*\) *$/\1/ ++ p ++ } ++ }]' ++ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` ++ # Check for a 64-bit object if we didn't find anything. ++ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then ++ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` ++ fi],[]) ++ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then ++ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" ++ fi ++ ]) ++ aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) ++fi + ])# _LT_SYS_MODULE_PATH_AIX + + + # _LT_SHELL_INIT(ARG) + # ------------------- + m4_define([_LT_SHELL_INIT], +-[ifdef([AC_DIVERSION_NOTICE], +- [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], +- [AC_DIVERT_PUSH(NOTICE)]) +-$1 +-AC_DIVERT_POP +-])# _LT_SHELL_INIT ++[m4_divert_text([M4SH-INIT], [$1 ++])])# _LT_SHELL_INIT ++ + + + # _LT_PROG_ECHO_BACKSLASH + # ----------------------- +-# Add some code to the start of the generated configure script which +-# will find an echo command which doesn't interpret backslashes. ++# Find how we can fake an echo command that does not interpret backslash. ++# In particular, with Autoconf 2.60 or later we add some code to the start ++# of the generated configure script which will find a shell with a builtin ++# printf (which we can use as an echo command). + m4_defun([_LT_PROG_ECHO_BACKSLASH], +-[_LT_SHELL_INIT([ +-# Check that we are running under the correct shell. +-SHELL=${CONFIG_SHELL-/bin/sh} +- +-case X$lt_ECHO in +-X*--fallback-echo) +- # Remove one level of quotation (which was required for Make). +- ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` +- ;; ++[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ++ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ++ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO ++ ++AC_MSG_CHECKING([how to print strings]) ++# Test print first, because it will be a builtin if present. ++if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ ++ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ++ ECHO='print -r --' ++elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ++ ECHO='printf %s\n' ++else ++ # Use this function as a fallback that always works. ++ func_fallback_echo () ++ { ++ eval 'cat <<_LTECHO_EOF ++$[]1 ++_LTECHO_EOF' ++ } ++ ECHO='func_fallback_echo' ++fi ++ ++# func_echo_all arg... ++# Invoke $ECHO with all args, space-separated. ++func_echo_all () ++{ ++ $ECHO "$*" ++} ++ ++case "$ECHO" in ++ printf*) AC_MSG_RESULT([printf]) ;; ++ print*) AC_MSG_RESULT([print -r]) ;; ++ *) AC_MSG_RESULT([cat]) ;; + esac + +-ECHO=${lt_ECHO-echo} +-if test "X[$]1" = X--no-reexec; then +- # Discard the --no-reexec flag, and continue. +- shift +-elif test "X[$]1" = X--fallback-echo; then +- # Avoid inline document here, it may be left over +- : +-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then +- # Yippee, $ECHO works! +- : +-else +- # Restart under the correct shell. +- exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +-fi +- +-if test "X[$]1" = X--fallback-echo; then +- # used as fallback echo +- shift +- cat <<_LT_EOF +-[$]* +-_LT_EOF +- exit 0 +-fi +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-if test -z "$lt_ECHO"; then +- if test "X${echo_test_string+set}" != Xset; then +- # find a string as large as possible, as long as the shell can cope with it +- for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do +- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... +- if { echo_test_string=`eval $cmd`; } 2>/dev/null && +- { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null +- then +- break +- fi +- done +- fi +- +- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- : +- else +- # The Solaris, AIX, and Digital Unix default echo programs unquote +- # backslashes. This makes it impossible to quote backslashes using +- # echo "$something" | sed 's/\\/\\\\/g' +- # +- # So, first we look for a working echo in the user's PATH. +- +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for dir in $PATH /usr/ucb; do +- IFS="$lt_save_ifs" +- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && +- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && +- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- ECHO="$dir/echo" +- break +- fi +- done +- IFS="$lt_save_ifs" +- +- if test "X$ECHO" = Xecho; then +- # We didn't find a better echo, so look for alternatives. +- if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # This shell has a builtin print -r that does the trick. +- ECHO='print -r' +- elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && +- test "X$CONFIG_SHELL" != X/bin/ksh; then +- # If we have ksh, try running configure again with it. +- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} +- export ORIGINAL_CONFIG_SHELL +- CONFIG_SHELL=/bin/ksh +- export CONFIG_SHELL +- exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} +- else +- # Try using printf. +- ECHO='printf %s\n' +- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && +- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # Cool, printf works +- : +- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL +- export CONFIG_SHELL +- SHELL="$CONFIG_SHELL" +- export SHELL +- ECHO="$CONFIG_SHELL [$]0 --fallback-echo" +- elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- ECHO="$CONFIG_SHELL [$]0 --fallback-echo" +- else +- # maybe with a smaller string... +- prev=: +- +- for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do +- if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null +- then +- break +- fi +- prev="$cmd" +- done +- +- if test "$prev" != 'sed 50q "[$]0"'; then +- echo_test_string=`eval $prev` +- export echo_test_string +- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} +- else +- # Oops. We lost completely, so just stick with echo. +- ECHO=echo +- fi +- fi +- fi +- fi +- fi +-fi +- +-# Copy echo and quote the copy suitably for passing to libtool from +-# the Makefile, instead of quoting the original, which is used later. +-lt_ECHO=$ECHO +-if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then +- lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +-fi +- +-AC_SUBST(lt_ECHO) +-]) ++m4_ifdef([_AS_DETECT_SUGGESTED], ++[_AS_DETECT_SUGGESTED([ ++ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ++ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ++ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ++ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO ++ PATH=/empty FPATH=/empty; export PATH FPATH ++ test "X`printf %s $ECHO`" = "X$ECHO" \ ++ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) ++ + _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +-_LT_DECL([], [ECHO], [1], +- [An echo program that does not interpret backslashes]) ++_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) + ])# _LT_PROG_ECHO_BACKSLASH + + ++# _LT_WITH_SYSROOT ++# ---------------- ++AC_DEFUN([_LT_WITH_SYSROOT], ++[AC_MSG_CHECKING([for sysroot]) ++AC_ARG_WITH([sysroot], ++[ --with-sysroot[=DIR] Search for dependent libraries within DIR ++ (or the compiler's sysroot if not specified).], ++[], [with_sysroot=no]) ++ ++dnl lt_sysroot will always be passed unquoted. We quote it here ++dnl in case the user passed a directory name. ++lt_sysroot= ++case ${with_sysroot} in #( ++ yes) ++ if test "$GCC" = yes; then ++ lt_sysroot=`$CC --print-sysroot 2>/dev/null` ++ fi ++ ;; #( ++ /*) ++ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ++ ;; #( ++ no|'') ++ ;; #( ++ *) ++ AC_MSG_RESULT([${with_sysroot}]) ++ AC_MSG_ERROR([The sysroot must be an absolute path.]) ++ ;; ++esac ++ ++ AC_MSG_RESULT([${lt_sysroot:-no}]) ++_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl ++[dependent libraries, and in which our libraries should be installed.])]) ++ + # _LT_ENABLE_LOCK + # --------------- + m4_defun([_LT_ENABLE_LOCK], + [AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) + test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +@@ -1231,17 +1276,17 @@ ia64-*-hpux*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; + *-*-irix6*) + # Find out which ABI we are using. +- echo '[#]line __oline__ "configure"' > conftest.$ac_ext ++ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" +@@ -1330,24 +1375,37 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux* + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +-sparc*-*solaris*) ++*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in +- yes*) LD="${LD-ld} -m elf64_sparc" ;; ++ yes*) ++ case $host in ++ i?86-*-solaris*) ++ LD="${LD-ld} -m elf_x86_64" ++ ;; ++ sparc*-*-solaris*) ++ LD="${LD-ld} -m elf64_sparc" ++ ;; ++ esac ++ # GNU ld 2.21 introduced _sol2 emulations. Use them if available. ++ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then ++ LD="${LD-ld}_sol2" ++ fi ++ ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac +@@ -1355,24 +1413,57 @@ sparc*-*solaris*) + rm -rf conftest* + ;; + esac + + need_locks="$enable_libtool_lock" + ])# _LT_ENABLE_LOCK + + ++# _LT_PROG_AR ++# ----------- ++m4_defun([_LT_PROG_AR], ++[AC_CHECK_TOOLS(AR, [ar], false) ++: ${AR=ar} ++: ${AR_FLAGS=cru} ++_LT_DECL([], [AR], [1], [The archiver]) ++_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) ++ ++AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], ++ [lt_cv_ar_at_file=no ++ AC_COMPILE_IFELSE([AC_LANG_PROGRAM], ++ [echo conftest.$ac_objext > conftest.lst ++ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' ++ AC_TRY_EVAL([lt_ar_try]) ++ if test "$ac_status" -eq 0; then ++ # Ensure the archiver fails upon bogus file names. ++ rm -f conftest.$ac_objext libconftest.a ++ AC_TRY_EVAL([lt_ar_try]) ++ if test "$ac_status" -ne 0; then ++ lt_cv_ar_at_file=@ ++ fi ++ fi ++ rm -f conftest.* libconftest.a ++ ]) ++ ]) ++ ++if test "x$lt_cv_ar_at_file" = xno; then ++ archiver_list_spec= ++else ++ archiver_list_spec=$lt_cv_ar_at_file ++fi ++_LT_DECL([], [archiver_list_spec], [1], ++ [How to feed a file listing to the archiver]) ++])# _LT_PROG_AR ++ ++ + # _LT_CMD_OLD_ARCHIVE + # ------------------- + m4_defun([_LT_CMD_OLD_ARCHIVE], +-[AC_CHECK_TOOL(AR, ar, false) +-test -z "$AR" && AR=ar +-test -z "$AR_FLAGS" && AR_FLAGS=cru +-_LT_DECL([], [AR], [1], [The archiver]) +-_LT_DECL([], [AR_FLAGS], [1]) ++[_LT_PROG_AR + + AC_CHECK_TOOL(STRIP, strip, :) + test -z "$STRIP" && STRIP=: + _LT_DECL([], [STRIP], [1], [A symbol stripping program]) + + AC_CHECK_TOOL(RANLIB, ranlib, :) + test -z "$RANLIB" && RANLIB=: + _LT_DECL([], [RANLIB], [1], +@@ -1381,28 +1472,37 @@ test -z "$RANLIB" && RANLIB=: + # Determine commands to create old-style static archives. + old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' + old_postinstall_cmds='chmod 644 $oldlib' + old_postuninstall_cmds= + + if test -n "$RANLIB"; then + case $host_os in + openbsd*) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" ++ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" + fi ++ ++case $host_os in ++ darwin*) ++ lock_old_archive_extraction=yes ;; ++ *) ++ lock_old_archive_extraction=no ;; ++esac + _LT_DECL([], [old_postinstall_cmds], [2]) + _LT_DECL([], [old_postuninstall_cmds], [2]) + _LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) ++_LT_DECL([], [lock_old_archive_extraction], [0], ++ [Whether to use a lock for old archive extraction]) + ])# _LT_CMD_OLD_ARCHIVE + + + # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, + # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) + # ---------------------------------------------------------------- + # Check whether the given compiler option works + AC_DEFUN([_LT_COMPILER_OPTION], +@@ -1417,25 +1517,25 @@ AC_CACHE_CHECK([$1], [$2], + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) ++ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD +- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD ++ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* + ]) + +@@ -1465,17 +1565,17 @@ AC_CACHE_CHECK([$1], [$2], + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD +- $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp ++ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi +@@ -1528,16 +1628,21 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [d + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + ++ mint*) ++ # On MiNT this can take a long time and run out of memory. ++ lt_cv_sys_max_cmd_len=8192; ++ ;; ++ + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. +@@ -1553,16 +1658,21 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [d + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + ++ os2*) ++ # The test takes a long time on OS/2. ++ lt_cv_sys_max_cmd_len=8192 ++ ;; ++ + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then +@@ -1592,18 +1702,18 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [d + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. +- while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ +- = "XX$teststring$teststring"; } >/dev/null 2>&1 && ++ while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ ++ = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= +@@ -1644,17 +1754,17 @@ m4_defun([_LT_HEADER_DLFCN], + m4_defun([_LT_TRY_DLOPEN_SELF], + [m4_require([_LT_HEADER_DLFCN])dnl + if test "$cross_compiling" = yes; then : + [$4] + else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-[#line __oline__ "configure" ++[#line $LINENO "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H + #include + #endif + + #include + +@@ -1685,26 +1795,36 @@ else + # else + # define LT_DLLAZY_OR_NOW 0 + # endif + # endif + # endif + # endif + #endif + +-void fnord() { int i=42;} ++/* When -fvisbility=hidden is used, assume the code has been annotated ++ correspondingly for the symbols needed. */ ++#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) ++int fnord () __attribute__((visibility("default"))); ++#endif ++ ++int fnord () { return 42; } + int main () + { + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ else ++ { ++ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ else puts (dlerror ()); ++ } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; + }] + _LT_EOF +@@ -1870,26 +1990,26 @@ AC_CACHE_CHECK([if $compiler supports -c + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) ++ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD +- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD ++ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for +@@ -2038,47 +2158,55 @@ fi + # ----------------------------- + # PORTME Fill in your ld.so characteristics + m4_defun([_LT_SYS_DYNAMIC_LINKER], + [AC_REQUIRE([AC_CANONICAL_HOST])dnl + m4_require([_LT_DECL_EGREP])dnl + m4_require([_LT_FILEUTILS_DEFAULTS])dnl + m4_require([_LT_DECL_OBJDUMP])dnl + m4_require([_LT_DECL_SED])dnl ++m4_require([_LT_CHECK_SHELL_FEATURES])dnl + AC_MSG_CHECKING([dynamic linker characteristics]) + m4_if([$1], + [], [ + if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac +- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` +- if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then ++ case $host_os in ++ mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; ++ *) lt_sed_strip_eq="s,=/,/,g" ;; ++ esac ++ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` ++ case $lt_search_path_spec in ++ *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` +- else +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi ++ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ++ ;; ++ *) ++ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ++ ;; ++ esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done +- lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' ++ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' + BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { +@@ -2088,17 +2216,23 @@ BEGIN {RS=" "; FS="/|\n";} { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } + }'` +- sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` ++ # AWK program above erroneously prepends '/' to C:/dos/paths ++ # for these hosts. ++ case $host_os in ++ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ ++ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; ++ esac ++ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` + else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + fi]) + library_names_spec= + libname_spec='lib$name' + soname_spec= + shrext_cmds=".so" + postinstall_cmds= +@@ -2114,26 +2248,26 @@ need_lib_prefix=unknown + hardcode_into_libs=no + + # when you set need_version to no, make sure it does not cause -set_version + # flags to be left without arguments + need_version=unknown + + case $host_os in + aix3*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + + aix[[4-9]]*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else +@@ -2176,29 +2310,29 @@ amigaos*) + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + + beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + + bsdi[[45]]*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and +@@ -2207,18 +2341,19 @@ bsdi[[45]]*) + ;; + + cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + +- case $GCC,$host_os in +- yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) ++ case $GCC,$cc_basename in ++ yes,*) ++ # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ +@@ -2229,46 +2364,93 @@ cygwin* | mingw* | pw32* | cegcc*) + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ++m4_if([$1], [],[ ++ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` +- if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then +- # It is most probably a Windows format PATH printed by +- # mingw gcc, but we are running on Cygwin. Gcc prints its search +- # path with ; separators, and with drive letters. We can handle the +- # drive letters (cygwin fileutils understands them), so leave them, +- # especially as we might pass files found there to a mingw objdump, +- # which wouldn't understand a cygwinified path. Ahh. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac ++ dynamic_linker='Win32 ld.exe' + ;; + ++ *,cl*) ++ # Native MSVC ++ libname_spec='$name' ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ++ library_names_spec='${libname}.dll.lib' ++ ++ case $build_os in ++ mingw*) ++ sys_lib_search_path_spec= ++ lt_save_ifs=$IFS ++ IFS=';' ++ for lt_path in $LIB ++ do ++ IFS=$lt_save_ifs ++ # Let DOS variable expansion print the short 8.3 style file name. ++ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` ++ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" ++ done ++ IFS=$lt_save_ifs ++ # Convert to MSYS style. ++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ++ ;; ++ cygwin*) ++ # Convert to unix form, then to dos form, then back to unix form ++ # but this time dos style (no spaces!) so that the unix form looks ++ # like /cygdrive/c/PROGRA~1:/cygdr... ++ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` ++ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` ++ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ ;; ++ *) ++ sys_lib_search_path_spec="$LIB" ++ if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then ++ # It is most probably a Windows format PATH. ++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++ # FIXME: find the short name or the path components, as spaces are ++ # common. (e.g. "Program Files" -> "PROGRA~1") ++ ;; ++ esac ++ ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ ++ dldir=$destdir/`dirname \$dlpath`~ ++ test -d \$dldir || mkdir -p \$dldir~ ++ $install_prog $dir/$dlname \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ dlpath=$dir/\$dldll~ ++ $RM \$dlpath' ++ shlibpath_overrides_runpath=yes ++ dynamic_linker='Win32 link.exe' ++ ;; ++ + *) ++ # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ++ dynamic_linker='Win32 ld.exe' + ;; + esac +- dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + + darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no +@@ -2279,36 +2461,32 @@ darwin* | rhapsody*) + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + + dgux*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +-freebsd1*) +- dynamic_linker=no +- ;; +- + freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in +- freebsd[[123]]*) objformat=aout ;; ++ freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no +@@ -2316,17 +2494,17 @@ freebsd* | dragonfly*) + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in +- freebsd2*) ++ freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) +@@ -2336,22 +2514,36 @@ freebsd* | dragonfly*) + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + + gnu*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ ++haiku*) ++ version_type=linux # correct to gnu/linux during the next big refactor ++ need_lib_prefix=no ++ need_version=no ++ dynamic_linker="$host_os runtime_loader" ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + + hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no +@@ -2387,38 +2579,40 @@ hpux9* | hpux10* | hpux11*) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555. ++ # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' ++ # or fails outright, so override atomically: ++ install_override_mode=555 + ;; + + interix[[3-9]]*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + + irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +@@ -2445,49 +2639,55 @@ irix5* | irix6* | nonstopux*) + hardcode_into_libs=yes + ;; + + # No shared lib support for Linux oldld, aout, or coff. + linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +-# This must be Linux ELF. +-linux* | k*bsd*-gnu) +- version_type=linux ++# This must be glibc/ELF. ++linux* | k*bsd*-gnu | kopensolaris*-gnu) ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no ++ + # Some binutils ld are patched to set DT_RUNPATH +- save_LDFLAGS=$LDFLAGS +- save_libdir=$libdir +- eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ +- LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" +- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], +- [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], +- [shlibpath_overrides_runpath=yes])]) +- LDFLAGS=$save_LDFLAGS +- libdir=$save_libdir ++ AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], ++ [lt_cv_shlibpath_overrides_runpath=no ++ save_LDFLAGS=$LDFLAGS ++ save_libdir=$libdir ++ eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ ++ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" ++ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], ++ [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], ++ [lt_cv_shlibpath_overrides_runpath=yes])]) ++ LDFLAGS=$save_LDFLAGS ++ libdir=$save_libdir ++ ]) ++ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then +- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` ++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" ++ + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. +@@ -2508,17 +2708,17 @@ netbsd*) + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + + newsos6) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + + *nto* | *qnx*) + version_type=qnx + need_lib_prefix=no +@@ -2577,17 +2777,17 @@ osf3* | osf4* | osf5*) + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + + rdos*) + dynamic_linker=no + ;; + + solaris*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable +@@ -2602,17 +2802,17 @@ sunos4*) + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + + sysv4 | sysv4.3*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH +@@ -2626,17 +2826,17 @@ sysv4 | sysv4.3*) + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + + sysv4*MP*) + if test -d /usr/nec ;then +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf +@@ -2657,27 +2857,27 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + + tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + + uts4*) +- version_type=linux ++ version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + + *) + dynamic_linker=no + ;; +@@ -2709,16 +2909,18 @@ fi + _LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) + _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) + _LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) + _LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) ++_LT_DECL([], [install_override_mode], [1], ++ [Permission mode override for installation of shared libraries]) + _LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) + _LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) + _LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) + _LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but +@@ -2821,16 +3023,17 @@ fi + # ---------- + # find the pathname to the GNU or non-GNU linker + AC_DEFUN([LT_PATH_LD], + [AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_CANONICAL_BUILD])dnl + m4_require([_LT_DECL_SED])dnl + m4_require([_LT_DECL_EGREP])dnl ++m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + + AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + + ac_prog=ld +@@ -2942,26 +3145,31 @@ m4_defun([_LT_CMD_RELOAD], + [lt_cv_ld_reload_flag='-r']) + reload_flag=$lt_cv_ld_reload_flag + case $reload_flag in + "" | " "*) ;; + *) reload_flag=" $reload_flag" ;; + esac + reload_cmds='$LD$reload_flag -o $output$reload_objs' + case $host_os in ++ cygwin* | mingw* | pw32* | cegcc*) ++ if test "$GCC" != yes; then ++ reload_cmds=false ++ fi ++ ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; + esac +-_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl +-_LT_DECL([], [reload_cmds], [2])dnl ++_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl ++_LT_TAGDECL([], [reload_cmds], [2])dnl + ])# _LT_CMD_RELOAD + + + # _LT_CHECK_MAGIC_METHOD + # ---------------------- + # how to check for library dependencies + # -- PORTME fill in with the dynamic library characteristics + m4_defun([_LT_CHECK_MAGIC_METHOD], +@@ -3003,26 +3211,28 @@ cygwin*) + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + + mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. +- if ( file / ) >/dev/null 2>&1; then ++ # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. ++ if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else +- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' ++ # Keep this pattern in sync with the one in func_win32_libid. ++ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +-cegcc) ++cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + + darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; +@@ -3042,29 +3252,33 @@ freebsd* | dragonfly*) + lt_cv_deplibs_check_method=pass_all + fi + ;; + + gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++haiku*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ + hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) +- [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] ++ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) +- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' ++ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + + interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' +@@ -3075,18 +3289,18 @@ irix5* | irix6* | nonstopux*) + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +-# This must be Linux ELF. +-linux* | k*bsd*-gnu) ++# This must be glibc/ELF. ++linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' +@@ -3154,24 +3368,43 @@ sysv4 | sysv4.3*) + esac + ;; + + tpf*) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ]) ++ ++file_magic_glob= ++want_nocaseglob=no ++if test "$build" = "$host"; then ++ case $host_os in ++ mingw* | pw32*) ++ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then ++ want_nocaseglob=yes ++ else ++ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` ++ fi ++ ;; ++ esac ++fi ++ + file_magic_cmd=$lt_cv_file_magic_cmd + deplibs_check_method=$lt_cv_deplibs_check_method + test -z "$deplibs_check_method" && deplibs_check_method=unknown + + _LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) + _LT_DECL([], [file_magic_cmd], [1], +- [Command to use when deplibs_check_method == "file_magic"]) ++ [Command to use when deplibs_check_method = "file_magic"]) ++_LT_DECL([], [file_magic_glob], [1], ++ [How to find potential files when deplibs_check_method = "file_magic"]) ++_LT_DECL([], [want_nocaseglob], [1], ++ [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) + ])# _LT_CHECK_MAGIC_METHOD + + + # LT_PATH_NM + # ---------- + # find the pathname to a BSD- or MS-compatible name lister + AC_DEFUN([LT_PATH_NM], + [AC_REQUIRE([AC_PROG_CC])dnl +@@ -3218,59 +3451,132 @@ else + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} + fi]) + if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" + else + # Didn't find any BSD compatible name lister, look for dumpbin. +- AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) ++ if test -n "$DUMPBIN"; then : ++ # Let the user override the test. ++ else ++ AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) ++ case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in ++ *COFF*) ++ DUMPBIN="$DUMPBIN -symbols" ++ ;; ++ *) ++ DUMPBIN=: ++ ;; ++ esac ++ fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi + fi + test -z "$NM" && NM=nm + AC_SUBST([NM]) + _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + + AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) ++ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD +- (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) ++ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD +- (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) ++ (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) + ])# LT_PATH_NM + + # Old names: + AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) + AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) + dnl aclocal-1.4 backwards compatibility: + dnl AC_DEFUN([AM_PROG_NM], []) + dnl AC_DEFUN([AC_PROG_NM], []) + ++# _LT_CHECK_SHAREDLIB_FROM_LINKLIB ++# -------------------------------- ++# how to determine the name of the shared library ++# associated with a specific link library. ++# -- PORTME fill in with the dynamic library characteristics ++m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], ++[m4_require([_LT_DECL_EGREP]) ++m4_require([_LT_DECL_OBJDUMP]) ++m4_require([_LT_DECL_DLLTOOL]) ++AC_CACHE_CHECK([how to associate runtime and link libraries], ++lt_cv_sharedlib_from_linklib_cmd, ++[lt_cv_sharedlib_from_linklib_cmd='unknown' ++ ++case $host_os in ++cygwin* | mingw* | pw32* | cegcc*) ++ # two different shell functions defined in ltmain.sh ++ # decide which to use based on capabilities of $DLLTOOL ++ case `$DLLTOOL --help 2>&1` in ++ *--identify-strict*) ++ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ++ ;; ++ *) ++ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ++ ;; ++ esac ++ ;; ++*) ++ # fallback: assume linklib IS sharedlib ++ lt_cv_sharedlib_from_linklib_cmd="$ECHO" ++ ;; ++esac ++]) ++sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd ++test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO ++ ++_LT_DECL([], [sharedlib_from_linklib_cmd], [1], ++ [Command to associate shared and link libraries]) ++])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB ++ ++ ++# _LT_PATH_MANIFEST_TOOL ++# ---------------------- ++# locate the manifest tool ++m4_defun([_LT_PATH_MANIFEST_TOOL], ++[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) ++test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt ++AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], ++ [lt_cv_path_mainfest_tool=no ++ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD ++ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out ++ cat conftest.err >&AS_MESSAGE_LOG_FD ++ if $GREP 'Manifest Tool' conftest.out > /dev/null; then ++ lt_cv_path_mainfest_tool=yes ++ fi ++ rm -f conftest*]) ++if test "x$lt_cv_path_mainfest_tool" != xyes; then ++ MANIFEST_TOOL=: ++fi ++_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ++])# _LT_PATH_MANIFEST_TOOL ++ + + # LT_LIB_M + # -------- + # check for math library + AC_DEFUN([LT_LIB_M], + [AC_REQUIRE([AC_CANONICAL_HOST])dnl + LIBM= + case $host in +-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) ++*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; + *-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; + *) + AC_CHECK_LIB(m, cos, LIBM="-lm") +@@ -3288,33 +3594,39 @@ dnl AC_DEFUN([AC_CHECK_LIBM], []) + # _LT_COMPILER_NO_RTTI([TAGNAME]) + # ------------------------------- + m4_defun([_LT_COMPILER_NO_RTTI], + [m4_require([_LT_TAG_COMPILER])dnl + + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + + if test "$GCC" = yes; then +- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ++ case $cc_basename in ++ nvcc*) ++ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; ++ *) ++ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; ++ esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) + fi + _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) + ])# _LT_COMPILER_NO_RTTI + + + # _LT_CMD_GLOBAL_SYMBOLS + # ---------------------- + m4_defun([_LT_CMD_GLOBAL_SYMBOLS], + [AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_CC])dnl ++AC_REQUIRE([AC_PROG_AWK])dnl + AC_REQUIRE([LT_PATH_NM])dnl + AC_REQUIRE([LT_PATH_LD])dnl + m4_require([_LT_DECL_SED])dnl + m4_require([_LT_DECL_EGREP])dnl + m4_require([_LT_TAG_COMPILER])dnl + + # Check for command to grab the raw symbol name followed by C symbol from nm. + AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +@@ -3372,18 +3684,18 @@ case `$NM -V 2>&1` in + esac + + # Transform an extracted symbol line into a proper C declaration. + # Some systems (esp. on ia64) link data and code symbols differently, + # so use this general approach. + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + + # Transform an extracted symbol line into symbol name and symbol address +-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" ++lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" ++lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + + # Handle CRLF in mingw tool chain + opt_cr= + case $build_os in + mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; + esac +@@ -3397,28 +3709,30 @@ for ac_symprfx in "" "_"; do + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ + " {last_section=section; section=\$ 3};"\ ++" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ + " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ + " \$ 0!~/External *\|/{next};"\ + " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ + " {if(hide[section]) next};"\ + " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ + " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ + " s[1]~/^[@?]/{print s[1], s[1]; next};"\ + " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ + " ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi ++ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF + #ifdef __cplusplus + extern "C" { +@@ -3430,40 +3744,52 @@ void nm_test_func(void){} + } + #endif + int main(){nm_test_var='a';nm_test_func();return(0);} + _LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm +- if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then ++ if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext ++/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ ++#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) ++/* DATA imports from DLLs on WIN32 con't be const, because runtime ++ relocations are performed -- see ld's documentation on pseudo-relocs. */ ++# define LT@&t@_DLSYM_CONST ++#elif defined(__osf__) ++/* This system does not cope well with relocations in const data. */ ++# define LT@&t@_DLSYM_CONST ++#else ++# define LT@&t@_DLSYM_CONST const ++#endif ++ + #ifdef __cplusplus + extern "C" { + #endif + + _LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + + /* The mapping between symbol names and symbols. */ +-const struct { ++LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; + } + lt__PROGRAM__LTX_preloaded_symbols[[]] = + { + { "@PROGRAM@", (void *) 0 }, + _LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext +@@ -3479,25 +3805,25 @@ static const void *lt_preloaded_setup() + #endif + + #ifdef __cplusplus + } + #endif + _LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext +- lt_save_LIBS="$LIBS" +- lt_save_CFLAGS="$CFLAGS" ++ lt_globsym_save_LIBS=$LIBS ++ lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi +- LIBS="$lt_save_LIBS" +- CFLAGS="$lt_save_CFLAGS" ++ LIBS=$lt_globsym_save_LIBS ++ CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD +@@ -3520,38 +3846,46 @@ if test -z "$lt_cv_sys_global_symbol_pip + lt_cv_sys_global_symbol_to_cdecl= + fi + if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) + else + AC_MSG_RESULT(ok) + fi + ++# Response file support. ++if test "$lt_cv_nm_interface" = "MS dumpbin"; then ++ nm_file_list_spec='@' ++elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then ++ nm_file_list_spec='@' ++fi ++ + _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) + _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) + _LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) + _LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) ++_LT_DECL([], [nm_file_list_spec], [1], ++ [Specify filename containing input files for $NM]) + ]) # _LT_CMD_GLOBAL_SYMBOLS + + + # _LT_COMPILER_PIC([TAGNAME]) + # --------------------------- + m4_defun([_LT_COMPILER_PIC], + [m4_require([_LT_TAG_COMPILER])dnl + _LT_TAGVAR(lt_prog_compiler_wl, $1)= + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)= + +-AC_MSG_CHECKING([for $compiler option to produce PIC]) + m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) +@@ -3592,16 +3926,21 @@ m4_if([$1], [CXX], [ + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; ++ haiku*) ++ # PIC is the default for Haiku. ++ # The "-static" flag exists, but is broken. ++ _LT_TAGVAR(lt_prog_compiler_static, $1)= ++ ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi +@@ -3641,16 +3980,22 @@ m4_if([$1], [CXX], [ + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; ++ mingw* | cygwin* | os2* | pw32* | cegcc*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ m4_if([$1], [GCJ], [], ++ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ++ ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' +@@ -3697,17 +4042,17 @@ m4_if([$1], [CXX], [ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; +- linux* | k*bsd*-gnu) ++ linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. +@@ -3730,18 +4075,18 @@ m4_if([$1], [CXX], [ + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; +- xlc* | xlC*) +- # IBM XL 8.0 on PPC ++ xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) ++ # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 +@@ -3793,17 +4138,17 @@ m4_if([$1], [CXX], [ + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in +- CC*) ++ CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' +@@ -3897,16 +4242,22 @@ m4_if([$1], [CXX], [ + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + ++ haiku*) ++ # PIC is the default for Haiku. ++ # The "-static" flag exists, but is broken. ++ _LT_TAGVAR(lt_prog_compiler_static, $1)= ++ ;; ++ + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; +@@ -3939,16 +4290,25 @@ m4_if([$1], [CXX], [ + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac ++ ++ case $cc_basename in ++ nvcc*) # Cuda Compiler Driver 2.2 ++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' ++ if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then ++ _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ++ fi ++ ;; ++ esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +@@ -3981,17 +4341,17 @@ m4_if([$1], [CXX], [ + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + +- linux* | k*bsd*-gnu) ++ linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. +@@ -4002,47 +4362,68 @@ m4_if([$1], [CXX], [ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; +- pgcc* | pgf77* | pgf90* | pgf95*) ++ nagfor*) ++ # NAG Fortran compiler ++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' ++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ++ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; ++ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; +- xl*) +- # IBM XL C 8.0/Fortran 10.1 on PPC ++ xl* | bgxl* | bgf* | mpixl*) ++ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in ++ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) ++ # Sun Fortran 8.3 passes all unrecognized flags to the linker ++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ++ ;; ++ *Sun\ F* | *Sun*Fortran*) ++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ++ ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; +- *Sun\ F*) +- # Sun Fortran 8.3 passes all unrecognized flags to the linker +- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ *Intel*\ [[CF]]*Compiler*) ++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ++ ;; ++ *Portland\ Group*) ++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +- _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' +@@ -4064,17 +4445,17 @@ m4_if([$1], [CXX], [ + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in +- f77* | f90* | f95*) ++ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' +@@ -4121,19 +4502,21 @@ case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; + esac +-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], +- [How to pass a linker flag through the compiler]) ++ ++AC_CACHE_CHECK([for $compiler option to produce PIC], ++ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], ++ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) ++_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + + # + # Check to make sure the PIC flag actually works. + # + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], +@@ -4142,16 +4525,18 @@ if test -n "$_LT_TAGVAR(lt_prog_compiler + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) + fi + _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + ++_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], ++ [How to pass a linker flag through the compiler]) + # + # Check to make sure the static flag actually works. + # + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" + _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], +@@ -4162,60 +4547,70 @@ wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + + + # _LT_LINKER_SHLIBS([TAGNAME]) + # ---------------------------- + # See if the linker supports building shared libraries. + m4_defun([_LT_LINKER_SHLIBS], + [AC_REQUIRE([LT_PATH_LD])dnl + AC_REQUIRE([LT_PATH_NM])dnl ++m4_require([_LT_PATH_MANIFEST_TOOL])dnl + m4_require([_LT_FILEUTILS_DEFAULTS])dnl + m4_require([_LT_DECL_EGREP])dnl + m4_require([_LT_DECL_SED])dnl + m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + m4_require([_LT_TAG_COMPILER])dnl + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ # Also, AIX nm treats weak defined symbols like other global defined ++ # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' ++ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" +- ;; ++ ;; + cygwin* | mingw* | cegcc*) +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' +- ;; ++ case $cc_basename in ++ cl*) ++ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ++ ;; ++ *) ++ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' ++ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ++ ;; ++ esac ++ ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- ;; ++ ;; + esac +- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + ], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= +@@ -4253,17 +4648,43 @@ dnl Note also adjust exclude_expsyms for + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes ++ ++ # On some targets, GNU ld is compatible enough with the native linker ++ # that we're better off using the native interface for both. ++ lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then ++ case $host_os in ++ aix*) ++ # The AIX port of GNU ld has always aspired to compatibility ++ # with the native linker. However, as the warning in the GNU ld ++ # block says, versions before 2.19.5* couldn't really create working ++ # shared libraries, regardless of the interface used. ++ case `$LD -v 2>&1` in ++ *\ \(GNU\ Binutils\)\ 2.19.5*) ;; ++ *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; ++ *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; ++ *) ++ lt_use_gnu_ld_interface=yes ++ ;; ++ esac ++ ;; ++ *) ++ lt_use_gnu_ld_interface=yes ++ ;; ++ esac ++ fi ++ ++ if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' +@@ -4271,36 +4692,38 @@ dnl Note also adjust exclude_expsyms for + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in ++ *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +-*** Warning: the GNU linker, at least up to release 2.9.1, is reported ++*** Warning: the GNU linker, at least up to release 2.19, is reported + *** to be unable to reliably create shared libraries on AIX. + *** Therefore, libtool is disabling shared libraries support. If you +-*** really care for shared libraries, you may want to modify your PATH +-*** so that a non-GNU linker is found, and then restart. ++*** really care for shared libraries, you may want to install binutils ++*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. ++*** You will then need to restart the configuration process. + + _LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) +@@ -4326,20 +4749,22 @@ dnl Note also adjust exclude_expsyms for + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' ++ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' ++ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else +@@ -4347,108 +4772,117 @@ dnl Note also adjust exclude_expsyms for + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + ++ haiku*) ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_TAGVAR(link_all_deplibs, $1)=yes ++ ;; ++ + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + +- gnu* | linux* | tpf* | k*bsd*-gnu) ++ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then +- tmp_addflag= ++ tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; +- pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ pgf77* | pgf90* | pgf95* | pgfortran*) ++ # Portland Group f77 and f90 compilers ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; +- xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) ++ xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; ++ nvcc*) # Cuda Compiler Driver 2.2 ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ++ _LT_TAGVAR(compiler_needs_object, $1)=yes ++ ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in +- xlf*) ++ xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' +- _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' ++ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ +- $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' ++ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +@@ -4456,18 +4890,18 @@ dnl Note also adjust exclude_expsyms for + *** create shared libraries on Solaris systems. Therefore, libtool + *** is disabling shared libraries support. We urge you to upgrade GNU + *** binutils to release 2.9.1 or newer. Another option is to modify + *** your PATH or compiler configuration so that the native linker is + *** used, and then restart. + + _LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) +@@ -4503,18 +4937,18 @@ dnl Note also adjust exclude_expsyms for + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= +@@ -4544,18 +4978,20 @@ dnl Note also adjust exclude_expsyms for + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ # Also, AIX nm treats weak defined symbols like other global ++ # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' ++ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. +@@ -4632,35 +5068,40 @@ dnl Note also adjust exclude_expsyms for + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. +- _LT_SYS_MODULE_PATH_AIX ++ _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. +- _LT_SYS_MODULE_PATH_AIX ++ _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' +- # Exported symbols can be pulled into shared objects from archives +- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' ++ if test "$with_gnu_ld" = yes; then ++ # We only use this code for GNU lds that support --whole-archive. ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ++ else ++ # Exported symbols can be pulled into shared objects from archives ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' ++ fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) +@@ -4682,131 +5123,177 @@ dnl Note also adjust exclude_expsyms for + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' +- # FIXME: Should let the user specify the lib program. +- _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' +- _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' +- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ++ case $cc_basename in ++ cl*) ++ # Native MSVC ++ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' ++ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported ++ _LT_TAGVAR(always_export_symbols, $1)=yes ++ _LT_TAGVAR(file_list_spec, $1)='@' ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; ++ else ++ sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; ++ fi~ ++ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ ++ linknames=' ++ # The linker will not automatically build a static lib if we build a DLL. ++ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' ++ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ++ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ++ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' ++ # Don't use ranlib ++ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' ++ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ ++ lt_tool_outputfile="@TOOL_OUTPUT@"~ ++ case $lt_outputfile in ++ *.exe|*.EXE) ;; ++ *) ++ lt_outputfile="$lt_outputfile.exe" ++ lt_tool_outputfile="$lt_tool_outputfile.exe" ++ ;; ++ esac~ ++ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then ++ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; ++ $RM "$lt_outputfile.manifest"; ++ fi' ++ ;; ++ *) ++ # Assume MSVC wrapper ++ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' ++ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' ++ # The linker will automatically build a .lib file if we build a DLL. ++ _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' ++ # FIXME: Should let the user specify the lib program. ++ _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' ++ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ++ ;; ++ esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + +- freebsd1*) +- _LT_TAGVAR(ld_shlibs, $1)=no +- ;; +- + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2*) ++ freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) +- if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ if test "$GCC" = yes && test "$with_gnu_ld" = no; then ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) +- if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ m4_if($1, [], [ ++ # Older versions of the 11.00 compiler do not understand -b yet ++ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) ++ _LT_LINKER_OPTION([if $CC understands -b], ++ _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], ++ [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], ++ [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], ++ [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in +@@ -4824,29 +5311,44 @@ dnl Note also adjust exclude_expsyms for + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" +- AC_LINK_IFELSE(int foo(void) {}, +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' +- ) +- LDFLAGS="$save_LDFLAGS" ++ # This should be the same for all languages, so no per-tag cache variable. ++ AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], ++ [lt_cv_irix_exported_symbol], ++ [save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" ++ AC_LINK_IFELSE( ++ [AC_LANG_SOURCE( ++ [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], ++ [C++], [[int foo (void) { return 0; }]], ++ [Fortran 77], [[ ++ subroutine foo ++ end]], ++ [Fortran], [[ ++ subroutine foo ++ end]])])], ++ [lt_cv_irix_exported_symbol=yes], ++ [lt_cv_irix_exported_symbol=no]) ++ LDFLAGS="$save_LDFLAGS"]) ++ if test "$lt_cv_irix_exported_symbol" = yes; then ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' ++ fi + else +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + +@@ -4898,58 +5400,58 @@ dnl Note also adjust exclude_expsyms for + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' ++ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ +- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' ++ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ++ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; +@@ -5115,46 +5617,48 @@ x|xyes) + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. +- AC_MSG_CHECKING([whether -lc should be explicitly linked in]) +- $RM conftest* +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- if AC_TRY_EVAL(ac_compile) 2>conftest.err; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) +- pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) +- _LT_TAGVAR(allow_undefined_flag, $1)= +- if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) +- then +- _LT_TAGVAR(archive_cmds_need_lc, $1)=no +- else +- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes +- fi +- _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +- $RM conftest* +- AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) ++ AC_CACHE_CHECK([whether -lc should be explicitly linked in], ++ [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), ++ [$RM conftest* ++ echo "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then ++ soname=conftest ++ lib=conftest ++ libobjs=conftest.$ac_objext ++ deplibs= ++ wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) ++ pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) ++ compiler_flags=-v ++ linker_flags=-v ++ verstring= ++ output_objdir=. ++ libname=conftest ++ lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) ++ _LT_TAGVAR(allow_undefined_flag, $1)= ++ if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) ++ then ++ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no ++ else ++ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes ++ fi ++ _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag ++ else ++ cat conftest.err 1>&5 ++ fi ++ $RM conftest* ++ ]) ++ _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; + esac + + _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +@@ -5181,19 +5685,16 @@ esac + [Whether we are building with GNU ld or not]) + _LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) + _LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) + _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], +- [[If ld is used when linking, flag to hardcode $libdir into a binary +- during linking. This must work even if $libdir does not exist]]) + _LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) + _LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) + _LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is +@@ -5209,28 +5710,28 @@ esac + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) + _LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) + _LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +-_LT_TAGDECL([], [fix_srcfile_path], [1], +- [Fix the shell variable $srcfile for the compiler]) + _LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) + _LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) + _LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) + _LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) + _LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) ++_LT_TAGDECL([], [postlink_cmds], [2], ++ [Commands necessary for finishing linking programs]) + _LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) + dnl FIXME: Not yet implemented + dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], + dnl [Compiler flag to generate thread safe objects]) + ])# _LT_LINKER_SHLIBS + + +@@ -5314,68 +5815,54 @@ if test -n "$compiler"; then + + _LT_CONFIG($1) + fi + AC_LANG_POP + CC="$lt_save_CC" + ])# _LT_LANG_C_CONFIG + + +-# _LT_PROG_CXX +-# ------------ +-# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +-# compiler, we have our own version here. +-m4_defun([_LT_PROG_CXX], +-[ +-pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +-AC_PROG_CXX ++# _LT_LANG_CXX_CONFIG([TAG]) ++# -------------------------- ++# Ensure that the configuration variables for a C++ compiler are suitably ++# defined. These variables are subsequently used by _LT_CONFIG to write ++# the compiler configuration to `libtool'. ++m4_defun([_LT_LANG_CXX_CONFIG], ++[m4_require([_LT_FILEUTILS_DEFAULTS])dnl ++m4_require([_LT_DECL_EGREP])dnl ++m4_require([_LT_PATH_MANIFEST_TOOL])dnl + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP + else + _lt_caught_CXX_error=yes + fi +-popdef([AC_MSG_ERROR]) +-])# _LT_PROG_CXX +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([_LT_PROG_CXX], []) +- +- +-# _LT_LANG_CXX_CONFIG([TAG]) +-# -------------------------- +-# Ensure that the configuration variables for a C++ compiler are suitably +-# defined. These variables are subsequently used by _LT_CONFIG to write +-# the compiler configuration to `libtool'. +-m4_defun([_LT_LANG_CXX_CONFIG], +-[AC_REQUIRE([_LT_PROG_CXX])dnl +-m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_EGREP])dnl + + AC_LANG_PUSH(C++) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ++_LT_TAGVAR(reload_flag, $1)=$reload_flag ++_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + _LT_TAGVAR(no_undefined_flag, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + + # Source file extension for C++ test sources. + ac_ext=cpp + + # Object file extension for compiled C++ test sources. +@@ -5397,16 +5884,17 @@ if test "$_lt_caught_CXX_error" != yes; + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC ++ lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else +@@ -5414,16 +5902,17 @@ if test "$_lt_caught_CXX_error" != yes; + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} ++ CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then +@@ -5435,18 +5924,18 @@ if test "$_lt_caught_CXX_error" != yes; + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' +@@ -5468,17 +5957,17 @@ if test "$_lt_caught_CXX_error" != yes; + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics +@@ -5577,36 +6066,41 @@ if test "$_lt_caught_CXX_error" != yes; + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. +- _LT_SYS_MODULE_PATH_AIX ++ _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + +- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. +- _LT_SYS_MODULE_PATH_AIX ++ _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' +- # Exported symbols can be pulled into shared objects from archives +- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' ++ if test "$with_gnu_ld" = yes; then ++ # We only use this code for GNU lds that support --whole-archive. ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ++ else ++ # Exported symbols can be pulled into shared objects from archives ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' ++ fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + +@@ -5626,38 +6120,85 @@ if test "$_lt_caught_CXX_error" != yes; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) +- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, +- # as there is no search path for DLLs. +- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported +- _LT_TAGVAR(always_export_symbols, $1)=no +- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes +- +- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is; otherwise, prepend... +- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname.def; +- else +- echo EXPORTS > $output_objdir/$soname.def; +- cat $export_symbols >> $output_objdir/$soname.def; +- fi~ +- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- else +- _LT_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; ++ case $GXX,$cc_basename in ++ ,cl* | no,cl*) ++ # Native MSVC ++ # hardcode_libdir_flag_spec is actually meaningless, as there is ++ # no search path for DLLs. ++ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' ++ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported ++ _LT_TAGVAR(always_export_symbols, $1)=yes ++ _LT_TAGVAR(file_list_spec, $1)='@' ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; ++ else ++ $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; ++ fi~ ++ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ ++ linknames=' ++ # The linker will not automatically build a static lib if we build a DLL. ++ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' ++ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ++ # Don't use ranlib ++ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' ++ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ ++ lt_tool_outputfile="@TOOL_OUTPUT@"~ ++ case $lt_outputfile in ++ *.exe|*.EXE) ;; ++ *) ++ lt_outputfile="$lt_outputfile.exe" ++ lt_tool_outputfile="$lt_tool_outputfile.exe" ++ ;; ++ esac~ ++ func_to_tool_file "$lt_outputfile"~ ++ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then ++ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; ++ $RM "$lt_outputfile.manifest"; ++ fi' ++ ;; ++ *) ++ # g++ ++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, ++ # as there is no search path for DLLs. ++ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' ++ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported ++ _LT_TAGVAR(always_export_symbols, $1)=no ++ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ++ ++ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' ++ # If the export-symbols file already is a .def file (1st line ++ # is EXPORTS), use it as is; otherwise, prepend... ++ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ cp $export_symbols $output_objdir/$soname.def; ++ else ++ echo EXPORTS > $output_objdir/$soname.def; ++ cat $export_symbols >> $output_objdir/$soname.def; ++ fi~ ++ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' ++ else ++ _LT_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ esac ++ ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support +@@ -5670,17 +6211,17 @@ if test "$_lt_caught_CXX_error" != yes; + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + +- freebsd[[12]]*) ++ freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; +@@ -5689,16 +6230,21 @@ if test "$_lt_caught_CXX_error" != yes; + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + ++ haiku*) ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_TAGVAR(link_all_deplibs, $1)=yes ++ ;; ++ + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. +@@ -5713,21 +6259,21 @@ if test "$_lt_caught_CXX_error" != yes; + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then +- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + +@@ -5778,30 +6324,30 @@ if test "$_lt_caught_CXX_error" != yes; + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; +@@ -5821,41 +6367,41 @@ if test "$_lt_caught_CXX_error" != yes; + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + +- linux* | k*bsd*-gnu) ++ linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' +@@ -5863,17 +6409,17 @@ if test "$_lt_caught_CXX_error" != yes; + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. +- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ++ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; +@@ -5900,44 +6446,44 @@ if test "$_lt_caught_CXX_error" != yes; + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in +- *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) ++ *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ +- compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' ++ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ +- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ ++ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' ++ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ++ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; +- *) # Version 6 will use weak symbols ++ *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' +@@ -5946,19 +6492,19 @@ if test "$_lt_caught_CXX_error" != yes; + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; +- xl*) ++ xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ +@@ -5968,23 +6514,23 @@ if test "$_lt_caught_CXX_error" != yes; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ++ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. +- output_verbose_link_cmd='echo' ++ output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac +@@ -6043,17 +6589,17 @@ if test "$_lt_caught_CXX_error" != yes; + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi +- output_verbose_link_cmd=echo ++ output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) +@@ -6078,61 +6624,61 @@ if test "$_lt_caught_CXX_error" != yes; + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ +- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ ++ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; +@@ -6158,17 +6704,17 @@ if test "$_lt_caught_CXX_error" != yes; + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in +- CC*) ++ CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' +@@ -6179,17 +6725,17 @@ if test "$_lt_caught_CXX_error" != yes; + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + +- output_verbose_link_cmd='echo' ++ output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) +@@ -6199,35 +6745,35 @@ if test "$_lt_caught_CXX_error" != yes; + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then +- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' ++ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. +- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' ++ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; +@@ -6271,16 +6817,20 @@ if test "$_lt_caught_CXX_error" != yes; + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ ++ '"$_LT_TAGVAR(old_archive_cmds, $1)" ++ _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ ++ '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + +@@ -6326,38 +6876,63 @@ if test "$_lt_caught_CXX_error" != yes; + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC ++ CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + fi # test "$_lt_caught_CXX_error" != yes + + AC_LANG_POP + ])# _LT_LANG_CXX_CONFIG + + ++# _LT_FUNC_STRIPNAME_CNF ++# ---------------------- ++# func_stripname_cnf prefix suffix name ++# strip PREFIX and SUFFIX off of NAME. ++# PREFIX and SUFFIX must not contain globbing or regex special ++# characters, hashes, percent signs, but SUFFIX may contain a leading ++# dot (in which case that matches only a dot). ++# ++# This function is identical to the (non-XSI) version of func_stripname, ++# except this one can be used by m4 code that may be executed by configure, ++# rather than the libtool script. ++m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl ++AC_REQUIRE([_LT_DECL_SED]) ++AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) ++func_stripname_cnf () ++{ ++ case ${2} in ++ .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; ++ *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; ++ esac ++} # func_stripname_cnf ++])# _LT_FUNC_STRIPNAME_CNF ++ + # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) + # --------------------------------- + # Figure out "hidden" library dependencies from verbose + # compiler output when linking a shared library. + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + m4_defun([_LT_SYS_HIDDEN_LIBDEPS], + [m4_require([_LT_FILEUTILS_DEFAULTS])dnl ++AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl + # Dependencies to place before and after the object being linked: + _LT_TAGVAR(predep_objects, $1)= + _LT_TAGVAR(postdep_objects, $1)= + _LT_TAGVAR(predeps, $1)= + _LT_TAGVAR(postdeps, $1)= + _LT_TAGVAR(compiler_lib_search_path, $1)= + + dnl we can't use the lt_simple_compile_test_code here, +@@ -6397,44 +6972,66 @@ private: + ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF + public class foo { + private int a; + public void bar (void) { + a = 0; + } + }; + _LT_EOF ++], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF ++package foo ++func foo() { ++} ++_LT_EOF + ]) ++ ++_lt_libdeps_save_CFLAGS=$CFLAGS ++case "$CC $CFLAGS " in #( ++*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; ++*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; ++*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; ++esac ++ + dnl Parse the compiler output and extract the necessary + dnl objects, libraries and library flags. + if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do +- case $p in ++ case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue +- else +- prev= + fi + ++ # Expand the sysroot to ease extracting the directories later. ++ if test -z "$prev"; then ++ case $p in ++ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; ++ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; ++ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; ++ esac ++ fi ++ case $p in ++ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; ++ esac + if test "$pre_test_object_deps_done" = no; then +- case $p in +- -L* | -R*) ++ case ${prev} in ++ -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi +@@ -6444,18 +7041,20 @@ if AC_TRY_EVAL(ac_compile); then + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi ++ prev= + ;; + ++ *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + +@@ -6481,16 +7080,17 @@ if AC_TRY_EVAL(ac_compile); then + + # Clean up. + rm -f a.out a.exe + else + echo "libtool.m4: error: problem compiling $1 test program" + fi + + $RM -f confest.$objext ++CFLAGS=$_lt_libdeps_save_CFLAGS + + # PORTME: override above test on systems where it is broken + m4_if([$1], [CXX], + [case $host_os in + interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= +@@ -6517,17 +7117,17 @@ linux*) + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + case $cc_basename in +- CC*) ++ CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; +@@ -6561,60 +7161,45 @@ fi + _LT_TAGDECL([], [predeps], [1]) + _LT_TAGDECL([], [postdeps], [1]) + _LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) + ])# _LT_SYS_HIDDEN_LIBDEPS + + +-# _LT_PROG_F77 +-# ------------ +-# Since AC_PROG_F77 is broken, in that it returns the empty string +-# if there is no fortran compiler, we have our own version here. +-m4_defun([_LT_PROG_F77], +-[ +-pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +-AC_PROG_F77 +-if test -z "$F77" || test "X$F77" = "Xno"; then +- _lt_disable_F77=yes +-fi +-popdef([AC_MSG_ERROR]) +-])# _LT_PROG_F77 +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([_LT_PROG_F77], []) +- +- + # _LT_LANG_F77_CONFIG([TAG]) + # -------------------------- + # Ensure that the configuration variables for a Fortran 77 compiler are + # suitably defined. These variables are subsequently used by _LT_CONFIG + # to write the compiler configuration to `libtool'. + m4_defun([_LT_LANG_F77_CONFIG], +-[AC_REQUIRE([_LT_PROG_F77])dnl +-AC_LANG_PUSH(Fortran 77) ++[AC_LANG_PUSH(Fortran 77) ++if test -z "$F77" || test "X$F77" = "Xno"; then ++ _lt_disable_F77=yes ++fi + + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ++_LT_TAGVAR(reload_flag, $1)=$reload_flag ++_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + _LT_TAGVAR(no_undefined_flag, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + + # Source file extension for f77 test sources. + ac_ext=f + + # Object file extension for compiled f77 test sources. +@@ -6644,17 +7229,19 @@ if test "$_lt_disable_F77" != yes; then + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC ++ lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} ++ CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + +@@ -6698,66 +7285,53 @@ if test "$_lt_disable_F77" != yes; then + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" ++ CFLAGS="$lt_save_CFLAGS" + fi # test "$_lt_disable_F77" != yes + + AC_LANG_POP + ])# _LT_LANG_F77_CONFIG + + +-# _LT_PROG_FC +-# ----------- +-# Since AC_PROG_FC is broken, in that it returns the empty string +-# if there is no fortran compiler, we have our own version here. +-m4_defun([_LT_PROG_FC], +-[ +-pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +-AC_PROG_FC +-if test -z "$FC" || test "X$FC" = "Xno"; then +- _lt_disable_FC=yes +-fi +-popdef([AC_MSG_ERROR]) +-])# _LT_PROG_FC +- +-dnl aclocal-1.4 backwards compatibility: +-dnl AC_DEFUN([_LT_PROG_FC], []) +- +- + # _LT_LANG_FC_CONFIG([TAG]) + # ------------------------- + # Ensure that the configuration variables for a Fortran compiler are + # suitably defined. These variables are subsequently used by _LT_CONFIG + # to write the compiler configuration to `libtool'. + m4_defun([_LT_LANG_FC_CONFIG], +-[AC_REQUIRE([_LT_PROG_FC])dnl +-AC_LANG_PUSH(Fortran) ++[AC_LANG_PUSH(Fortran) ++ ++if test -z "$FC" || test "X$FC" = "Xno"; then ++ _lt_disable_FC=yes ++fi + + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ++_LT_TAGVAR(reload_flag, $1)=$reload_flag ++_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + _LT_TAGVAR(no_undefined_flag, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + + # Source file extension for fc test sources. + ac_ext=${ac_fc_srcext-f} + + # Object file extension for compiled fc test sources. +@@ -6787,17 +7361,19 @@ if test "$_lt_disable_FC" != yes; then + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC ++ lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} ++ CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) +@@ -6843,17 +7419,18 @@ if test "$_lt_disable_FC" != yes; then + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC +- CC="$lt_save_CC" ++ CC=$lt_save_CC ++ CFLAGS=$lt_save_CFLAGS + fi # test "$_lt_disable_FC" != yes + + AC_LANG_POP + ])# _LT_LANG_FC_CONFIG + + + # _LT_LANG_GCJ_CONFIG([TAG]) + # -------------------------- +@@ -6880,29 +7457,33 @@ lt_simple_link_test_code='public class c + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. +-lt_save_CC="$CC" ++lt_save_CC=$CC ++lt_save_CFLAGS=$CFLAGS + lt_save_GCC=$GCC + GCC=yes + CC=${GCJ-"gcj"} ++CFLAGS=$GCJFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_TAGVAR(LD, $1)="$LD" + _LT_CC_BASENAME([$compiler]) + + # GCJ did not exist at the time GCC didn't implicitly link libc in. + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + + _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ++_LT_TAGVAR(reload_flag, $1)=$reload_flag ++_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) +@@ -6912,20 +7493,92 @@ if test -n "$compiler"; then + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi + + AC_LANG_RESTORE + + GCC=$lt_save_GCC +-CC="$lt_save_CC" ++CC=$lt_save_CC ++CFLAGS=$lt_save_CFLAGS + ])# _LT_LANG_GCJ_CONFIG + + ++# _LT_LANG_GO_CONFIG([TAG]) ++# -------------------------- ++# Ensure that the configuration variables for the GNU Go compiler ++# are suitably defined. These variables are subsequently used by _LT_CONFIG ++# to write the compiler configuration to `libtool'. ++m4_defun([_LT_LANG_GO_CONFIG], ++[AC_REQUIRE([LT_PROG_GO])dnl ++AC_LANG_SAVE ++ ++# Source file extension for Go test sources. ++ac_ext=go ++ ++# Object file extension for compiled Go test sources. ++objext=o ++_LT_TAGVAR(objext, $1)=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code="package main; func main() { }" ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code='package main; func main() { }' ++ ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. ++_LT_TAG_COMPILER ++ ++# save warnings/boilerplate of simple test code ++_LT_COMPILER_BOILERPLATE ++_LT_LINKER_BOILERPLATE ++ ++# Allow CC to be a program name with arguments. ++lt_save_CC=$CC ++lt_save_CFLAGS=$CFLAGS ++lt_save_GCC=$GCC ++GCC=yes ++CC=${GOC-"gccgo"} ++CFLAGS=$GOFLAGS ++compiler=$CC ++_LT_TAGVAR(compiler, $1)=$CC ++_LT_TAGVAR(LD, $1)="$LD" ++_LT_CC_BASENAME([$compiler]) ++ ++# Go did not exist at the time GCC didn't implicitly link libc in. ++_LT_TAGVAR(archive_cmds_need_lc, $1)=no ++ ++_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ++_LT_TAGVAR(reload_flag, $1)=$reload_flag ++_LT_TAGVAR(reload_cmds, $1)=$reload_cmds ++ ++## CAVEAT EMPTOR: ++## There is no encapsulation within the following macros, do not change ++## the running order or otherwise move them around unless you know exactly ++## what you are doing... ++if test -n "$compiler"; then ++ _LT_COMPILER_NO_RTTI($1) ++ _LT_COMPILER_PIC($1) ++ _LT_COMPILER_C_O($1) ++ _LT_COMPILER_FILE_LOCKS($1) ++ _LT_LINKER_SHLIBS($1) ++ _LT_LINKER_HARDCODE_LIBPATH($1) ++ ++ _LT_CONFIG($1) ++fi ++ ++AC_LANG_RESTORE ++ ++GCC=$lt_save_GCC ++CC=$lt_save_CC ++CFLAGS=$lt_save_CFLAGS ++])# _LT_LANG_GO_CONFIG ++ ++ + # _LT_LANG_RC_CONFIG([TAG]) + # ------------------------- + # Ensure that the configuration variables for the Windows resource compiler + # are suitably defined. These variables are subsequently used by _LT_CONFIG + # to write the compiler configuration to `libtool'. + m4_defun([_LT_LANG_RC_CONFIG], + [AC_REQUIRE([LT_PROG_RC])dnl + AC_LANG_SAVE +@@ -6947,32 +7600,35 @@ lt_simple_link_test_code="$lt_simple_com + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" ++lt_save_CFLAGS=$CFLAGS + lt_save_GCC=$GCC + GCC= + CC=${RC-"windres"} ++CFLAGS= + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + + if test -n "$compiler"; then + : + _LT_CONFIG($1) + fi + + GCC=$lt_save_GCC + AC_LANG_RESTORE +-CC="$lt_save_CC" ++CC=$lt_save_CC ++CFLAGS=$lt_save_CFLAGS + ])# _LT_LANG_RC_CONFIG + + + # LT_PROG_GCJ + # ----------- + AC_DEFUN([LT_PROG_GCJ], + [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], +@@ -6982,16 +7638,23 @@ AC_DEFUN([LT_PROG_GCJ], + ]) + + # Old name: + AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) + dnl aclocal-1.4 backwards compatibility: + dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + ++# LT_PROG_GO ++# ---------- ++AC_DEFUN([LT_PROG_GO], ++[AC_CHECK_TOOL(GOC, gccgo,) ++]) ++ ++ + # LT_PROG_RC + # ---------- + AC_DEFUN([LT_PROG_RC], + [AC_CHECK_TOOL(RC, windres,) + ]) + + # Old name: + AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +@@ -7021,16 +7684,25 @@ AC_SUBST([GREP]) + # available, choose the one first in the user's PATH. + m4_defun([_LT_DECL_OBJDUMP], + [AC_CHECK_TOOL(OBJDUMP, objdump, false) + test -z "$OBJDUMP" && OBJDUMP=objdump + _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) + AC_SUBST([OBJDUMP]) + ]) + ++# _LT_DECL_DLLTOOL ++# ---------------- ++# Ensure DLLTOOL variable is set. ++m4_defun([_LT_DECL_DLLTOOL], ++[AC_CHECK_TOOL(DLLTOOL, dlltool, false) ++test -z "$DLLTOOL" && DLLTOOL=dlltool ++_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) ++AC_SUBST([DLLTOOL]) ++]) + + # _LT_DECL_SED + # ------------ + # Check for a fully-functional sed program, that truncates + # as few characters as possible. Prefer GNU sed if found. + m4_defun([_LT_DECL_SED], + [AC_PROG_SED + test -z "$SED" && SED=sed +@@ -7114,18 +7786,18 @@ dnl AC_DEFUN([LT_AC_PROG_SED], []) + # ------------------------ + # Find out whether the shell is Bourne or XSI compatible, + # or has some other useful features. + m4_defun([_LT_CHECK_SHELL_FEATURES], + [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) + # Try some XSI features + xsi_shell=no + ( _lt_dummy="a/b/c" +- test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ +- = c,a/b,, \ ++ test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ ++ = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes + AC_MSG_RESULT([$xsi_shell]) + _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + + AC_MSG_CHECKING([whether the shell understands "+="]) + lt_shell_append=no +@@ -7154,213 +7826,167 @@ case `echo X|tr X '\101'` in + lt_NL2SP='tr \r\n \100\100' + ;; + esac + _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl + _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl + ])# _LT_CHECK_SHELL_FEATURES + + +-# _LT_PROG_XSI_SHELLFNS +-# --------------------- +-# Bourne and XSI compatible variants of some useful shell functions. +-m4_defun([_LT_PROG_XSI_SHELLFNS], +-[case $xsi_shell in +- yes) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_dirname file append nondir_replacement +-# Compute the dirname of FILE. If nonempty, add APPEND to the result, +-# otherwise set result to NONDIR_REPLACEMENT. +-func_dirname () +-{ +- case ${1} in +- */*) func_dirname_result="${1%/*}${2}" ;; +- * ) func_dirname_result="${3}" ;; +- esac +-} +- +-# func_basename file +-func_basename () +-{ +- func_basename_result="${1##*/}" +-} +- +-# func_dirname_and_basename file append nondir_replacement +-# perform func_basename and func_dirname in a single function +-# call: +-# dirname: Compute the dirname of FILE. If nonempty, +-# add APPEND to the result, otherwise set result +-# to NONDIR_REPLACEMENT. +-# value returned in "$func_dirname_result" +-# basename: Compute filename of FILE. +-# value retuned in "$func_basename_result" +-# Implementation must be kept synchronized with func_dirname +-# and func_basename. For efficiency, we do not delegate to +-# those functions but instead duplicate the functionality here. +-func_dirname_and_basename () +-{ +- case ${1} in +- */*) func_dirname_result="${1%/*}${2}" ;; +- * ) func_dirname_result="${3}" ;; +- esac +- func_basename_result="${1##*/}" +-} +- +-# func_stripname prefix suffix name +-# strip PREFIX and SUFFIX off of NAME. +-# PREFIX and SUFFIX must not contain globbing or regex special +-# characters, hashes, percent signs, but SUFFIX may contain a leading +-# dot (in which case that matches only a dot). +-func_stripname () +-{ +- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are +- # positional parameters, so assign one to ordinary parameter first. +- func_stripname_result=${3} +- func_stripname_result=${func_stripname_result#"${1}"} +- func_stripname_result=${func_stripname_result%"${2}"} +-} +- +-# func_opt_split +-func_opt_split () +-{ +- func_opt_split_opt=${1%%=*} +- func_opt_split_arg=${1#*=} +-} +- +-# func_lo2o object +-func_lo2o () +-{ +- case ${1} in +- *.lo) func_lo2o_result=${1%.lo}.${objext} ;; +- *) func_lo2o_result=${1} ;; +- esac +-} +- +-# func_xform libobj-or-source +-func_xform () +-{ +- func_xform_result=${1%.*}.lo +-} +- +-# func_arith arithmetic-term... +-func_arith () +-{ +- func_arith_result=$(( $[*] )) +-} +- +-# func_len string +-# STRING may not start with a hyphen. +-func_len () +-{ +- func_len_result=${#1} +-} +- +-_LT_EOF ++# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) ++# ------------------------------------------------------ ++# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and ++# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. ++m4_defun([_LT_PROG_FUNCTION_REPLACE], ++[dnl { ++sed -e '/^$1 ()$/,/^} # $1 /c\ ++$1 ()\ ++{\ ++m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) ++} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++test 0 -eq $? || _lt_function_replace_fail=: ++]) ++ ++ ++# _LT_PROG_REPLACE_SHELLFNS ++# ------------------------- ++# Replace existing portable implementations of several shell functions with ++# equivalent extended shell implementations where those features are available.. ++m4_defun([_LT_PROG_REPLACE_SHELLFNS], ++[if test x"$xsi_shell" = xyes; then ++ _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl ++ case ${1} in ++ */*) func_dirname_result="${1%/*}${2}" ;; ++ * ) func_dirname_result="${3}" ;; ++ esac]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl ++ func_basename_result="${1##*/}"]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl ++ case ${1} in ++ */*) func_dirname_result="${1%/*}${2}" ;; ++ * ) func_dirname_result="${3}" ;; ++ esac ++ func_basename_result="${1##*/}"]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl ++ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are ++ # positional parameters, so assign one to ordinary parameter first. ++ func_stripname_result=${3} ++ func_stripname_result=${func_stripname_result#"${1}"} ++ func_stripname_result=${func_stripname_result%"${2}"}]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl ++ func_split_long_opt_name=${1%%=*} ++ func_split_long_opt_arg=${1#*=}]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl ++ func_split_short_opt_arg=${1#??} ++ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl ++ case ${1} in ++ *.lo) func_lo2o_result=${1%.lo}.${objext} ;; ++ *) func_lo2o_result=${1} ;; ++ esac]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) ++fi ++ ++if test x"$lt_shell_append" = xyes; then ++ _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) ++ ++ _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl ++ func_quote_for_eval "${2}" ++dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ ++ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) ++ ++ # Save a `func_append' function call where possible by direct use of '+=' ++ sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++ test 0 -eq $? || _lt_function_replace_fail=: ++else ++ # Save a `func_append' function call even when '+=' is not available ++ sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ ++ && mv -f "$cfgfile.tmp" "$cfgfile" \ ++ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") ++ test 0 -eq $? || _lt_function_replace_fail=: ++fi ++ ++if test x"$_lt_function_replace_fail" = x":"; then ++ AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) ++fi ++]) ++ ++# _LT_PATH_CONVERSION_FUNCTIONS ++# ----------------------------- ++# Determine which file name conversion functions should be used by ++# func_to_host_file (and, implicitly, by func_to_host_path). These are needed ++# for certain cross-compile configurations and native mingw. ++m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], ++[AC_REQUIRE([AC_CANONICAL_HOST])dnl ++AC_REQUIRE([AC_CANONICAL_BUILD])dnl ++AC_MSG_CHECKING([how to convert $build file names to $host format]) ++AC_CACHE_VAL(lt_cv_to_host_file_cmd, ++[case $host in ++ *-*-mingw* ) ++ case $build in ++ *-*-mingw* ) # actually msys ++ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ++ ;; ++ *-*-cygwin* ) ++ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ++ ;; ++ * ) # otherwise, assume *nix ++ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ++ ;; ++ esac + ;; +- *) # Bourne compatible functions. +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_dirname file append nondir_replacement +-# Compute the dirname of FILE. If nonempty, add APPEND to the result, +-# otherwise set result to NONDIR_REPLACEMENT. +-func_dirname () +-{ +- # Extract subdirectory from the argument. +- func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` +- if test "X$func_dirname_result" = "X${1}"; then +- func_dirname_result="${3}" +- else +- func_dirname_result="$func_dirname_result${2}" +- fi +-} +- +-# func_basename file +-func_basename () +-{ +- func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +-} +- +-dnl func_dirname_and_basename +-dnl A portable version of this function is already defined in general.m4sh +-dnl so there is no need for it here. +- +-# func_stripname prefix suffix name +-# strip PREFIX and SUFFIX off of NAME. +-# PREFIX and SUFFIX must not contain globbing or regex special +-# characters, hashes, percent signs, but SUFFIX may contain a leading +-# dot (in which case that matches only a dot). +-# func_strip_suffix prefix name +-func_stripname () +-{ +- case ${2} in +- .*) func_stripname_result=`$ECHO "X${3}" \ +- | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; +- *) func_stripname_result=`$ECHO "X${3}" \ +- | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; +- esac +-} +- +-# sed scripts: +-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +-my_sed_long_arg='1s/^-[[^=]]*=//' +- +-# func_opt_split +-func_opt_split () +-{ +- func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` +- func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +-} +- +-# func_lo2o object +-func_lo2o () +-{ +- func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +-} +- +-# func_xform libobj-or-source +-func_xform () +-{ +- func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +-} +- +-# func_arith arithmetic-term... +-func_arith () +-{ +- func_arith_result=`expr "$[@]"` +-} +- +-# func_len string +-# STRING may not start with a hyphen. +-func_len () +-{ +- func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +-} +- +-_LT_EOF ++ *-*-cygwin* ) ++ case $build in ++ *-*-mingw* ) # actually msys ++ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ++ ;; ++ *-*-cygwin* ) ++ lt_cv_to_host_file_cmd=func_convert_file_noop ++ ;; ++ * ) # otherwise, assume *nix ++ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ++ ;; ++ esac ++ ;; ++ * ) # unhandled hosts (and "normal" native builds) ++ lt_cv_to_host_file_cmd=func_convert_file_noop ++ ;; + esac +- +-case $lt_shell_append in +- yes) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_append var value +-# Append VALUE to the end of shell variable VAR. +-func_append () +-{ +- eval "$[1]+=\$[2]" +-} +-_LT_EOF ++]) ++to_host_file_cmd=$lt_cv_to_host_file_cmd ++AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) ++_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], ++ [0], [convert $build file names to $host format])dnl ++ ++AC_MSG_CHECKING([how to convert $build file names to toolchain format]) ++AC_CACHE_VAL(lt_cv_to_tool_file_cmd, ++[#assume ordinary cross tools, or native build. ++lt_cv_to_tool_file_cmd=func_convert_file_noop ++case $host in ++ *-*-mingw* ) ++ case $build in ++ *-*-mingw* ) # actually msys ++ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ++ ;; ++ esac + ;; +- *) +- cat << \_LT_EOF >> "$cfgfile" +- +-# func_append var value +-# Append VALUE to the end of shell variable VAR. +-func_append () +-{ +- eval "$[1]=\$$[1]\$[2]" +-} +- +-_LT_EOF +- ;; +- esac ++esac + ]) ++to_tool_file_cmd=$lt_cv_to_tool_file_cmd ++AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) ++_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], ++ [0], [convert $build files to toolchain format])dnl ++])# _LT_PATH_CONVERSION_FUNCTIONS +diff --git a/js/src/ctypes/libffi/m4/ltoptions.m4 b/js/src/ctypes/libffi/m4/ltoptions.m4 +--- a/js/src/ctypes/libffi/m4/ltoptions.m4 ++++ b/js/src/ctypes/libffi/m4/ltoptions.m4 +@@ -1,18 +1,19 @@ + # Helper functions for option handling. -*- Autoconf -*- + # +-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. ++# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, ++# Inc. + # Written by Gary V. Vaughan, 2004 + # + # This file is free software; the Free Software Foundation gives + # unlimited permission to copy and/or distribute it, with or without + # modifications, as long as this notice is preserved. + +-# serial 6 ltoptions.m4 ++# serial 7 ltoptions.m4 + + # This is to help aclocal find these macros, as it can't see m4_define. + AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + + # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) + # ------------------------------------------ + m4_define([_LT_MANGLE_OPTION], +@@ -120,31 +121,31 @@ dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + # win32-dll + # --------- + # Declare package support for building win32 dll's. + LT_OPTION_DEFINE([LT_INIT], [win32-dll], + [enable_win32_dll=yes + + case $host in +-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) ++*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + esac + + test -z "$AS" && AS=as +-_LT_DECL([], [AS], [0], [Assembler program])dnl ++_LT_DECL([], [AS], [1], [Assembler program])dnl + + test -z "$DLLTOOL" && DLLTOOL=dlltool +-_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl ++_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + + test -z "$OBJDUMP" && OBJDUMP=objdump +-_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl ++_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl + ])# win32-dll + + AU_DEFUN([AC_LIBTOOL_WIN32_DLL], + [AC_REQUIRE([AC_CANONICAL_HOST])dnl + _LT_SET_OPTION([LT_INIT], [win32-dll]) + AC_DIAGNOSE([obsolete], + [$0: Remove this warning and the call to _LT_SET_OPTION when you + put the `win32-dll' option into LT_INIT's first parameter.]) +@@ -320,19 +321,34 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], + + # _LT_WITH_PIC([MODE]) + # -------------------- + # implement the --with-pic flag, and support the `pic-only' and `no-pic' + # LT_INIT options. + # MODE is either `yes' or `no'. If omitted, it defaults to `both'. + m4_define([_LT_WITH_PIC], + [AC_ARG_WITH([pic], +- [AS_HELP_STRING([--with-pic], ++ [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], +- [pic_mode="$withval"], ++ [lt_p=${PACKAGE-default} ++ case $withval in ++ yes|no) pic_mode=$withval ;; ++ *) ++ pic_mode=default ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for lt_pkg in $withval; do ++ IFS="$lt_save_ifs" ++ if test "X$lt_pkg" = "X$lt_p"; then ++ pic_mode=yes ++ fi ++ done ++ IFS="$lt_save_ifs" ++ ;; ++ esac], + [pic_mode=default]) + + test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + + _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl + ])# _LT_WITH_PIC + + LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +diff --git a/js/src/ctypes/libffi/m4/ltversion.m4 b/js/src/ctypes/libffi/m4/ltversion.m4 +--- a/js/src/ctypes/libffi/m4/ltversion.m4 ++++ b/js/src/ctypes/libffi/m4/ltversion.m4 +@@ -2,22 +2,22 @@ + # + # Copyright (C) 2004 Free Software Foundation, Inc. + # Written by Scott James Remnant, 2004 + # + # This file is free software; the Free Software Foundation gives + # unlimited permission to copy and/or distribute it, with or without + # modifications, as long as this notice is preserved. + +-# Generated from ltversion.in. ++# @configure_input@ + +-# serial 3017 ltversion.m4 ++# serial 3337 ltversion.m4 + # This file is part of GNU Libtool + +-m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +-m4_define([LT_PACKAGE_REVISION], [1.3017]) ++m4_define([LT_PACKAGE_VERSION], [2.4.2]) ++m4_define([LT_PACKAGE_REVISION], [1.3337]) + + AC_DEFUN([LTVERSION_VERSION], +-[macro_version='2.2.6b' +-macro_revision='1.3017' ++[macro_version='2.4.2' ++macro_revision='1.3337' + _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) + _LT_DECL(, macro_revision, 0) + ]) +diff --git a/js/src/ctypes/libffi/m4/lt~obsolete.m4 b/js/src/ctypes/libffi/m4/lt~obsolete.m4 +--- a/js/src/ctypes/libffi/m4/lt~obsolete.m4 ++++ b/js/src/ctypes/libffi/m4/lt~obsolete.m4 +@@ -1,18 +1,18 @@ + # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- + # +-# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. ++# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. + # Written by Scott James Remnant, 2004. + # + # This file is free software; the Free Software Foundation gives + # unlimited permission to copy and/or distribute it, with or without + # modifications, as long as this notice is preserved. + +-# serial 4 lt~obsolete.m4 ++# serial 5 lt~obsolete.m4 + + # These exist entirely to fool aclocal when bootstrapping libtool. + # + # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) + # which have later been changed to m4_define as they aren't part of the + # exported API, or moved to Autoconf or Automake where they belong. + # + # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +@@ -72,21 +72,27 @@ m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN + m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) + m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) + m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) + m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) + m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) + m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) + m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) + m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +-m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) + m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) + m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) + m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) + m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) + m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) + m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) + m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) + m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) + m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) + m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) + m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) + m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) ++m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) ++m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) ++m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) ++m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) ++m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) ++m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) ++m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) +diff --git a/js/src/ctypes/libffi/man/Makefile.am b/js/src/ctypes/libffi/man/Makefile.am +--- a/js/src/ctypes/libffi/man/Makefile.am ++++ b/js/src/ctypes/libffi/man/Makefile.am +@@ -1,8 +1,8 @@ + ## Process this with automake to create Makefile.in + + AUTOMAKE_OPTIONS=foreign + +-EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ++EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 + +-man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ++man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 + +diff --git a/js/src/ctypes/libffi/man/Makefile.in b/js/src/ctypes/libffi/man/Makefile.in +--- a/js/src/ctypes/libffi/man/Makefile.in ++++ b/js/src/ctypes/libffi/man/Makefile.in +@@ -1,25 +1,69 @@ +-# Makefile.in generated by automake 1.11.1 from Makefile.am. ++# Makefile.in generated by automake 1.13.4 from Makefile.am. + # @configure_input@ + +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +-# Inc. ++# Copyright (C) 1994-2013 Free Software Foundation, Inc. ++ + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY, to the extent permitted by law; without + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + + @SET_MAKE@ + VPATH = @srcdir@ ++am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' ++am__make_running_with_option = \ ++ case $${target_option-} in \ ++ ?) ;; \ ++ *) echo "am__make_running_with_option: internal error: invalid" \ ++ "target option '$${target_option-}' specified" >&2; \ ++ exit 1;; \ ++ esac; \ ++ has_opt=no; \ ++ sane_makeflags=$$MAKEFLAGS; \ ++ if $(am__is_gnu_make); then \ ++ sane_makeflags=$$MFLAGS; \ ++ else \ ++ case $$MAKEFLAGS in \ ++ *\\[\ \ ]*) \ ++ bs=\\; \ ++ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ ++ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ ++ esac; \ ++ fi; \ ++ skip_next=no; \ ++ strip_trailopt () \ ++ { \ ++ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ ++ }; \ ++ for flg in $$sane_makeflags; do \ ++ test $$skip_next = yes && { skip_next=no; continue; }; \ ++ case $$flg in \ ++ *=*|--*) continue;; \ ++ -*I) strip_trailopt 'I'; skip_next=yes;; \ ++ -*I?*) strip_trailopt 'I';; \ ++ -*O) strip_trailopt 'O'; skip_next=yes;; \ ++ -*O?*) strip_trailopt 'O';; \ ++ -*l) strip_trailopt 'l'; skip_next=yes;; \ ++ -*l?*) strip_trailopt 'l';; \ ++ -[dEDm]) skip_next=yes;; \ ++ -[JT]) skip_next=yes;; \ ++ esac; \ ++ case $$flg in \ ++ *$$target_option*) has_opt=yes; break;; \ ++ esac; \ ++ done; \ ++ test $$has_opt = yes ++am__make_dryrun = (target_option=n; $(am__make_running_with_option)) ++am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) + pkgdatadir = $(datadir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkglibexecdir = $(libexecdir)/@PACKAGE@ + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +@@ -30,28 +74,57 @@ PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ + target_triplet = @target@ + subdir = man +-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ++DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ ++am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ ++ $(top_srcdir)/m4/ax_append_flag.m4 \ ++ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ ++ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ ++ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ ++ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ ++ $(top_srcdir)/m4/ax_configure_args.m4 \ ++ $(top_srcdir)/m4/ax_enable_builddir.m4 \ ++ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ ++ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ ++ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ ++ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ ++ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) + mkinstalldirs = $(install_sh) -d + CONFIG_HEADER = $(top_builddir)/fficonfig.h + CONFIG_CLEAN_FILES = + CONFIG_CLEAN_VPATH_FILES = ++AM_V_P = $(am__v_P_@AM_V@) ++am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) ++am__v_P_0 = false ++am__v_P_1 = : ++AM_V_GEN = $(am__v_GEN_@AM_V@) ++am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) ++am__v_GEN_0 = @echo " GEN " $@; ++am__v_GEN_1 = ++AM_V_at = $(am__v_at_@AM_V@) ++am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) ++am__v_at_0 = @ ++am__v_at_1 = + SOURCES = + DIST_SOURCES = ++am__can_run_installinfo = \ ++ case $$AM_UPDATE_INFO_DIR in \ ++ n|no|NO) false;; \ ++ *) (install-info --version) >/dev/null 2>&1;; \ ++ esac + am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; + am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; + am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; + am__install_max = 40 + am__nobase_strip_setup = \ +@@ -63,24 +136,32 @@ am__nobase_list = $(am__nobase_strip_set + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' + am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' ++am__uninstall_files_from_dir = { \ ++ test -z "$$files" \ ++ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ ++ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ ++ $(am__cd) "$$dir" && rm -f $$files; }; \ ++ } + man3dir = $(mandir)/man3 + am__installdirs = "$(DESTDIR)$(man3dir)" + NROFF = nroff + MANS = $(man_MANS) ++am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + ACLOCAL = @ACLOCAL@ + ALLOCA = @ALLOCA@ + AMTAR = @AMTAR@ ++AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ + AM_LTLDFLAGS = @AM_LTLDFLAGS@ + AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ + AR = @AR@ + AUTOCONF = @AUTOCONF@ + AUTOHEADER = @AUTOHEADER@ + AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ + CC = @CC@ +@@ -89,75 +170,82 @@ CCASDEPMODE = @CCASDEPMODE@ + CCASFLAGS = @CCASFLAGS@ + CCDEPMODE = @CCDEPMODE@ + CFLAGS = @CFLAGS@ + CPP = @CPP@ + CPPFLAGS = @CPPFLAGS@ + CYGPATH_W = @CYGPATH_W@ + DEFS = @DEFS@ + DEPDIR = @DEPDIR@ ++DLLTOOL = @DLLTOOL@ + DSYMUTIL = @DSYMUTIL@ + DUMPBIN = @DUMPBIN@ + ECHO_C = @ECHO_C@ + ECHO_N = @ECHO_N@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + EXEEXT = @EXEEXT@ ++FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ + FGREP = @FGREP@ + GREP = @GREP@ + HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ ++HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ + INSTALL = @INSTALL@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LD = @LD@ + LDFLAGS = @LDFLAGS@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LIPO = @LIPO@ + LN_S = @LN_S@ + LTLIBOBJS = @LTLIBOBJS@ + MAINT = @MAINT@ + MAKEINFO = @MAKEINFO@ ++MANIFEST_TOOL = @MANIFEST_TOOL@ + MKDIR_P = @MKDIR_P@ + NM = @NM@ + NMEDIT = @NMEDIT@ + OBJDUMP = @OBJDUMP@ + OBJEXT = @OBJEXT@ + OTOOL = @OTOOL@ + OTOOL64 = @OTOOL64@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ + PACKAGE_STRING = @PACKAGE_STRING@ + PACKAGE_TARNAME = @PACKAGE_TARNAME@ + PACKAGE_URL = @PACKAGE_URL@ + PACKAGE_VERSION = @PACKAGE_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ ++PRTDIAG = @PRTDIAG@ + RANLIB = @RANLIB@ + SED = @SED@ + SET_MAKE = @SET_MAKE@ + SHELL = @SHELL@ + STRIP = @STRIP@ + TARGET = @TARGET@ + TARGETDIR = @TARGETDIR@ + VERSION = @VERSION@ + abs_builddir = @abs_builddir@ + abs_srcdir = @abs_srcdir@ + abs_top_builddir = @abs_top_builddir@ + abs_top_srcdir = @abs_top_srcdir@ ++ac_ct_AR = @ac_ct_AR@ + ac_ct_CC = @ac_ct_CC@ + ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ + am__include = @am__include@ + am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ + am__tar = @am__tar@ + am__untar = @am__untar@ ++ax_enable_builddir_sed = @ax_enable_builddir_sed@ + bindir = @bindir@ + build = @build@ + build_alias = @build_alias@ + build_cpu = @build_cpu@ + build_os = @build_os@ + build_vendor = @build_vendor@ + builddir = @builddir@ + datadir = @datadir@ +@@ -173,41 +261,41 @@ host_vendor = @host_vendor@ + htmldir = @htmldir@ + includedir = @includedir@ + infodir = @infodir@ + install_sh = @install_sh@ + libdir = @libdir@ + libexecdir = @libexecdir@ + localedir = @localedir@ + localstatedir = @localstatedir@ +-lt_ECHO = @lt_ECHO@ + mandir = @mandir@ + mkdir_p = @mkdir_p@ + oldincludedir = @oldincludedir@ + pdfdir = @pdfdir@ + prefix = @prefix@ + program_transform_name = @program_transform_name@ + psdir = @psdir@ + sbindir = @sbindir@ + sharedstatedir = @sharedstatedir@ + srcdir = @srcdir@ ++sys_symbol_underscore = @sys_symbol_underscore@ + sysconfdir = @sysconfdir@ + target = @target@ + target_alias = @target_alias@ + target_cpu = @target_cpu@ + target_os = @target_os@ + target_vendor = @target_vendor@ + toolexecdir = @toolexecdir@ + toolexeclibdir = @toolexeclibdir@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + AUTOMAKE_OPTIONS = foreign +-EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 +-man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ++EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 ++man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 + all: all-am + + .SUFFIXES: + $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ +@@ -239,21 +327,28 @@ Makefile: $(srcdir)/Makefile.in $(top_bu + + mostlyclean-libtool: + -rm -f *.lo + + clean-libtool: + -rm -rf .libs _libs + install-man3: $(man_MANS) + @$(NORMAL_INSTALL) +- test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" +- @list=''; test -n "$(man3dir)" || exit 0; \ +- { for i in $$list; do echo "$$i"; done; \ +- l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ +- sed -n '/\.3[a-z]*$$/p'; \ ++ @list1=''; \ ++ list2='$(man_MANS)'; \ ++ test -n "$(man3dir)" \ ++ && test -n "`echo $$list1$$list2`" \ ++ || exit 0; \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ ++ { for i in $$list1; do echo "$$i"; done; \ ++ if test -n "$$list2"; then \ ++ for i in $$list2; do echo "$$i"; done \ ++ | sed -n '/\.3[a-z]*$$/p'; \ ++ fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ +@@ -272,40 +367,25 @@ install-man3: $(man_MANS) + uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ +- test -z "$$files" || { \ +- echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ +- cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } +-tags: TAGS +-TAGS: ++ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) ++tags TAGS: + +-ctags: CTAGS +-CTAGS: ++ctags CTAGS: ++ ++cscope cscopelist: + + + distdir: $(DISTFILES) +- @list='$(MANS)'; if test -n "$$list"; then \ +- list=`for p in $$list; do \ +- if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ +- if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ +- if test -n "$$list" && \ +- grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ +- echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ +- grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ +- echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ +- echo " typically \`make maintainer-clean' will remove them" >&2; \ +- exit 1; \ +- else :; fi; \ +- else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ +@@ -342,20 +422,25 @@ install-exec: install-exec-am + install-data: install-data-am + uninstall: uninstall-am + + install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + + installcheck: installcheck-am + install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++ if test -z '$(STRIP)'; then \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ install; \ ++ else \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ ++ fi + mostlyclean-generic: + + clean-generic: + + distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +@@ -428,23 +513,24 @@ ps-am: + + uninstall-am: uninstall-man + + uninstall-man: uninstall-man3 + + .MAKE: install-am install-strip + + .PHONY: all all-am check check-am clean clean-generic clean-libtool \ +- distclean distclean-generic distclean-libtool distdir dvi \ +- dvi-am html html-am info info-am install install-am \ +- install-data install-data-am install-dvi install-dvi-am \ +- install-exec install-exec-am install-html install-html-am \ +- install-info install-info-am install-man install-man3 \ +- install-pdf install-pdf-am install-ps install-ps-am \ +- install-strip installcheck installcheck-am installdirs \ +- maintainer-clean maintainer-clean-generic mostlyclean \ +- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- uninstall uninstall-am uninstall-man uninstall-man3 ++ cscopelist-am ctags-am distclean distclean-generic \ ++ distclean-libtool distdir dvi dvi-am html html-am info info-am \ ++ install install-am install-data install-data-am install-dvi \ ++ install-dvi-am install-exec install-exec-am install-html \ ++ install-html-am install-info install-info-am install-man \ ++ install-man3 install-pdf install-pdf-am install-ps \ ++ install-ps-am install-strip installcheck installcheck-am \ ++ installdirs maintainer-clean maintainer-clean-generic \ ++ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ++ ps ps-am tags-am uninstall uninstall-am uninstall-man \ ++ uninstall-man3 + + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: +diff --git a/js/src/ctypes/libffi/man/ffi.3 b/js/src/ctypes/libffi/man/ffi.3 +--- a/js/src/ctypes/libffi/man/ffi.3 ++++ b/js/src/ctypes/libffi/man/ffi.3 +@@ -11,21 +11,31 @@ libffi, -lffi + .Fo ffi_prep_cif + .Fa "ffi_cif *cif" + .Fa "ffi_abi abi" + .Fa "unsigned int nargs" + .Fa "ffi_type *rtype" + .Fa "ffi_type **atypes" + .Fc + .Ft void ++.Fo ffi_prep_cif_var ++.Fa "ffi_cif *cif" ++.Fa "ffi_abi abi" ++.Fa "unsigned int nfixedargs" ++.Fa "unsigned int ntotalargs" ++.Fa "ffi_type *rtype" ++.Fa "ffi_type **atypes" ++.Fc ++.Ft void + .Fo ffi_call + .Fa "ffi_cif *cif" + .Fa "void (*fn)(void)" + .Fa "void *rvalue" + .Fa "void **avalue" + .Fc + .Sh DESCRIPTION + The foreign function interface provides a mechanism by which a function can + generate a call to another function at runtime without requiring knowledge of + the called function's interface at compile time. + .Sh SEE ALSO + .Xr ffi_prep_cif 3 , ++.Xr ffi_prep_cif_var 3 , + .Xr ffi_call 3 +diff --git a/js/src/ctypes/libffi/man/ffi_prep_cif.3 b/js/src/ctypes/libffi/man/ffi_prep_cif.3 +--- a/js/src/ctypes/libffi/man/ffi_prep_cif.3 ++++ b/js/src/ctypes/libffi/man/ffi_prep_cif.3 +@@ -32,17 +32,19 @@ is an array of + .Fa nargs + pointers to + .Nm ffi_type + structs that describe the data type, size and alignment of each argument. + .Fa rtype + points to an + .Nm ffi_type + that describes the data type, size and alignment of the +-return value. ++return value. Note that to call a variadic function ++.Nm ffi_prep_cif_var ++must be used instead. + .Sh RETURN VALUES + Upon successful completion, + .Nm ffi_prep_cif + returns + .Nm FFI_OK . + It will return + .Nm FFI_BAD_TYPEDEF + if +@@ -54,13 +56,13 @@ or + or + .Fa rtype + is malformed. If + .Fa abi + does not refer to a valid ABI, + .Nm FFI_BAD_ABI + will be returned. Available ABIs are + defined in +-.Nm +-. ++.Nm . + .Sh SEE ALSO + .Xr ffi 3 , +-.Xr ffi_call 3 ++.Xr ffi_call 3 , ++.Xr ffi_prep_cif_var 3 +diff --git a/js/src/ctypes/libffi/man/ffi_prep_cif_var.3 b/js/src/ctypes/libffi/man/ffi_prep_cif_var.3 +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/man/ffi_prep_cif_var.3 +@@ -0,0 +1,73 @@ ++.Dd January 25, 2011 ++.Dt ffi_prep_cif_var 3 ++.Sh NAME ++.Nm ffi_prep_cif_var ++.Nd Prepare a ++.Nm ffi_cif ++structure for use with ++.Nm ffi_call ++for variadic functions. ++.Sh SYNOPSIS ++.In ffi.h ++.Ft ffi_status ++.Fo ffi_prep_cif_var ++.Fa "ffi_cif *cif" ++.Fa "ffi_abi abi" ++.Fa "unsigned int nfixedargs" ++.Fa "unsigned int ntotalargs" ++.Fa "ffi_type *rtype" ++.Fa "ffi_type **atypes" ++.Fc ++.Sh DESCRIPTION ++The ++.Nm ffi_prep_cif_var ++function prepares a ++.Nm ffi_cif ++structure for use with ++.Nm ffi_call ++for variadic functions. ++.Fa abi ++specifies a set of calling conventions to use. ++.Fa atypes ++is an array of ++.Fa ntotalargs ++pointers to ++.Nm ffi_type ++structs that describe the data type, size and alignment of each argument. ++.Fa rtype ++points to an ++.Nm ffi_type ++that describes the data type, size and alignment of the ++return value. ++.Fa nfixedargs ++must contain the number of fixed (non-variadic) arguments. ++Note that to call a non-variadic function ++.Nm ffi_prep_cif ++must be used. ++.Sh RETURN VALUES ++Upon successful completion, ++.Nm ffi_prep_cif_var ++returns ++.Nm FFI_OK . ++It will return ++.Nm FFI_BAD_TYPEDEF ++if ++.Fa cif ++is ++.Nm NULL ++or ++.Fa atypes ++or ++.Fa rtype ++is malformed. If ++.Fa abi ++does not refer to a valid ABI, ++.Nm FFI_BAD_ABI ++will be returned. Available ABIs are ++defined in ++.Nm ++. ++.Sh SEE ALSO ++.Xr ffi 3 , ++.Xr ffi_call 3 , ++.Xr ffi_prep_cif 3 +diff --git a/js/src/ctypes/libffi/mdate-sh b/js/src/ctypes/libffi/mdate-sh +--- a/js/src/ctypes/libffi/mdate-sh ++++ b/js/src/ctypes/libffi/mdate-sh +@@ -1,106 +1,126 @@ + #!/bin/sh + # Get modification time of a file or directory and pretty-print it. + +-scriptversion=2005-06-29.22 ++scriptversion=2010-08-21.06; # UTC + +-# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software +-# Foundation, Inc. ++# Copyright (C) 1995-2013 Free Software Foundation, Inc. + # written by Ulrich Drepper , June 1995 + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2, or (at your option) + # any later version. + # + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ++# along with this program. If not, see . + + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # This file is maintained in Automake, please report + # bugs to or send patches to + # . + ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++fi ++ + case $1 in + '') +- echo "$0: No file. Try \`$0 --help' for more information." 1>&2 ++ echo "$0: No file. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF + Usage: mdate-sh [--help] [--version] FILE + +-Pretty-print the modification time of FILE. ++Pretty-print the modification day of FILE, in the format: ++1 January 1970 + + Report bugs to . + EOF + exit $? + ;; + -v | --v*) + echo "mdate-sh $scriptversion" + exit $? + ;; + esac + ++error () ++{ ++ echo "$0: $1" >&2 ++ exit 1 ++} ++ ++ + # Prevent date giving response in another language. + LANG=C + export LANG + LC_ALL=C + export LC_ALL + LC_TIME=C + export LC_TIME + + # GNU ls changes its time format in response to the TIME_STYLE +-# variable. Since we cannot assume `unset' works, revert this ++# variable. Since we cannot assume 'unset' works, revert this + # variable to its documented default. + if test "${TIME_STYLE+set}" = set; then + TIME_STYLE=posix-long-iso + export TIME_STYLE + fi + + save_arg1=$1 + + # Find out how to get the extended ls output of a file or directory. + if ls -L /dev/null 1>/dev/null 2>&1; then + ls_command='ls -L -l -d' + else + ls_command='ls -l -d' + fi ++# Avoid user/group names that might have spaces, when possible. ++if ls -n /dev/null 1>/dev/null 2>&1; then ++ ls_command="$ls_command -n" ++fi + +-# A `ls -l' line looks as follows on OS/2. ++# A 'ls -l' line looks as follows on OS/2. + # drwxrwx--- 0 Aug 11 2001 foo + # This differs from Unix, which adds ownership information. + # drwxrwx--- 2 root root 4096 Aug 11 2001 foo + # + # To find the date, we split the line on spaces and iterate on words + # until we find a month. This cannot work with files whose owner is a +-# user named `Jan', or `Feb', etc. However, it's unlikely that `/' ++# user named "Jan", or "Feb", etc. However, it's unlikely that '/' + # will be owned by a user whose name is a month. So we first look at + # the extended ls output of the root directory to decide how many + # words should be skipped to get the date. + + # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. +-set x`ls -l -d /` ++set x`$ls_command /` + + # Find which argument is the month. + month= + command= + until test $month + do ++ test $# -gt 0 || error "failed parsing '$ls_command /' output" + shift + # Add another shift to the command. + command="$command shift;" + case $1 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; +@@ -110,18 +130,20 @@ do + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; + esac + done + ++test -n "$month" || error "failed parsing '$ls_command /' output" ++ + # Get the extended ls output of the file or directory. +-set dummy x`eval "$ls_command \"\$save_arg1\""` ++set dummy x`eval "$ls_command \"\\\$save_arg1\""` + + # Remove all preceding arguments + eval $command + + # Because of the dummy argument above, month is in $2. + # + # On a POSIX system, we should have + # +@@ -192,10 +214,11 @@ esac + echo $day $month $year + + # Local Variables: + # mode: shell-script + # sh-indentation: 2 + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "scriptversion=" + # time-stamp-format: "%:y-%02m-%02d.%02H" +-# time-stamp-end: "$" ++# time-stamp-time-zone: "UTC" ++# time-stamp-end: "; # UTC" + # End: +diff --git a/js/src/ctypes/libffi/missing b/js/src/ctypes/libffi/missing +--- a/js/src/ctypes/libffi/missing ++++ b/js/src/ctypes/libffi/missing +@@ -1,360 +1,215 @@ + #! /bin/sh +-# Common stub for a few missing GNU programs while installing. ++# Common wrapper for a few potentially missing GNU programs. + +-scriptversion=2005-06-08.21 ++scriptversion=2012-06-26.16; # UTC + +-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 +-# Free Software Foundation, Inc. +-# Originally by Fran,cois Pinard , 1996. ++# Copyright (C) 1996-2013 Free Software Foundation, Inc. ++# Originally written by Fran,cois Pinard , 1996. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2, or (at your option) + # any later version. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301, USA. ++# along with this program. If not, see . + + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + if test $# -eq 0; then +- echo 1>&2 "Try \`$0 --help' for more information" ++ echo 1>&2 "Try '$0 --help' for more information" + exit 1 + fi + +-run=: ++case $1 in + +-# In the cases where this matters, `missing' is being run in the +-# srcdir already. +-if test -f configure.ac; then +- configure_ac=configure.ac +-else +- configure_ac=configure.in +-fi ++ --is-lightweight) ++ # Used by our autoconf macros to check whether the available missing ++ # script is modern enough. ++ exit 0 ++ ;; + +-msg="missing on your system" +- +-case "$1" in +---run) +- # Try to run requested program, and just exit if it succeeds. +- run= +- shift +- "$@" && exit 0 +- # Exit code 63 means version mismatch. This often happens +- # when the user try to use an ancient version of a tool on +- # a file that requires a minimum version. In this case we +- # we should proceed has if the program had been absent, or +- # if --run hadn't been passed. +- if test $? = 63; then +- run=: +- msg="probably too old" +- fi +- ;; ++ --run) ++ # Back-compat with the calling convention used by older automake. ++ shift ++ ;; + + -h|--h|--he|--hel|--help) + echo "\ + $0 [OPTION]... PROGRAM [ARGUMENT]... + +-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +-error status if there is no known handling for PROGRAM. ++Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due ++to PROGRAM being missing or too old. + + Options: + -h, --help display this help and exit + -v, --version output version information and exit +- --run try to run the given command, and emulate it if it fails + + Supported PROGRAM values: +- aclocal touch file \`aclocal.m4' +- autoconf touch file \`configure' +- autoheader touch file \`config.h.in' +- automake touch all \`Makefile.in' files +- bison create \`y.tab.[ch]', if possible, from existing .[ch] +- flex create \`lex.yy.c', if possible, from existing .c +- help2man touch the output file +- lex create \`lex.yy.c', if possible, from existing .c +- makeinfo touch the output file +- tar try tar, gnutar, gtar, then tar without non-portable flags +- yacc create \`y.tab.[ch]', if possible, from existing .[ch] ++ aclocal autoconf autoheader autom4te automake makeinfo ++ bison yacc flex lex help2man ++ ++Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and ++'g' are ignored when checking the name. + + Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) +- echo 1>&2 "$0: Unknown \`$1' option" +- echo 1>&2 "Try \`$0 --help' for more information" ++ echo 1>&2 "$0: unknown '$1' option" ++ echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + + esac + +-# Now exit if we have it, but it failed. Also exit now if we +-# don't have it and --version was passed (most likely to detect +-# the program). +-case "$1" in +- lex|yacc) +- # Not GNU programs, they don't have --version. ++# Run the given program, remember its exit status. ++"$@"; st=$? ++ ++# If it succeeded, we are done. ++test $st -eq 0 && exit 0 ++ ++# Also exit now if we it failed (or wasn't found), and '--version' was ++# passed; such an option is passed most likely to detect whether the ++# program is present and works. ++case $2 in --version|--help) exit $st;; esac ++ ++# Exit code 63 means version mismatch. This often happens when the user ++# tries to use an ancient version of a tool on a file that requires a ++# minimum version. ++if test $st -eq 63; then ++ msg="probably too old" ++elif test $st -eq 127; then ++ # Program was missing. ++ msg="missing on your system" ++else ++ # Program was found and executed, but failed. Give up. ++ exit $st ++fi ++ ++perl_URL=http://www.perl.org/ ++flex_URL=http://flex.sourceforge.net/ ++gnu_software_URL=http://www.gnu.org/software ++ ++program_details () ++{ ++ case $1 in ++ aclocal|automake) ++ echo "The '$1' program is part of the GNU Automake package:" ++ echo "<$gnu_software_URL/automake>" ++ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" ++ echo "<$gnu_software_URL/autoconf>" ++ echo "<$gnu_software_URL/m4/>" ++ echo "<$perl_URL>" ++ ;; ++ autoconf|autom4te|autoheader) ++ echo "The '$1' program is part of the GNU Autoconf package:" ++ echo "<$gnu_software_URL/autoconf/>" ++ echo "It also requires GNU m4 and Perl in order to run:" ++ echo "<$gnu_software_URL/m4/>" ++ echo "<$perl_URL>" ++ ;; ++ esac ++} ++ ++give_advice () ++{ ++ # Normalize program name to check for. ++ normalized_program=`echo "$1" | sed ' ++ s/^gnu-//; t ++ s/^gnu//; t ++ s/^g//; t'` ++ ++ printf '%s\n' "'$1' is $msg." ++ ++ configure_deps="'configure.ac' or m4 files included by 'configure.ac'" ++ case $normalized_program in ++ autoconf*) ++ echo "You should only need it if you modified 'configure.ac'," ++ echo "or m4 files included by it." ++ program_details 'autoconf' ++ ;; ++ autoheader*) ++ echo "You should only need it if you modified 'acconfig.h' or" ++ echo "$configure_deps." ++ program_details 'autoheader' ++ ;; ++ automake*) ++ echo "You should only need it if you modified 'Makefile.am' or" ++ echo "$configure_deps." ++ program_details 'automake' ++ ;; ++ aclocal*) ++ echo "You should only need it if you modified 'acinclude.m4' or" ++ echo "$configure_deps." ++ program_details 'aclocal' ++ ;; ++ autom4te*) ++ echo "You might have modified some maintainer files that require" ++ echo "the 'automa4te' program to be rebuilt." ++ program_details 'autom4te' ++ ;; ++ bison*|yacc*) ++ echo "You should only need it if you modified a '.y' file." ++ echo "You may want to install the GNU Bison package:" ++ echo "<$gnu_software_URL/bison/>" ++ ;; ++ lex*|flex*) ++ echo "You should only need it if you modified a '.l' file." ++ echo "You may want to install the Fast Lexical Analyzer package:" ++ echo "<$flex_URL>" ++ ;; ++ help2man*) ++ echo "You should only need it if you modified a dependency" \ ++ "of a man page." ++ echo "You may want to install the GNU Help2man package:" ++ echo "<$gnu_software_URL/help2man/>" + ;; ++ makeinfo*) ++ echo "You should only need it if you modified a '.texi' file, or" ++ echo "any other file indirectly affecting the aspect of the manual." ++ echo "You might want to install the Texinfo package:" ++ echo "<$gnu_software_URL/texinfo/>" ++ echo "The spurious makeinfo call might also be the consequence of" ++ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" ++ echo "want to install GNU make:" ++ echo "<$gnu_software_URL/make/>" ++ ;; ++ *) ++ echo "You might have modified some files without having the proper" ++ echo "tools for further handling them. Check the 'README' file, it" ++ echo "often tells you about the needed prerequisites for installing" ++ echo "this package. You may also peek at any GNU archive site, in" ++ echo "case some other package contains this missing '$1' program." ++ ;; ++ esac ++} + +- tar) +- if test -n "$run"; then +- echo 1>&2 "ERROR: \`tar' requires --run" +- exit 1 +- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then +- exit 1 +- fi +- ;; ++give_advice "$1" | sed -e '1s/^/WARNING: /' \ ++ -e '2,$s/^/ /' >&2 + +- *) +- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then +- # We have it, but it failed. +- exit 1 +- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then +- # Could not run --version or --help. This is probably someone +- # running `$TOOL --version' or `$TOOL --help' to check whether +- # $TOOL exists and not knowing $TOOL uses missing. +- exit 1 +- fi +- ;; +-esac +- +-# If it does not exist, or fails to run (possibly an outdated version), +-# try to emulate it. +-case "$1" in +- aclocal*) +- echo 1>&2 "\ +-WARNING: \`$1' is $msg. You should only need it if +- you modified \`acinclude.m4' or \`${configure_ac}'. You might want +- to install the \`Automake' and \`Perl' packages. Grab them from +- any GNU archive site." +- touch aclocal.m4 +- ;; +- +- autoconf) +- echo 1>&2 "\ +-WARNING: \`$1' is $msg. You should only need it if +- you modified \`${configure_ac}'. You might want to install the +- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU +- archive site." +- touch configure +- ;; +- +- autoheader) +- echo 1>&2 "\ +-WARNING: \`$1' is $msg. You should only need it if +- you modified \`acconfig.h' or \`${configure_ac}'. You might want +- to install the \`Autoconf' and \`GNU m4' packages. Grab them +- from any GNU archive site." +- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` +- test -z "$files" && files="config.h" +- touch_files= +- for f in $files; do +- case "$f" in +- *:*) touch_files="$touch_files "`echo "$f" | +- sed -e 's/^[^:]*://' -e 's/:.*//'`;; +- *) touch_files="$touch_files $f.in";; +- esac +- done +- touch $touch_files +- ;; +- +- automake*) +- echo 1>&2 "\ +-WARNING: \`$1' is $msg. You should only need it if +- you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. +- You might want to install the \`Automake' and \`Perl' packages. +- Grab them from any GNU archive site." +- find . -type f -name Makefile.am -print | +- sed 's/\.am$/.in/' | +- while read f; do touch "$f"; done +- ;; +- +- autom4te) +- echo 1>&2 "\ +-WARNING: \`$1' is needed, but is $msg. +- You might have modified some files without having the +- proper tools for further handling them. +- You can get \`$1' as part of \`Autoconf' from any GNU +- archive site." +- +- file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` +- test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` +- if test -f "$file"; then +- touch $file +- else +- test -z "$file" || exec >$file +- echo "#! /bin/sh" +- echo "# Created by GNU Automake missing as a replacement of" +- echo "# $ $@" +- echo "exit 0" +- chmod +x $file +- exit 1 +- fi +- ;; +- +- bison|yacc) +- echo 1>&2 "\ +-WARNING: \`$1' $msg. You should only need it if +- you modified a \`.y' file. You may need the \`Bison' package +- in order for those modifications to take effect. You can get +- \`Bison' from any GNU archive site." +- rm -f y.tab.c y.tab.h +- if [ $# -ne 1 ]; then +- eval LASTARG="\${$#}" +- case "$LASTARG" in +- *.y) +- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` +- if [ -f "$SRCFILE" ]; then +- cp "$SRCFILE" y.tab.c +- fi +- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` +- if [ -f "$SRCFILE" ]; then +- cp "$SRCFILE" y.tab.h +- fi +- ;; +- esac +- fi +- if [ ! -f y.tab.h ]; then +- echo >y.tab.h +- fi +- if [ ! -f y.tab.c ]; then +- echo 'main() { return 0; }' >y.tab.c +- fi +- ;; +- +- lex|flex) +- echo 1>&2 "\ +-WARNING: \`$1' is $msg. You should only need it if +- you modified a \`.l' file. You may need the \`Flex' package +- in order for those modifications to take effect. You can get +- \`Flex' from any GNU archive site." +- rm -f lex.yy.c +- if [ $# -ne 1 ]; then +- eval LASTARG="\${$#}" +- case "$LASTARG" in +- *.l) +- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` +- if [ -f "$SRCFILE" ]; then +- cp "$SRCFILE" lex.yy.c +- fi +- ;; +- esac +- fi +- if [ ! -f lex.yy.c ]; then +- echo 'main() { return 0; }' >lex.yy.c +- fi +- ;; +- +- help2man) +- echo 1>&2 "\ +-WARNING: \`$1' is $msg. You should only need it if +- you modified a dependency of a manual page. You may need the +- \`Help2man' package in order for those modifications to take +- effect. You can get \`Help2man' from any GNU archive site." +- +- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` +- if test -z "$file"; then +- file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` +- fi +- if [ -f "$file" ]; then +- touch $file +- else +- test -z "$file" || exec >$file +- echo ".ab help2man is required to generate this page" +- exit 1 +- fi +- ;; +- +- makeinfo) +- echo 1>&2 "\ +-WARNING: \`$1' is $msg. You should only need it if +- you modified a \`.texi' or \`.texinfo' file, or any other file +- indirectly affecting the aspect of the manual. The spurious +- call might also be the consequence of using a buggy \`make' (AIX, +- DU, IRIX). You might want to install the \`Texinfo' package or +- the \`GNU make' package. Grab either from any GNU archive site." +- # The file to touch is that specified with -o ... +- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` +- if test -z "$file"; then +- # ... or it is the one specified with @setfilename ... +- infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` +- file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` +- # ... or it is derived from the source name (dir/f.texi becomes f.info) +- test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info +- fi +- # If the file does not exist, the user really needs makeinfo; +- # let's fail without touching anything. +- test -f $file || exit 1 +- touch $file +- ;; +- +- tar) +- shift +- +- # We have already tried tar in the generic part. +- # Look for gnutar/gtar before invocation to avoid ugly error +- # messages. +- if (gnutar --version > /dev/null 2>&1); then +- gnutar "$@" && exit 0 +- fi +- if (gtar --version > /dev/null 2>&1); then +- gtar "$@" && exit 0 +- fi +- firstarg="$1" +- if shift; then +- case "$firstarg" in +- *o*) +- firstarg=`echo "$firstarg" | sed s/o//` +- tar "$firstarg" "$@" && exit 0 +- ;; +- esac +- case "$firstarg" in +- *h*) +- firstarg=`echo "$firstarg" | sed s/h//` +- tar "$firstarg" "$@" && exit 0 +- ;; +- esac +- fi +- +- echo 1>&2 "\ +-WARNING: I can't seem to be able to run \`tar' with the given arguments. +- You may want to install GNU tar or Free paxutils, or check the +- command line arguments." +- exit 1 +- ;; +- +- *) +- echo 1>&2 "\ +-WARNING: \`$1' is needed, and is $msg. +- You might have modified some files without having the +- proper tools for further handling them. Check the \`README' file, +- it often tells you about the needed prerequisites for installing +- this package. You may also peek at any GNU archive site, in case +- some other package would contain this missing \`$1' program." +- exit 1 +- ;; +-esac +- +-exit 0 ++# Propagate the correct exit status (expected to be 127 for a program ++# not found, 63 for a program that failed due to version mismatch). ++exit $st + + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "scriptversion=" + # time-stamp-format: "%:y-%02m-%02d.%02H" +-# time-stamp-end: "$" ++# time-stamp-time-zone: "UTC" ++# time-stamp-end: "; # UTC" + # End: +diff --git a/js/src/ctypes/libffi/msvcc.sh b/js/src/ctypes/libffi/msvcc.sh +--- a/js/src/ctypes/libffi/msvcc.sh ++++ b/js/src/ctypes/libffi/msvcc.sh +@@ -1,19 +1,53 @@ + #!/bin/sh + +-# This Source Code Form is subject to the terms of the Mozilla Public +-# License, v. 2.0. If a copy of the MPL was not distributed with this +-# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++# ***** BEGIN LICENSE BLOCK ***** ++# Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++# ++# The contents of this file are subject to the Mozilla Public License Version ++# 1.1 (the "License"); you may not use this file except in compliance with ++# the License. You may obtain a copy of the License at ++# http://www.mozilla.org/MPL/ ++# ++# Software distributed under the License is distributed on an "AS IS" basis, ++# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++# for the specific language governing rights and limitations under the ++# License. ++# ++# The Original Code is the MSVC wrappificator. ++# ++# The Initial Developer of the Original Code is ++# Timothy Wall . ++# Portions created by the Initial Developer are Copyright (C) 2009 ++# the Initial Developer. All Rights Reserved. ++# ++# Contributor(s): ++# Daniel Witte ++# ++# Alternatively, the contents of this file may be used under the terms of ++# either the GNU General Public License Version 2 or later (the "GPL"), or ++# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++# in which case the provisions of the GPL or the LGPL are applicable instead ++# of those above. If you wish to allow use of your version of this file only ++# under the terms of either the GPL or the LGPL, and not to allow others to ++# use your version of this file under the terms of the MPL, indicate your ++# decision by deleting the provisions above and replace them with the notice ++# and other provisions required by the GPL or the LGPL. If you do not delete ++# the provisions above, a recipient may use your version of this file under ++# the terms of any one of the MPL, the GPL or the LGPL. ++# ++# ***** END LICENSE BLOCK ***** + + # + # GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC + # format and translated into something sensible for cl or ml. + # + ++args_orig=$@ + args="-nologo -W3" + md=-MD + cl="cl" + ml="ml" + safeseh="-safeseh" + output= + + while [ $# -gt 0 ] +@@ -34,24 +68,45 @@ do + safeseh= + shift 1 + ;; + -O0) + args="$args -Od" + shift 1 + ;; + -O*) +- # If we're optimizing, make sure we explicitly turn on some optimizations +- # that are implicitly disabled by debug symbols (-Zi). +- args="$args $1 -OPT:REF -OPT:ICF -INCREMENTAL:NO" ++ # Runtime error checks (enabled by setting -RTC1 in the -DFFI_DEBUG ++ # case below) are not compatible with optimization flags and will ++ # cause the build to fail. Therefore, drop the optimization flag if ++ # -DFFI_DEBUG is also set. ++ case $args_orig in ++ *-DFFI_DEBUG*) ++ args="$args" ++ ;; ++ *) ++ # The ax_cc_maxopt.m4 macro from the upstream autoconf-archive ++ # project doesn't support MSVC and therefore ends up trying to ++ # use -O3. Use the equivalent "max optimization" flag for MSVC ++ # instead of erroring out. ++ case $1 in ++ -O3) ++ args="$args -O2" ++ ;; ++ *) ++ args="$args $1" ++ ;; ++ esac ++ opt="true" ++ ;; ++ esac + shift 1 + ;; + -g) + # Enable debug symbol generation. +- args="$args -Zi -DEBUG" ++ args="$args -Zi" + shift 1 + ;; + -DFFI_DEBUG) + # Link against debug CRT and enable runtime error checks. + args="$args -RTC1" + defines="$defines $1" + md=-MDd + shift 1 +@@ -88,16 +143,20 @@ do + # TODO map extra warnings + shift 1 + ;; + -Wall) + # -Wall on MSVC is overzealous, and we already build with -W3. Nothing + # to do here. + shift 1 + ;; ++ -pedantic) ++ # libffi tests -pedantic with -Wall, so drop it also. ++ shift 1 ++ ;; + -Werror) + args="$args -WX" + shift 1 + ;; + -W*) + # TODO map specific warnings + shift 1 + ;; +@@ -132,16 +191,23 @@ do + *) + # Assume it's an MSVC argument, and pass it through. + args="$args $1" + shift 1 + ;; + esac + done + ++# If -Zi is specified, certain optimizations are implicitly disabled ++# by MSVC. Add back those optimizations if this is an optimized build. ++# NOTE: These arguments must come after all others. ++if [ -n "$opt" ]; then ++ args="$args -link -OPT:REF -OPT:ICF -INCREMENTAL:NO" ++fi ++ + if [ -n "$assembly" ]; then + if [ -z "$outdir" ]; then + outdir="." + fi + ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')" + echo "$cl -nologo -EP $includes $defines $src > $ppsrc" + "$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $? + output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')" +@@ -151,14 +217,17 @@ if [ -n "$assembly" ]; then + eval "\"$ml\" $args" + result=$? + + # required to fix ml64 broken output? + #mv *.obj $outdir + else + args="$md $args" + echo "$cl $args" +- eval "\"$cl\" $args" ++ # Return an error code of 1 if an invalid command line parameter is passed ++ # instead of just ignoring it. ++ eval "(\"$cl\" $args 2>&1 1>&3 | \ ++ awk '{print \$0} /D9002/ {error=1} END{exit error}' >&2) 3>&1" + result=$? + fi + + exit $result + +diff --git a/js/src/ctypes/libffi/src/aarch64/ffi.c b/js/src/ctypes/libffi/src/aarch64/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/aarch64/ffi.c +@@ -0,0 +1,1133 @@ ++/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be ++included in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++/* Stack alignment requirement in bytes */ ++#if defined (__APPLE__) ++#define AARCH64_STACK_ALIGN 1 ++#else ++#define AARCH64_STACK_ALIGN 16 ++#endif ++ ++#define N_X_ARG_REG 8 ++#define N_V_ARG_REG 8 ++ ++#define AARCH64_FFI_WITH_V (1 << AARCH64_FFI_WITH_V_BIT) ++ ++union _d ++{ ++ UINT64 d; ++ UINT32 s[2]; ++}; ++ ++struct call_context ++{ ++ UINT64 x [AARCH64_N_XREG]; ++ struct ++ { ++ union _d d[2]; ++ } v [AARCH64_N_VREG]; ++}; ++ ++#if defined (__clang__) && defined (__APPLE__) ++extern void ++sys_icache_invalidate (void *start, size_t len); ++#endif ++ ++static inline void ++ffi_clear_cache (void *start, void *end) ++{ ++#if defined (__clang__) && defined (__APPLE__) ++ sys_icache_invalidate (start, (char *)end - (char *)start); ++#elif defined (__GNUC__) ++ __builtin___clear_cache (start, end); ++#else ++#error "Missing builtin to flush instruction cache" ++#endif ++} ++ ++static void * ++get_x_addr (struct call_context *context, unsigned n) ++{ ++ return &context->x[n]; ++} ++ ++static void * ++get_s_addr (struct call_context *context, unsigned n) ++{ ++#if defined __AARCH64EB__ ++ return &context->v[n].d[1].s[1]; ++#else ++ return &context->v[n].d[0].s[0]; ++#endif ++} ++ ++static void * ++get_d_addr (struct call_context *context, unsigned n) ++{ ++#if defined __AARCH64EB__ ++ return &context->v[n].d[1]; ++#else ++ return &context->v[n].d[0]; ++#endif ++} ++ ++static void * ++get_v_addr (struct call_context *context, unsigned n) ++{ ++ return &context->v[n]; ++} ++ ++/* Return the memory location at which a basic type would reside ++ were it to have been stored in register n. */ ++ ++static void * ++get_basic_type_addr (unsigned short type, struct call_context *context, ++ unsigned n) ++{ ++ switch (type) ++ { ++ case FFI_TYPE_FLOAT: ++ return get_s_addr (context, n); ++ case FFI_TYPE_DOUBLE: ++ return get_d_addr (context, n); ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ return get_v_addr (context, n); ++#endif ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ return get_x_addr (context, n); ++ case FFI_TYPE_VOID: ++ return NULL; ++ default: ++ FFI_ASSERT (0); ++ return NULL; ++ } ++} ++ ++/* Return the alignment width for each of the basic types. */ ++ ++static size_t ++get_basic_type_alignment (unsigned short type) ++{ ++ switch (type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ return sizeof (UINT64); ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ return sizeof (long double); ++#endif ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++#if defined (__APPLE__) ++ return sizeof (UINT8); ++#endif ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++#if defined (__APPLE__) ++ return sizeof (UINT16); ++#endif ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++#if defined (__APPLE__) ++ return sizeof (UINT32); ++#endif ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ return sizeof (UINT64); ++ ++ default: ++ FFI_ASSERT (0); ++ return 0; ++ } ++} ++ ++/* Return the size in bytes for each of the basic types. */ ++ ++static size_t ++get_basic_type_size (unsigned short type) ++{ ++ switch (type) ++ { ++ case FFI_TYPE_FLOAT: ++ return sizeof (UINT32); ++ case FFI_TYPE_DOUBLE: ++ return sizeof (UINT64); ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ return sizeof (long double); ++#endif ++ case FFI_TYPE_UINT8: ++ return sizeof (UINT8); ++ case FFI_TYPE_SINT8: ++ return sizeof (SINT8); ++ case FFI_TYPE_UINT16: ++ return sizeof (UINT16); ++ case FFI_TYPE_SINT16: ++ return sizeof (SINT16); ++ case FFI_TYPE_UINT32: ++ return sizeof (UINT32); ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ return sizeof (SINT32); ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ return sizeof (UINT64); ++ case FFI_TYPE_SINT64: ++ return sizeof (SINT64); ++ ++ default: ++ FFI_ASSERT (0); ++ return 0; ++ } ++} ++ ++extern void ++ffi_call_SYSV (unsigned (*)(struct call_context *context, unsigned char *, ++ extended_cif *), ++ struct call_context *context, ++ extended_cif *, ++ size_t, ++ void (*fn)(void)); ++ ++extern void ++ffi_closure_SYSV (ffi_closure *); ++ ++/* Test for an FFI floating point representation. */ ++ ++static unsigned ++is_floating_type (unsigned short type) ++{ ++ return (type == FFI_TYPE_FLOAT || type == FFI_TYPE_DOUBLE ++ || type == FFI_TYPE_LONGDOUBLE); ++} ++ ++/* Test for a homogeneous structure. */ ++ ++static unsigned short ++get_homogeneous_type (ffi_type *ty) ++{ ++ if (ty->type == FFI_TYPE_STRUCT && ty->elements) ++ { ++ unsigned i; ++ unsigned short candidate_type ++ = get_homogeneous_type (ty->elements[0]); ++ for (i =1; ty->elements[i]; i++) ++ { ++ unsigned short iteration_type = 0; ++ /* If we have a nested struct, we must find its homogeneous type. ++ If that fits with our candidate type, we are still ++ homogeneous. */ ++ if (ty->elements[i]->type == FFI_TYPE_STRUCT ++ && ty->elements[i]->elements) ++ { ++ iteration_type = get_homogeneous_type (ty->elements[i]); ++ } ++ else ++ { ++ iteration_type = ty->elements[i]->type; ++ } ++ ++ /* If we are not homogeneous, return FFI_TYPE_STRUCT. */ ++ if (candidate_type != iteration_type) ++ return FFI_TYPE_STRUCT; ++ } ++ return candidate_type; ++ } ++ ++ /* Base case, we have no more levels of nesting, so we ++ are a basic type, and so, trivially homogeneous in that type. */ ++ return ty->type; ++} ++ ++/* Determine the number of elements within a STRUCT. ++ ++ Note, we must handle nested structs. ++ ++ If ty is not a STRUCT this function will return 0. */ ++ ++static unsigned ++element_count (ffi_type *ty) ++{ ++ if (ty->type == FFI_TYPE_STRUCT && ty->elements) ++ { ++ unsigned n; ++ unsigned elems = 0; ++ for (n = 0; ty->elements[n]; n++) ++ { ++ if (ty->elements[n]->type == FFI_TYPE_STRUCT ++ && ty->elements[n]->elements) ++ elems += element_count (ty->elements[n]); ++ else ++ elems++; ++ } ++ return elems; ++ } ++ return 0; ++} ++ ++/* Test for a homogeneous floating point aggregate. ++ ++ A homogeneous floating point aggregate is a homogeneous aggregate of ++ a half- single- or double- precision floating point type with one ++ to four elements. Note that this includes nested structs of the ++ basic type. */ ++ ++static int ++is_hfa (ffi_type *ty) ++{ ++ if (ty->type == FFI_TYPE_STRUCT ++ && ty->elements[0] ++ && is_floating_type (get_homogeneous_type (ty))) ++ { ++ unsigned n = element_count (ty); ++ return n >= 1 && n <= 4; ++ } ++ return 0; ++} ++ ++/* Test if an ffi_type is a candidate for passing in a register. ++ ++ This test does not check that sufficient registers of the ++ appropriate class are actually available, merely that IFF ++ sufficient registers are available then the argument will be passed ++ in register(s). ++ ++ Note that an ffi_type that is deemed to be a register candidate ++ will always be returned in registers. ++ ++ Returns 1 if a register candidate else 0. */ ++ ++static int ++is_register_candidate (ffi_type *ty) ++{ ++ switch (ty->type) ++ { ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#endif ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT64: ++ return 1; ++ ++ case FFI_TYPE_STRUCT: ++ if (is_hfa (ty)) ++ { ++ return 1; ++ } ++ else if (ty->size > 16) ++ { ++ /* Too large. Will be replaced with a pointer to memory. The ++ pointer MAY be passed in a register, but the value will ++ not. This test specifically fails since the argument will ++ never be passed by value in registers. */ ++ return 0; ++ } ++ else ++ { ++ /* Might be passed in registers depending on the number of ++ registers required. */ ++ return (ty->size + 7) / 8 < N_X_ARG_REG; ++ } ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ ++ return 0; ++} ++ ++/* Test if an ffi_type argument or result is a candidate for a vector ++ register. */ ++ ++static int ++is_v_register_candidate (ffi_type *ty) ++{ ++ return is_floating_type (ty->type) ++ || (ty->type == FFI_TYPE_STRUCT && is_hfa (ty)); ++} ++ ++/* Representation of the procedure call argument marshalling ++ state. ++ ++ The terse state variable names match the names used in the AARCH64 ++ PCS. */ ++ ++struct arg_state ++{ ++ unsigned ngrn; /* Next general-purpose register number. */ ++ unsigned nsrn; /* Next vector register number. */ ++ size_t nsaa; /* Next stack offset. */ ++}; ++ ++/* Initialize a procedure call argument marshalling state. */ ++static void ++arg_init (struct arg_state *state, size_t call_frame_size) ++{ ++ state->ngrn = 0; ++ state->nsrn = 0; ++ state->nsaa = 0; ++} ++ ++/* Return the number of available consecutive core argument ++ registers. */ ++ ++static unsigned ++available_x (struct arg_state *state) ++{ ++ return N_X_ARG_REG - state->ngrn; ++} ++ ++/* Return the number of available consecutive vector argument ++ registers. */ ++ ++static unsigned ++available_v (struct arg_state *state) ++{ ++ return N_V_ARG_REG - state->nsrn; ++} ++ ++static void * ++allocate_to_x (struct call_context *context, struct arg_state *state) ++{ ++ FFI_ASSERT (state->ngrn < N_X_ARG_REG); ++ return get_x_addr (context, (state->ngrn)++); ++} ++ ++static void * ++allocate_to_s (struct call_context *context, struct arg_state *state) ++{ ++ FFI_ASSERT (state->nsrn < N_V_ARG_REG); ++ return get_s_addr (context, (state->nsrn)++); ++} ++ ++static void * ++allocate_to_d (struct call_context *context, struct arg_state *state) ++{ ++ FFI_ASSERT (state->nsrn < N_V_ARG_REG); ++ return get_d_addr (context, (state->nsrn)++); ++} ++ ++static void * ++allocate_to_v (struct call_context *context, struct arg_state *state) ++{ ++ FFI_ASSERT (state->nsrn < N_V_ARG_REG); ++ return get_v_addr (context, (state->nsrn)++); ++} ++ ++/* Allocate an aligned slot on the stack and return a pointer to it. */ ++static void * ++allocate_to_stack (struct arg_state *state, void *stack, size_t alignment, ++ size_t size) ++{ ++ void *allocation; ++ ++ /* Round up the NSAA to the larger of 8 or the natural ++ alignment of the argument's type. */ ++ state->nsaa = ALIGN (state->nsaa, alignment); ++ state->nsaa = ALIGN (state->nsaa, alignment); ++#if !defined (__APPLE__) ++ state->nsaa = ALIGN (state->nsaa, 8); ++#endif ++ ++ allocation = stack + state->nsaa; ++ ++ state->nsaa += size; ++ return allocation; ++} ++ ++static void ++copy_basic_type (void *dest, void *source, unsigned short type) ++{ ++ /* This is necessary to ensure that basic types are copied ++ sign extended to 64-bits as libffi expects. */ ++ switch (type) ++ { ++ case FFI_TYPE_FLOAT: ++ *(float *) dest = *(float *) source; ++ break; ++ case FFI_TYPE_DOUBLE: ++ *(double *) dest = *(double *) source; ++ break; ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ *(long double *) dest = *(long double *) source; ++ break; ++#endif ++ case FFI_TYPE_UINT8: ++ *(ffi_arg *) dest = *(UINT8 *) source; ++ break; ++ case FFI_TYPE_SINT8: ++ *(ffi_sarg *) dest = *(SINT8 *) source; ++ break; ++ case FFI_TYPE_UINT16: ++ *(ffi_arg *) dest = *(UINT16 *) source; ++ break; ++ case FFI_TYPE_SINT16: ++ *(ffi_sarg *) dest = *(SINT16 *) source; ++ break; ++ case FFI_TYPE_UINT32: ++ *(ffi_arg *) dest = *(UINT32 *) source; ++ break; ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ *(ffi_sarg *) dest = *(SINT32 *) source; ++ break; ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ *(ffi_arg *) dest = *(UINT64 *) source; ++ break; ++ case FFI_TYPE_SINT64: ++ *(ffi_sarg *) dest = *(SINT64 *) source; ++ break; ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ } ++} ++ ++static void ++copy_hfa_to_reg_or_stack (void *memory, ++ ffi_type *ty, ++ struct call_context *context, ++ unsigned char *stack, ++ struct arg_state *state) ++{ ++ unsigned elems = element_count (ty); ++ if (available_v (state) < elems) ++ { ++ /* There are insufficient V registers. Further V register allocations ++ are prevented, the NSAA is adjusted (by allocate_to_stack ()) ++ and the argument is copied to memory at the adjusted NSAA. */ ++ state->nsrn = N_V_ARG_REG; ++ memcpy (allocate_to_stack (state, stack, ty->alignment, ty->size), ++ memory, ++ ty->size); ++ } ++ else ++ { ++ int i; ++ unsigned short type = get_homogeneous_type (ty); ++ for (i = 0; i < elems; i++) ++ { ++ void *reg = allocate_to_v (context, state); ++ copy_basic_type (reg, memory, type); ++ memory += get_basic_type_size (type); ++ } ++ } ++} ++ ++/* Either allocate an appropriate register for the argument type, or if ++ none are available, allocate a stack slot and return a pointer ++ to the allocated space. */ ++ ++static void * ++allocate_to_register_or_stack (struct call_context *context, ++ unsigned char *stack, ++ struct arg_state *state, ++ unsigned short type) ++{ ++ size_t alignment = get_basic_type_alignment (type); ++ size_t size = alignment; ++ switch (type) ++ { ++ case FFI_TYPE_FLOAT: ++ /* This is the only case for which the allocated stack size ++ should not match the alignment of the type. */ ++ size = sizeof (UINT32); ++ /* Fall through. */ ++ case FFI_TYPE_DOUBLE: ++ if (state->nsrn < N_V_ARG_REG) ++ return allocate_to_d (context, state); ++ state->nsrn = N_V_ARG_REG; ++ break; ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ if (state->nsrn < N_V_ARG_REG) ++ return allocate_to_v (context, state); ++ state->nsrn = N_V_ARG_REG; ++ break; ++#endif ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ if (state->ngrn < N_X_ARG_REG) ++ return allocate_to_x (context, state); ++ state->ngrn = N_X_ARG_REG; ++ break; ++ default: ++ FFI_ASSERT (0); ++ } ++ ++ return allocate_to_stack (state, stack, alignment, size); ++} ++ ++/* Copy a value to an appropriate register, or if none are ++ available, to the stack. */ ++ ++static void ++copy_to_register_or_stack (struct call_context *context, ++ unsigned char *stack, ++ struct arg_state *state, ++ void *value, ++ unsigned short type) ++{ ++ copy_basic_type ( ++ allocate_to_register_or_stack (context, stack, state, type), ++ value, ++ type); ++} ++ ++/* Marshall the arguments from FFI representation to procedure call ++ context and stack. */ ++ ++static unsigned ++aarch64_prep_args (struct call_context *context, unsigned char *stack, ++ extended_cif *ecif) ++{ ++ int i; ++ struct arg_state state; ++ ++ arg_init (&state, ALIGN(ecif->cif->bytes, 16)); ++ ++ for (i = 0; i < ecif->cif->nargs; i++) ++ { ++ ffi_type *ty = ecif->cif->arg_types[i]; ++ switch (ty->type) ++ { ++ case FFI_TYPE_VOID: ++ FFI_ASSERT (0); ++ break; ++ ++ /* If the argument is a basic type the argument is allocated to an ++ appropriate register, or if none are available, to the stack. */ ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#endif ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ copy_to_register_or_stack (context, stack, &state, ++ ecif->avalue[i], ty->type); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (is_hfa (ty)) ++ { ++ copy_hfa_to_reg_or_stack (ecif->avalue[i], ty, context, ++ stack, &state); ++ } ++ else if (ty->size > 16) ++ { ++ /* If the argument is a composite type that is larger than 16 ++ bytes, then the argument has been copied to memory, and ++ the argument is replaced by a pointer to the copy. */ ++ ++ copy_to_register_or_stack (context, stack, &state, ++ &(ecif->avalue[i]), FFI_TYPE_POINTER); ++ } ++ else if (available_x (&state) >= (ty->size + 7) / 8) ++ { ++ /* If the argument is a composite type and the size in ++ double-words is not more than the number of available ++ X registers, then the argument is copied into consecutive ++ X registers. */ ++ int j; ++ for (j = 0; j < (ty->size + 7) / 8; j++) ++ { ++ memcpy (allocate_to_x (context, &state), ++ &(((UINT64 *) ecif->avalue[i])[j]), ++ sizeof (UINT64)); ++ } ++ } ++ else ++ { ++ /* Otherwise, there are insufficient X registers. Further X ++ register allocations are prevented, the NSAA is adjusted ++ (by allocate_to_stack ()) and the argument is copied to ++ memory at the adjusted NSAA. */ ++ state.ngrn = N_X_ARG_REG; ++ ++ memcpy (allocate_to_stack (&state, stack, ty->alignment, ++ ty->size), ecif->avalue + i, ty->size); ++ } ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ } ++ ++ return ecif->cif->aarch64_flags; ++} ++ ++ffi_status ++ffi_prep_cif_machdep (ffi_cif *cif) ++{ ++ /* Round the stack up to a multiple of the stack alignment requirement. */ ++ cif->bytes = ++ (cif->bytes + (AARCH64_STACK_ALIGN - 1)) & ~ (AARCH64_STACK_ALIGN - 1); ++ ++ /* Initialize our flags. We are interested if this CIF will touch a ++ vector register, if so we will enable context save and load to ++ those registers, otherwise not. This is intended to be friendly ++ to lazy float context switching in the kernel. */ ++ cif->aarch64_flags = 0; ++ ++ if (is_v_register_candidate (cif->rtype)) ++ { ++ cif->aarch64_flags |= AARCH64_FFI_WITH_V; ++ } ++ else ++ { ++ int i; ++ for (i = 0; i < cif->nargs; i++) ++ if (is_v_register_candidate (cif->arg_types[i])) ++ { ++ cif->aarch64_flags |= AARCH64_FFI_WITH_V; ++ break; ++ } ++ } ++ ++ return FFI_OK; ++} ++ ++/* Call a function with the provided arguments and capture the return ++ value. */ ++void ++ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ { ++ struct call_context context; ++ size_t stack_bytes; ++ ++ /* Figure out the total amount of stack space we need, the ++ above call frame space needs to be 16 bytes aligned to ++ ensure correct alignment of the first object inserted in ++ that space hence the ALIGN applied to cif->bytes.*/ ++ stack_bytes = ALIGN(cif->bytes, 16); ++ ++ memset (&context, 0, sizeof (context)); ++ if (is_register_candidate (cif->rtype)) ++ { ++ ffi_call_SYSV (aarch64_prep_args, &context, &ecif, stack_bytes, fn); ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#endif ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT64: ++ { ++ void *addr = get_basic_type_addr (cif->rtype->type, ++ &context, 0); ++ copy_basic_type (rvalue, addr, cif->rtype->type); ++ break; ++ } ++ ++ case FFI_TYPE_STRUCT: ++ if (is_hfa (cif->rtype)) ++ { ++ int j; ++ unsigned short type = get_homogeneous_type (cif->rtype); ++ unsigned elems = element_count (cif->rtype); ++ for (j = 0; j < elems; j++) ++ { ++ void *reg = get_basic_type_addr (type, &context, j); ++ copy_basic_type (rvalue, reg, type); ++ rvalue += get_basic_type_size (type); ++ } ++ } ++ else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) ++ { ++ size_t size = ALIGN (cif->rtype->size, sizeof (UINT64)); ++ memcpy (rvalue, get_x_addr (&context, 0), size); ++ } ++ else ++ { ++ FFI_ASSERT (0); ++ } ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ } ++ else ++ { ++ memcpy (get_x_addr (&context, 8), &rvalue, sizeof (UINT64)); ++ ffi_call_SYSV (aarch64_prep_args, &context, &ecif, ++ stack_bytes, fn); ++ } ++ break; ++ } ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++static unsigned char trampoline [] = ++{ 0x70, 0x00, 0x00, 0x58, /* ldr x16, 1f */ ++ 0x91, 0x00, 0x00, 0x10, /* adr x17, 2f */ ++ 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ ++}; ++ ++/* Build a trampoline. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX,FLAGS) \ ++ ({unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++ UINT64 __fun = (UINT64)(FUN); \ ++ UINT64 __ctx = (UINT64)(CTX); \ ++ UINT64 __flags = (UINT64)(FLAGS); \ ++ memcpy (__tramp, trampoline, sizeof (trampoline)); \ ++ memcpy (__tramp + 12, &__fun, sizeof (__fun)); \ ++ memcpy (__tramp + 20, &__ctx, sizeof (__ctx)); \ ++ memcpy (__tramp + 28, &__flags, sizeof (__flags)); \ ++ ffi_clear_cache(__tramp, __tramp + FFI_TRAMPOLINE_SIZE); \ ++ }) ++ ++ffi_status ++ffi_prep_closure_loc (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_SYSV, codeloc, ++ cif->aarch64_flags); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* Primary handler to setup and invoke a function within a closure. ++ ++ A closure when invoked enters via the assembler wrapper ++ ffi_closure_SYSV(). The wrapper allocates a call context on the ++ stack, saves the interesting registers (from the perspective of ++ the calling convention) into the context then passes control to ++ ffi_closure_SYSV_inner() passing the saved context and a pointer to ++ the stack at the point ffi_closure_SYSV() was invoked. ++ ++ On the return path the assembler wrapper will reload call context ++ registers. ++ ++ ffi_closure_SYSV_inner() marshalls the call context into ffi value ++ descriptors, invokes the wrapped function, then marshalls the return ++ value back into the call context. */ ++ ++void FFI_HIDDEN ++ffi_closure_SYSV_inner (ffi_closure *closure, struct call_context *context, ++ void *stack) ++{ ++ ffi_cif *cif = closure->cif; ++ void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); ++ void *rvalue = NULL; ++ int i; ++ struct arg_state state; ++ ++ arg_init (&state, ALIGN(cif->bytes, 16)); ++ ++ for (i = 0; i < cif->nargs; i++) ++ { ++ ffi_type *ty = cif->arg_types[i]; ++ ++ switch (ty->type) ++ { ++ case FFI_TYPE_VOID: ++ FFI_ASSERT (0); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ avalue[i] = allocate_to_register_or_stack (context, stack, ++ &state, ty->type); ++ break; ++#endif ++ ++ case FFI_TYPE_STRUCT: ++ if (is_hfa (ty)) ++ { ++ unsigned n = element_count (ty); ++ if (available_v (&state) < n) ++ { ++ state.nsrn = N_V_ARG_REG; ++ avalue[i] = allocate_to_stack (&state, stack, ty->alignment, ++ ty->size); ++ } ++ else ++ { ++ switch (get_homogeneous_type (ty)) ++ { ++ case FFI_TYPE_FLOAT: ++ { ++ /* Eeek! We need a pointer to the structure, ++ however the homogeneous float elements are ++ being passed in individual S registers, ++ therefore the structure is not represented as ++ a contiguous sequence of bytes in our saved ++ register context. We need to fake up a copy ++ of the structure laid out in memory ++ correctly. The fake can be tossed once the ++ closure function has returned hence alloca() ++ is sufficient. */ ++ int j; ++ UINT32 *p = avalue[i] = alloca (ty->size); ++ for (j = 0; j < element_count (ty); j++) ++ memcpy (&p[j], ++ allocate_to_s (context, &state), ++ sizeof (*p)); ++ break; ++ } ++ ++ case FFI_TYPE_DOUBLE: ++ { ++ /* Eeek! We need a pointer to the structure, ++ however the homogeneous float elements are ++ being passed in individual S registers, ++ therefore the structure is not represented as ++ a contiguous sequence of bytes in our saved ++ register context. We need to fake up a copy ++ of the structure laid out in memory ++ correctly. The fake can be tossed once the ++ closure function has returned hence alloca() ++ is sufficient. */ ++ int j; ++ UINT64 *p = avalue[i] = alloca (ty->size); ++ for (j = 0; j < element_count (ty); j++) ++ memcpy (&p[j], ++ allocate_to_d (context, &state), ++ sizeof (*p)); ++ break; ++ } ++ ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ memcpy (&avalue[i], ++ allocate_to_v (context, &state), ++ sizeof (*avalue)); ++ break; ++#endif ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ } ++ } ++ else if (ty->size > 16) ++ { ++ /* Replace Composite type of size greater than 16 with a ++ pointer. */ ++ memcpy (&avalue[i], ++ allocate_to_register_or_stack (context, stack, ++ &state, FFI_TYPE_POINTER), ++ sizeof (avalue[i])); ++ } ++ else if (available_x (&state) >= (ty->size + 7) / 8) ++ { ++ avalue[i] = get_x_addr (context, state.ngrn); ++ state.ngrn += (ty->size + 7) / 8; ++ } ++ else ++ { ++ state.ngrn = N_X_ARG_REG; ++ ++ avalue[i] = allocate_to_stack (&state, stack, ty->alignment, ++ ty->size); ++ } ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ } ++ ++ /* Figure out where the return value will be passed, either in ++ registers or in a memory block allocated by the caller and passed ++ in x8. */ ++ ++ if (is_register_candidate (cif->rtype)) ++ { ++ /* Register candidates are *always* returned in registers. */ ++ ++ /* Allocate a scratchpad for the return value, we will let the ++ callee scrible the result into the scratch pad then move the ++ contents into the appropriate return value location for the ++ call convention. */ ++ rvalue = alloca (cif->rtype->size); ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ ++ /* Copy the return value into the call context so that it is returned ++ as expected to our caller. */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#endif ++ { ++ void *addr = get_basic_type_addr (cif->rtype->type, context, 0); ++ copy_basic_type (addr, rvalue, cif->rtype->type); ++ break; ++ } ++ case FFI_TYPE_STRUCT: ++ if (is_hfa (cif->rtype)) ++ { ++ int j; ++ unsigned short type = get_homogeneous_type (cif->rtype); ++ unsigned elems = element_count (cif->rtype); ++ for (j = 0; j < elems; j++) ++ { ++ void *reg = get_basic_type_addr (type, context, j); ++ copy_basic_type (reg, rvalue, type); ++ rvalue += get_basic_type_size (type); ++ } ++ } ++ else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) ++ { ++ size_t size = ALIGN (cif->rtype->size, sizeof (UINT64)) ; ++ memcpy (get_x_addr (context, 0), rvalue, size); ++ } ++ else ++ { ++ FFI_ASSERT (0); ++ } ++ break; ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ } ++ else ++ { ++ memcpy (&rvalue, get_x_addr (context, 8), sizeof (UINT64)); ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ } ++} ++ +diff --git a/js/src/ctypes/libffi/src/aarch64/ffitarget.h b/js/src/ctypes/libffi/src/aarch64/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/aarch64/ffitarget.h +@@ -0,0 +1,59 @@ ++/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be ++included in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi ++ { ++ FFI_FIRST_ABI = 0, ++ FFI_SYSV, ++ FFI_LAST_ABI, ++ FFI_DEFAULT_ABI = FFI_SYSV ++ } ffi_abi; ++#endif ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 36 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* ---- Internal ---- */ ++ ++ ++#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_flags ++ ++#define AARCH64_FFI_WITH_V_BIT 0 ++ ++#define AARCH64_N_XREG 32 ++#define AARCH64_N_VREG 32 ++#define AARCH64_CALL_CONTEXT_SIZE (AARCH64_N_XREG * 8 + AARCH64_N_VREG * 16) ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/aarch64/sysv.S b/js/src/ctypes/libffi/src/aarch64/sysv.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/aarch64/sysv.S +@@ -0,0 +1,327 @@ ++/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be ++included in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef HAVE_MACHINE_ASM_H ++#include ++#else ++#ifdef __USER_LABEL_PREFIX__ ++#define CONCAT1(a, b) CONCAT2(a, b) ++#define CONCAT2(a, b) a ## b ++ ++/* Use the right prefix for global labels. */ ++#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) ++#else ++#define CNAME(x) x ++#endif ++#endif ++ ++#define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off ++#define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off ++#define cfi_restore(reg) .cfi_restore reg ++#define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg ++ ++ .text ++ .globl CNAME(ffi_call_SYSV) ++#ifdef __ELF__ ++ .type CNAME(ffi_call_SYSV), #function ++#endif ++ ++/* ffi_call_SYSV() ++ ++ Create a stack frame, setup an argument context, call the callee ++ and extract the result. ++ ++ The maximum required argument stack size is provided, ++ ffi_call_SYSV() allocates that stack space then calls the ++ prepare_fn to populate register context and stack. The ++ argument passing registers are loaded from the register ++ context and the callee called, on return the register passing ++ register are saved back to the context. Our caller will ++ extract the return value from the final state of the saved ++ register context. ++ ++ Prototype: ++ ++ extern unsigned ++ ffi_call_SYSV (void (*)(struct call_context *context, unsigned char *, ++ extended_cif *), ++ struct call_context *context, ++ extended_cif *, ++ size_t required_stack_size, ++ void (*fn)(void)); ++ ++ Therefore on entry we have: ++ ++ x0 prepare_fn ++ x1 &context ++ x2 &ecif ++ x3 bytes ++ x4 fn ++ ++ This function uses the following stack frame layout: ++ ++ == ++ saved x30(lr) ++ x29(fp)-> saved x29(fp) ++ saved x24 ++ saved x23 ++ saved x22 ++ sp' -> saved x21 ++ ... ++ sp -> (constructed callee stack arguments) ++ == ++ ++ Voila! */ ++ ++#define ffi_call_SYSV_FS (8 * 4) ++ ++ .cfi_startproc ++CNAME(ffi_call_SYSV): ++ stp x29, x30, [sp, #-16]! ++ cfi_adjust_cfa_offset (16) ++ cfi_rel_offset (x29, 0) ++ cfi_rel_offset (x30, 8) ++ ++ mov x29, sp ++ cfi_def_cfa_register (x29) ++ sub sp, sp, #ffi_call_SYSV_FS ++ ++ stp x21, x22, [sp, #0] ++ cfi_rel_offset (x21, 0 - ffi_call_SYSV_FS) ++ cfi_rel_offset (x22, 8 - ffi_call_SYSV_FS) ++ ++ stp x23, x24, [sp, #16] ++ cfi_rel_offset (x23, 16 - ffi_call_SYSV_FS) ++ cfi_rel_offset (x24, 24 - ffi_call_SYSV_FS) ++ ++ mov x21, x1 ++ mov x22, x2 ++ mov x24, x4 ++ ++ /* Allocate the stack space for the actual arguments, many ++ arguments will be passed in registers, but we assume ++ worst case and allocate sufficient stack for ALL of ++ the arguments. */ ++ sub sp, sp, x3 ++ ++ /* unsigned (*prepare_fn) (struct call_context *context, ++ unsigned char *stack, extended_cif *ecif); ++ */ ++ mov x23, x0 ++ mov x0, x1 ++ mov x1, sp ++ /* x2 already in place */ ++ blr x23 ++ ++ /* Preserve the flags returned. */ ++ mov x23, x0 ++ ++ /* Figure out if we should touch the vector registers. */ ++ tbz x23, #AARCH64_FFI_WITH_V_BIT, 1f ++ ++ /* Load the vector argument passing registers. */ ++ ldp q0, q1, [x21, #8*32 + 0] ++ ldp q2, q3, [x21, #8*32 + 32] ++ ldp q4, q5, [x21, #8*32 + 64] ++ ldp q6, q7, [x21, #8*32 + 96] ++1: ++ /* Load the core argument passing registers. */ ++ ldp x0, x1, [x21, #0] ++ ldp x2, x3, [x21, #16] ++ ldp x4, x5, [x21, #32] ++ ldp x6, x7, [x21, #48] ++ ++ /* Don't forget x8 which may be holding the address of a return buffer. ++ */ ++ ldr x8, [x21, #8*8] ++ ++ blr x24 ++ ++ /* Save the core argument passing registers. */ ++ stp x0, x1, [x21, #0] ++ stp x2, x3, [x21, #16] ++ stp x4, x5, [x21, #32] ++ stp x6, x7, [x21, #48] ++ ++ /* Note nothing useful ever comes back in x8! */ ++ ++ /* Figure out if we should touch the vector registers. */ ++ tbz x23, #AARCH64_FFI_WITH_V_BIT, 1f ++ ++ /* Save the vector argument passing registers. */ ++ stp q0, q1, [x21, #8*32 + 0] ++ stp q2, q3, [x21, #8*32 + 32] ++ stp q4, q5, [x21, #8*32 + 64] ++ stp q6, q7, [x21, #8*32 + 96] ++1: ++ /* All done, unwind our stack frame. */ ++ ldp x21, x22, [x29, # - ffi_call_SYSV_FS] ++ cfi_restore (x21) ++ cfi_restore (x22) ++ ++ ldp x23, x24, [x29, # - ffi_call_SYSV_FS + 16] ++ cfi_restore (x23) ++ cfi_restore (x24) ++ ++ mov sp, x29 ++ cfi_def_cfa_register (sp) ++ ++ ldp x29, x30, [sp], #16 ++ cfi_adjust_cfa_offset (-16) ++ cfi_restore (x29) ++ cfi_restore (x30) ++ ++ ret ++ ++ .cfi_endproc ++#ifdef __ELF__ ++ .size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV) ++#endif ++ ++#define ffi_closure_SYSV_FS (8 * 2 + AARCH64_CALL_CONTEXT_SIZE) ++ ++/* ffi_closure_SYSV ++ ++ Closure invocation glue. This is the low level code invoked directly by ++ the closure trampoline to setup and call a closure. ++ ++ On entry x17 points to a struct trampoline_data, x16 has been clobbered ++ all other registers are preserved. ++ ++ We allocate a call context and save the argument passing registers, ++ then invoked the generic C ffi_closure_SYSV_inner() function to do all ++ the real work, on return we load the result passing registers back from ++ the call context. ++ ++ On entry ++ ++ extern void ++ ffi_closure_SYSV (struct trampoline_data *); ++ ++ struct trampoline_data ++ { ++ UINT64 *ffi_closure; ++ UINT64 flags; ++ }; ++ ++ This function uses the following stack frame layout: ++ ++ == ++ saved x30(lr) ++ x29(fp)-> saved x29(fp) ++ saved x22 ++ saved x21 ++ ... ++ sp -> call_context ++ == ++ ++ Voila! */ ++ ++ .text ++ .globl CNAME(ffi_closure_SYSV) ++ .cfi_startproc ++CNAME(ffi_closure_SYSV): ++ stp x29, x30, [sp, #-16]! ++ cfi_adjust_cfa_offset (16) ++ cfi_rel_offset (x29, 0) ++ cfi_rel_offset (x30, 8) ++ ++ mov x29, sp ++ cfi_def_cfa_register (x29) ++ ++ sub sp, sp, #ffi_closure_SYSV_FS ++ ++ stp x21, x22, [x29, #-16] ++ cfi_rel_offset (x21, -16) ++ cfi_rel_offset (x22, -8) ++ ++ /* Load x21 with &call_context. */ ++ mov x21, sp ++ /* Preserve our struct trampoline_data * */ ++ mov x22, x17 ++ ++ /* Save the rest of the argument passing registers. */ ++ stp x0, x1, [x21, #0] ++ stp x2, x3, [x21, #16] ++ stp x4, x5, [x21, #32] ++ stp x6, x7, [x21, #48] ++ /* Don't forget we may have been given a result scratch pad address. ++ */ ++ str x8, [x21, #64] ++ ++ /* Figure out if we should touch the vector registers. */ ++ ldr x0, [x22, #8] ++ tbz x0, #AARCH64_FFI_WITH_V_BIT, 1f ++ ++ /* Save the argument passing vector registers. */ ++ stp q0, q1, [x21, #8*32 + 0] ++ stp q2, q3, [x21, #8*32 + 32] ++ stp q4, q5, [x21, #8*32 + 64] ++ stp q6, q7, [x21, #8*32 + 96] ++1: ++ /* Load &ffi_closure.. */ ++ ldr x0, [x22, #0] ++ mov x1, x21 ++ /* Compute the location of the stack at the point that the ++ trampoline was called. */ ++ add x2, x29, #16 ++ ++ bl CNAME(ffi_closure_SYSV_inner) ++ ++ /* Figure out if we should touch the vector registers. */ ++ ldr x0, [x22, #8] ++ tbz x0, #AARCH64_FFI_WITH_V_BIT, 1f ++ ++ /* Load the result passing vector registers. */ ++ ldp q0, q1, [x21, #8*32 + 0] ++ ldp q2, q3, [x21, #8*32 + 32] ++ ldp q4, q5, [x21, #8*32 + 64] ++ ldp q6, q7, [x21, #8*32 + 96] ++1: ++ /* Load the result passing core registers. */ ++ ldp x0, x1, [x21, #0] ++ ldp x2, x3, [x21, #16] ++ ldp x4, x5, [x21, #32] ++ ldp x6, x7, [x21, #48] ++ /* Note nothing useful is returned in x8. */ ++ ++ /* We are done, unwind our frame. */ ++ ldp x21, x22, [x29, #-16] ++ cfi_restore (x21) ++ cfi_restore (x22) ++ ++ mov sp, x29 ++ cfi_def_cfa_register (sp) ++ ++ ldp x29, x30, [sp], #16 ++ cfi_adjust_cfa_offset (-16) ++ cfi_restore (x29) ++ cfi_restore (x30) ++ ++ ret ++ .cfi_endproc ++#ifdef __ELF__ ++ .size CNAME(ffi_closure_SYSV), .-CNAME(ffi_closure_SYSV) ++#endif +diff --git a/js/src/ctypes/libffi/src/alpha/ffi.c b/js/src/ctypes/libffi/src/alpha/ffi.c +--- a/js/src/ctypes/libffi/src/alpha/ffi.c ++++ b/js/src/ctypes/libffi/src/alpha/ffi.c +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. ++ ffi.c - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. + + Alpha Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -173,16 +174,19 @@ ffi_status + ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) + { + unsigned int *tramp; + ++ if (cif->abi != FFI_OSF) ++ return FFI_BAD_ABI; ++ + tramp = (unsigned int *) &closure->tramp[0]; + tramp[0] = 0x47fb0401; /* mov $27,$1 */ + tramp[1] = 0xa77b0010; /* ldq $27,16($27) */ + tramp[2] = 0x6bfb0000; /* jmp $31,($27),0 */ + tramp[3] = 0x47ff041f; /* nop */ + *(void **) &tramp[4] = ffi_closure_osf; + + closure->cif = cif; +diff --git a/js/src/ctypes/libffi/src/alpha/ffitarget.h b/js/src/ctypes/libffi/src/alpha/ffitarget.h +--- a/js/src/ctypes/libffi/src/alpha/ffitarget.h ++++ b/js/src/ctypes/libffi/src/alpha/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for Alpha. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_OSF, + FFI_LAST_ABI, +diff --git a/js/src/ctypes/libffi/src/alpha/osf.S b/js/src/ctypes/libffi/src/alpha/osf.S +--- a/js/src/ctypes/libffi/src/alpha/osf.S ++++ b/js/src/ctypes/libffi/src/alpha/osf.S +@@ -1,10 +1,10 @@ + /* ----------------------------------------------------------------------- +- osf.S - Copyright (c) 1998, 2001, 2007, 2008 Red Hat ++ osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011 Red Hat + + Alpha/OSF Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -294,73 +294,94 @@ ffi_closure_osf: + || FFI_TYPE_SINT64 != 12 \ + || FFI_TYPE_STRUCT != 13 \ + || FFI_TYPE_POINTER != 14 \ + || FFI_TYPE_LAST != 14 + #error "osf.S out of sync with ffi.h" + #endif + + #ifdef __ELF__ ++# define UA_SI .4byte ++# define FDE_ENCODING 0x1b /* pcrel sdata4 */ ++# define FDE_ENCODE(X) .4byte X-. ++# define FDE_ARANGE(X) .4byte X ++#elif defined __osf__ ++# define UA_SI .align 0; .long ++# define FDE_ENCODING 0x50 /* aligned absolute */ ++# define FDE_ENCODE(X) .align 3; .quad X ++# define FDE_ARANGE(X) .align 0; .quad X ++#endif ++ ++#ifdef __ELF__ + .section .eh_frame,EH_FRAME_FLAGS,@progbits ++#elif defined __osf__ ++ .data ++ .align 3 ++ .globl _GLOBAL__F_ffi_call_osf ++_GLOBAL__F_ffi_call_osf: ++#endif + __FRAME_BEGIN__: +- .4byte $LECIE1-$LSCIE1 # Length of Common Information Entry ++ UA_SI $LECIE1-$LSCIE1 # Length of Common Information Entry + $LSCIE1: +- .4byte 0x0 # CIE Identifier Tag ++ UA_SI 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor + .byte 0x78 # sleb128 -8; CIE Data Alignment Factor + .byte 26 # CIE RA Column + .byte 0x1 # uleb128 0x1; Augmentation size +- .byte 0x1b # FDE Encoding (pcrel sdata4) ++ .byte FDE_ENCODING # FDE Encoding + .byte 0xc # DW_CFA_def_cfa + .byte 30 # uleb128 column 30 + .byte 0 # uleb128 offset 0 + .align 3 + $LECIE1: + $LSFDE1: +- .4byte $LEFDE1-$LASFDE1 # FDE Length ++ UA_SI $LEFDE1-$LASFDE1 # FDE Length + $LASFDE1: +- .4byte $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset +- .4byte $LFB1-. # FDE initial location +- .4byte $LFE1-$LFB1 # FDE address range ++ UA_SI $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset ++ FDE_ENCODE($LFB1) # FDE initial location ++ FDE_ARANGE($LFE1-$LFB1) # FDE address range + .byte 0x0 # uleb128 0x0; Augmentation size + + .byte 0x4 # DW_CFA_advance_loc4 +- .4byte $LCFI1-$LFB1 ++ UA_SI $LCFI1-$LFB1 + .byte 0x9a # DW_CFA_offset, column 26 + .byte 4 # uleb128 4*-8 + .byte 0x8f # DW_CFA_offset, column 15 + .byte 0x3 # uleb128 3*-8 + .byte 0xc # DW_CFA_def_cfa + .byte 15 # uleb128 column 15 + .byte 32 # uleb128 offset 32 + + .byte 0x4 # DW_CFA_advance_loc4 +- .4byte $LCFI2-$LCFI1 ++ UA_SI $LCFI2-$LCFI1 + .byte 0xda # DW_CFA_restore, column 26 + .align 3 + $LEFDE1: + + $LSFDE3: +- .4byte $LEFDE3-$LASFDE3 # FDE Length ++ UA_SI $LEFDE3-$LASFDE3 # FDE Length + $LASFDE3: +- .4byte $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset +- .4byte $LFB2-. # FDE initial location +- .4byte $LFE2-$LFB2 # FDE address range ++ UA_SI $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset ++ FDE_ENCODE($LFB2) # FDE initial location ++ FDE_ARANGE($LFE2-$LFB2) # FDE address range + .byte 0x0 # uleb128 0x0; Augmentation size + + .byte 0x4 # DW_CFA_advance_loc4 +- .4byte $LCFI5-$LFB2 ++ UA_SI $LCFI5-$LFB2 + .byte 0xe # DW_CFA_def_cfa_offset + .byte 0x80,0x1 # uleb128 128 + + .byte 0x4 # DW_CFA_advance_loc4 +- .4byte $LCFI6-$LCFI5 ++ UA_SI $LCFI6-$LCFI5 + .byte 0x9a # DW_CFA_offset, column 26 + .byte 16 # uleb128 offset 16*-8 + .align 3 + $LEFDE3: ++#if defined __osf__ ++ .align 0 ++ .long 0 # End of Table ++#endif + +-#ifdef __linux__ ++#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits + #endif +-#endif +diff --git a/js/src/ctypes/libffi/src/arc/arcompact.S b/js/src/ctypes/libffi/src/arc/arcompact.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/arc/arcompact.S +@@ -0,0 +1,135 @@ ++/* ----------------------------------------------------------------------- ++ arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) ++ ++ ARCompact Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#include ++#ifdef HAVE_MACHINE_ASM_H ++#include ++#else ++#define CNAME(x) x ++#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x): ++#endif ++ ++.text ++ ++ /* R0: ffi_prep_args */ ++ /* R1: &ecif */ ++ /* R2: cif->bytes */ ++ /* R3: fig->flags */ ++ /* R4: ecif.rvalue */ ++ /* R5: fn */ ++ENTRY(ffi_call_ARCompact) ++ /* Save registers. */ ++ st.a fp, [sp, -4] /* fp + 20, fp */ ++ push_s blink /* fp + 16, blink */ ++ st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */ ++ push_s r3 /* fp + 8, fig->flags */ ++ st.a r5, [sp, -4] /* fp + 4, fn */ ++ push_s r2 /* fp + 0, cif->bytes */ ++ mov fp, sp ++ ++ /* Make room for all of the new args. */ ++ sub sp, sp, r2 ++ ++ /* Place all of the ffi_prep_args in position. */ ++ /* ffi_prep_args(char *stack, extended_cif *ecif) */ ++ /* R1 already set. */ ++ ++ /* And call. */ ++ jl_s.d [r0] ++ mov_s r0, sp ++ ++ ld.ab r12, [fp, 4] /* cif->bytes */ ++ ld.ab r11, [fp, 4] /* fn */ ++ ++ /* Move first 8 parameters in registers... */ ++ ld_s r0, [sp] ++ ld_s r1, [sp, 4] ++ ld_s r2, [sp, 8] ++ ld_s r3, [sp, 12] ++ ld r4, [sp, 16] ++ ld r5, [sp, 20] ++ ld r6, [sp, 24] ++ ld r7, [sp, 28] ++ ++ /* ...and adjust the stack. */ ++ min r12, r12, 32 ++ ++ /* Call the function. */ ++ jl.d [r11] ++ add sp, sp, r12 ++ ++ mov sp, fp ++ pop_s r3 /* fig->flags, return type */ ++ pop_s r2 /* ecif.rvalue, pointer for return value */ ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ breq.d r2, 0, epilogue ++ pop_s blink ++ ++ /* Return INT. */ ++ brne r3, FFI_TYPE_INT, return_double ++ b.d epilogue ++ st_s r0, [r2] ++ ++return_double: ++ brne r3, FFI_TYPE_DOUBLE, epilogue ++ st_s r0, [r2] ++ st_s r1, [r2,4] ++ ++epilogue: ++ j_s.d [blink] ++ ld.ab fp, [sp, 4] ++ ++ENTRY(ffi_closure_ARCompact) ++ st.a r0, [sp, -32] ++ st_s r1, [sp, 4] ++ st_s r2, [sp, 8] ++ st_s r3, [sp, 12] ++ st r4, [sp, 16] ++ st r5, [sp, 20] ++ st r6, [sp, 24] ++ st r7, [sp, 28] ++ ++ /* pointer to arguments */ ++ mov_s r2, sp ++ ++ /* return value goes here */ ++ sub sp, sp, 8 ++ mov_s r1, sp ++ ++ push_s blink ++ ++ bl.d ffi_closure_inner_ARCompact ++ mov_s r0, r8 /* codeloc, set by trampoline */ ++ ++ pop_s blink ++ ++ /* set return value to r1:r0 */ ++ pop_s r0 ++ pop_s r1 ++ j_s.d [blink] ++ add_s sp, sp, 32 +diff --git a/js/src/ctypes/libffi/src/arc/ffi.c b/js/src/ctypes/libffi/src/arc/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/arc/ffi.c +@@ -0,0 +1,268 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) ++ ++ ARC Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++/* for little endian ARC, the code is in fact stored as mixed endian for ++ performance reasons */ ++#if __BIG_ENDIAN__ ++#define CODE_ENDIAN(x) (x) ++#else ++#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16)) ++#endif ++ ++/* ffi_prep_args is called by the assembly routine once stack ++ space has been allocated for the function's arguments. */ ++ ++void ++ffi_prep_args (char *stack, extended_cif * ecif) ++{ ++ unsigned int i; ++ int tmp; ++ void **p_argv; ++ char *argp; ++ ffi_type **p_arg; ++ ++ tmp = 0; ++ argp = stack; ++ ++ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ int alignment; ++ ++ /* align alignment to 4 */ ++ alignment = (((*p_arg)->alignment - 1) | 3) + 1; ++ ++ /* Align if necessary. */ ++ if ((alignment - 1) & (unsigned) argp) ++ argp = (char *) ALIGN (argp, alignment); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof (int)) ++ { ++ z = sizeof (int); ++ ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ memcpy (argp, *p_argv, (*p_arg)->size); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ } ++ } ++ else if (z == sizeof (int)) ++ { ++ *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); ++ } ++ else ++ { ++ if ((*p_arg)->type == FFI_TYPE_STRUCT) ++ { ++ memcpy (argp, *p_argv, z); ++ } ++ else ++ { ++ /* Double or long long 64bit. */ ++ memcpy (argp, *p_argv, z); ++ } ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep (ffi_cif * cif) ++{ ++ /* Set the return type flag. */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_DOUBLE: ++ cif->flags = FFI_TYPE_DOUBLE; ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_ARCompact (void (*)(char *, extended_cif *), ++ extended_cif *, unsigned, unsigned, ++ unsigned *, void (*fn) (void)); ++ ++void ++ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have ++ a return value address then we need to make one. */ ++ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca (cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_ARCOMPACT: ++ ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes, ++ cif->flags, ecif.rvalue, fn); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++int ++ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue, ++ ffi_arg * args) ++{ ++ void **arg_area, **p_argv; ++ ffi_cif *cif = closure->cif; ++ char *argp = (char *) args; ++ ffi_type **p_argt; ++ int i; ++ ++ arg_area = (void **) alloca (cif->nargs * sizeof (void *)); ++ ++ /* handle hidden argument */ ++ if (cif->flags == FFI_TYPE_STRUCT) ++ { ++ rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = arg_area; ++ ++ for (i = 0, p_argt = cif->arg_types; i < cif->nargs; ++ i++, p_argt++, p_argv++) ++ { ++ size_t z; ++ int alignment; ++ ++ /* align alignment to 4 */ ++ alignment = (((*p_argt)->alignment - 1) | 3) + 1; ++ ++ /* Align if necessary. */ ++ if ((alignment - 1) & (unsigned) argp) ++ argp = (char *) ALIGN (argp, alignment); ++ ++ z = (*p_argt)->size; ++ *p_argv = (void *) argp; ++ argp += z; ++ } ++ ++ (closure->fun) (cif, rvalue, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++extern void ffi_closure_ARCompact (void); ++ ++ffi_status ++ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif, ++ void (*fun) (ffi_cif *, void *, void **, void *), ++ void *user_data, void *codeloc) ++{ ++ uint32_t *tramp = (uint32_t *) & (closure->tramp[0]); ++ ++ switch (cif->abi) ++ { ++ case FFI_ARCOMPACT: ++ FFI_ASSERT (tramp == codeloc); ++ tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */ ++ tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */ ++ tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact); ++ break; ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ cacheflush (codeloc, FFI_TRAMPOLINE_SIZE, BCACHE); ++ ++ return FFI_OK; ++} +diff --git a/js/src/ctypes/libffi/src/arc/ffitarget.h b/js/src/ctypes/libffi/src/arc/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/arc/ffitarget.h +@@ -0,0 +1,53 @@ ++/* ----------------------------------------------------------------------- ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) ++ Target configuration macros for ARC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi ++{ ++ FFI_FIRST_ABI = 0, ++ FFI_ARCOMPACT, ++ FFI_LAST_ABI, ++ FFI_DEFAULT_ABI = FFI_ARCOMPACT ++} ffi_abi; ++#endif ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 12 ++#define FFI_NATIVE_RAW_API 0 ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/arm/ffi.c b/js/src/ctypes/libffi/src/arm/ffi.c +--- a/js/src/ctypes/libffi/src/arm/ffi.c ++++ b/js/src/ctypes/libffi/src/arm/ffi.c +@@ -1,12 +1,16 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 1998, 2008 Red Hat, Inc. +- +- ARM Foreign Function Interface ++ ffi.c - Copyright (c) 2011 Timothy Wall ++ Copyright (c) 2011 Plausible Labs Cooperative, Inc. ++ Copyright (c) 2011 Anthony Green ++ Copyright (c) 2011 Free Software Foundation ++ Copyright (c) 1998, 2008, 2011 Red Hat, Inc. ++ ++ ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: +@@ -28,110 +32,205 @@ + #include + + #include + + /* Forward declares. */ + static int vfp_type_p (ffi_type *); + static void layout_vfp_args (ffi_cif *); + ++int ffi_prep_args_SYSV(char *stack, extended_cif *ecif, float *vfp_space); ++int ffi_prep_args_VFP(char *stack, extended_cif *ecif, float *vfp_space); ++ ++static char* ffi_align(ffi_type **p_arg, char *argp) ++{ ++ /* Align if necessary */ ++ register size_t alignment = (*p_arg)->alignment; ++ if (alignment < 4) ++ { ++ alignment = 4; ++ } ++#ifdef _WIN32_WCE ++ if (alignment > 4) ++ { ++ alignment = 4; ++ } ++#endif ++ if ((alignment - 1) & (unsigned) argp) ++ { ++ argp = (char *) ALIGN(argp, alignment); ++ } ++ ++ if ((*p_arg)->type == FFI_TYPE_STRUCT) ++ { ++ argp = (char *) ALIGN(argp, 4); ++ } ++ return argp; ++} ++ ++static size_t ffi_put_arg(ffi_type **arg_type, void **arg, char *stack) ++{ ++ register char* argp = stack; ++ register ffi_type **p_arg = arg_type; ++ register void **p_argv = arg; ++ register size_t z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ memcpy(argp, *p_argv, (*p_arg)->size); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else if (z == sizeof(int)) ++ { ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ *(float *) argp = *(float *)(* p_argv); ++ else ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ } ++ else if (z == sizeof(double) && (*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ *(double *) argp = *(double *)(* p_argv); ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ return z; ++} + /* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments + + The vfp_space parameter is the load area for VFP regs, the return + value is cif->vfp_used (word bitset of VFP regs used for passing + arguments). These are only used for the VFP hard-float ABI. + */ +-int ffi_prep_args(char *stack, extended_cif *ecif, float *vfp_space) ++int ffi_prep_args_SYSV(char *stack, extended_cif *ecif, float *vfp_space) + { +- register unsigned int i, vi = 0; ++ register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; +- + argp = stack; ++ + + if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); +- i--, p_arg++) ++ i--, p_arg++, p_argv++) + { +- size_t z; ++ argp = ffi_align(p_arg, argp); ++ argp += ffi_put_arg(p_arg, p_argv, argp); ++ } ++ ++ return 0; ++} ++ ++int ffi_prep_args_VFP(char *stack, extended_cif *ecif, float *vfp_space) ++{ ++ // make sure we are using FFI_VFP ++ FFI_ASSERT(ecif->cif->abi == FFI_VFP); ++ ++ register unsigned int i, vi = 0; ++ register void **p_argv; ++ register char *argp, *regp, *eo_regp; ++ register ffi_type **p_arg; ++ char stack_used = 0; ++ char done_with_regs = 0; ++ char is_vfp_type; ++ ++ /* the first 4 words on the stack are used for values passed in core ++ * registers. */ ++ regp = stack; ++ eo_regp = argp = regp + 16; ++ ++ ++ /* if the function returns an FFI_TYPE_STRUCT in memory, that address is ++ * passed in r0 to the function */ ++ if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { ++ *(void **) regp = ecif->rvalue; ++ regp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ (i != 0); ++ i--, p_arg++, p_argv++) ++ { ++ is_vfp_type = vfp_type_p (*p_arg); + + /* Allocated in VFP registers. */ +- if (ecif->cif->abi == FFI_VFP +- && vi < ecif->cif->vfp_nargs && vfp_type_p (*p_arg)) +- { +- float* vfp_slot = vfp_space + ecif->cif->vfp_args[vi++]; +- if ((*p_arg)->type == FFI_TYPE_FLOAT) +- *((float*)vfp_slot) = *((float*)*p_argv); +- else if ((*p_arg)->type == FFI_TYPE_DOUBLE) +- *((double*)vfp_slot) = *((double*)*p_argv); +- else +- memcpy(vfp_slot, *p_argv, (*p_arg)->size); +- p_argv++; +- continue; +- } +- +- /* Align if necessary */ +- if (((*p_arg)->alignment - 1) & (unsigned) argp) { +- argp = (char *) ALIGN(argp, (*p_arg)->alignment); +- } +- +- if ((*p_arg)->type == FFI_TYPE_STRUCT) +- argp = (char *) ALIGN(argp, 4); +- +- z = (*p_arg)->size; +- if (z < sizeof(int)) +- { +- z = sizeof(int); +- switch ((*p_arg)->type) +- { +- case FFI_TYPE_SINT8: +- *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); +- break; +- +- case FFI_TYPE_UINT8: +- *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); +- break; +- +- case FFI_TYPE_SINT16: +- *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); +- break; +- +- case FFI_TYPE_UINT16: +- *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); +- break; +- +- case FFI_TYPE_STRUCT: +- memcpy(argp, *p_argv, (*p_arg)->size); +- break; +- +- default: +- FFI_ASSERT(0); +- } +- } +- else if (z == sizeof(int)) +- { +- *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); +- } +- else +- { +- memcpy(argp, *p_argv, z); +- } +- p_argv++; +- argp += z; ++ if(vi < ecif->cif->vfp_nargs && is_vfp_type) ++ { ++ char *vfp_slot = (char *)(vfp_space + ecif->cif->vfp_args[vi++]); ++ ffi_put_arg(p_arg, p_argv, vfp_slot); ++ continue; ++ } ++ /* Try allocating in core registers. */ ++ else if (!done_with_regs && !is_vfp_type) ++ { ++ char *tregp = ffi_align(p_arg, regp); ++ size_t size = (*p_arg)->size; ++ size = (size < 4)? 4 : size; // pad ++ /* Check if there is space left in the aligned register area to place ++ * the argument */ ++ if(tregp + size <= eo_regp) ++ { ++ regp = tregp + ffi_put_arg(p_arg, p_argv, tregp); ++ done_with_regs = (regp == argp); ++ // ensure we did not write into the stack area ++ FFI_ASSERT(regp <= argp); ++ continue; ++ } ++ /* In case there are no arguments in the stack area yet, ++ the argument is passed in the remaining core registers and on the ++ stack. */ ++ else if (!stack_used) ++ { ++ stack_used = 1; ++ done_with_regs = 1; ++ argp = tregp + ffi_put_arg(p_arg, p_argv, tregp); ++ FFI_ASSERT(eo_regp < argp); ++ continue; ++ } ++ } ++ /* Base case, arguments are passed on the stack */ ++ stack_used = 1; ++ argp = ffi_align(p_arg, argp); ++ argp += ffi_put_arg(p_arg, p_argv, argp); + } +- + /* Indicate the VFP registers used. */ + return ecif->cif->vfp_used; + } + + /* Perform machine dependent cif processing */ + ffi_status ffi_prep_cif_machdep(ffi_cif *cif) + { + int type_code; +@@ -181,36 +280,48 @@ ffi_status ffi_prep_cif_machdep(ffi_cif + The VFP hard-float calling conventions are slightly more sophisticated than + the base calling conventions, so we do it here instead of in ffi_prep_args(). */ + if (cif->abi == FFI_VFP) + layout_vfp_args (cif); + + return FFI_OK; + } + ++/* Perform machine dependent cif processing for variadic calls */ ++ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, ++ unsigned int nfixedargs, ++ unsigned int ntotalargs) ++{ ++ /* VFP variadic calls actually use the SYSV ABI */ ++ if (cif->abi == FFI_VFP) ++ cif->abi = FFI_SYSV; ++ ++ return ffi_prep_cif_machdep(cif); ++} ++ + /* Prototypes for assembly functions, in sysv.S */ + extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); + extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); + + void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) + { + extended_cif ecif; + + int small_struct = (cif->flags == FFI_TYPE_INT + && cif->rtype->type == FFI_TYPE_STRUCT); + int vfp_struct = (cif->flags == FFI_TYPE_STRUCT_VFP_FLOAT + || cif->flags == FFI_TYPE_STRUCT_VFP_DOUBLE); + ++ unsigned int temp; ++ + ecif.cif = cif; + ecif.avalue = avalue; + +- unsigned int temp; +- + /* If the return value is a struct and we don't have a return */ +- /* value address then we need to make one */ ++ /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else if (small_struct) + ecif.rvalue = &temp; +@@ -224,159 +335,473 @@ void ffi_call(ffi_cif *cif, void (*fn)(v + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); + break; + + case FFI_VFP: ++#ifdef __ARM_EABI__ + ffi_call_VFP (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); + break; ++#endif + + default: + FFI_ASSERT(0); + break; + } + if (small_struct) +- memcpy (rvalue, &temp, cif->rtype->size); ++ { ++ FFI_ASSERT(rvalue != NULL); ++ memcpy (rvalue, &temp, cif->rtype->size); ++ } ++ + else if (vfp_struct) +- memcpy (rvalue, ecif.rvalue, cif->rtype->size); ++ { ++ FFI_ASSERT(rvalue != NULL); ++ memcpy (rvalue, ecif.rvalue, cif->rtype->size); ++ } ++ + } + + /** private members **/ + + static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif, float *vfp_stack); + ++static void ffi_prep_incoming_args_VFP (char *stack, void **ret, ++ void** args, ffi_cif* cif, float *vfp_stack); ++ + void ffi_closure_SYSV (ffi_closure *); + + void ffi_closure_VFP (ffi_closure *); + + /* This function is jumped to by the trampoline */ + +-unsigned int +-ffi_closure_SYSV_inner (closure, respp, args, vfp_args) +- ffi_closure *closure; +- void **respp; +- void *args; +- void *vfp_args; ++unsigned int FFI_HIDDEN ++ffi_closure_inner (ffi_closure *closure, ++ void **respp, void *args, void *vfp_args) + { + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ +- +- ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); ++ if (cif->abi == FFI_VFP) ++ ffi_prep_incoming_args_VFP(args, respp, arg_area, cif, vfp_args); ++ else ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; + } + + /*@-exportheader@*/ + static void + ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, + void **avalue, ffi_cif *cif, + /* Used only under VFP hard-float ABI. */ + float *vfp_stack) + /*@=exportheader@*/ + { +- register unsigned int i, vi = 0; ++ register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; +- size_t alignment; +- +- if (cif->abi == FFI_VFP +- && vi < cif->vfp_nargs && vfp_type_p (*p_arg)) +- { +- *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]); +- continue; +- } + +- alignment = (*p_arg)->alignment; +- if (alignment < 4) +- alignment = 4; +- /* Align if necessary */ +- if ((alignment - 1) & (unsigned) argp) { +- argp = (char *) ALIGN(argp, alignment); +- } ++ argp = ffi_align(p_arg, argp); + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; + } + ++/*@-exportheader@*/ ++static void ++ffi_prep_incoming_args_VFP(char *stack, void **rvalue, ++ void **avalue, ffi_cif *cif, ++ /* Used only under VFP hard-float ABI. */ ++ float *vfp_stack) ++/*@=exportheader@*/ ++{ ++ register unsigned int i, vi = 0; ++ register void **p_argv; ++ register char *argp, *regp, *eo_regp; ++ register ffi_type **p_arg; ++ char done_with_regs = 0; ++ char stack_used = 0; ++ char is_vfp_type; ++ ++ FFI_ASSERT(cif->abi == FFI_VFP); ++ regp = stack; ++ eo_regp = argp = regp + 16; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) regp; ++ regp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ is_vfp_type = vfp_type_p (*p_arg); ++ ++ if(vi < cif->vfp_nargs && is_vfp_type) ++ { ++ *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]); ++ continue; ++ } ++ else if (!done_with_regs && !is_vfp_type) ++ { ++ char* tregp = ffi_align(p_arg, regp); ++ ++ z = (*p_arg)->size; ++ z = (z < 4)? 4 : z; // pad ++ ++ /* if the arguments either fits into the registers or uses registers ++ * and stack, while we haven't read other things from the stack */ ++ if(tregp + z <= eo_regp || !stack_used) ++ { ++ /* because we're little endian, this is what it turns into. */ ++ *p_argv = (void*) tregp; ++ ++ p_argv++; ++ regp = tregp + z; ++ // if we read past the last core register, make sure we have not read ++ // from the stack before and continue reading after regp ++ if(regp > eo_regp) ++ { ++ if(stack_used) ++ { ++ abort(); // we should never read past the end of the register ++ // are if the stack is already in use ++ } ++ argp = regp; ++ } ++ if(regp >= eo_regp) ++ { ++ done_with_regs = 1; ++ stack_used = 1; ++ } ++ continue; ++ } ++ } ++ stack_used = 1; ++ ++ argp = ffi_align(p_arg, argp); ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ + /* How to make a trampoline. */ + ++extern unsigned int ffi_arm_trampoline[3]; ++ ++#if FFI_EXEC_TRAMPOLINE_TABLE ++ ++#include ++#include ++#include ++#include ++ ++extern void *ffi_closure_trampoline_table_page; ++ ++typedef struct ffi_trampoline_table ffi_trampoline_table; ++typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; ++ ++struct ffi_trampoline_table { ++ /* contiguous writable and executable pages */ ++ vm_address_t config_page; ++ vm_address_t trampoline_page; ++ ++ /* free list tracking */ ++ uint16_t free_count; ++ ffi_trampoline_table_entry *free_list; ++ ffi_trampoline_table_entry *free_list_pool; ++ ++ ffi_trampoline_table *prev; ++ ffi_trampoline_table *next; ++}; ++ ++struct ffi_trampoline_table_entry { ++ void *(*trampoline)(); ++ ffi_trampoline_table_entry *next; ++}; ++ ++/* Override the standard architecture trampoline size */ ++// XXX TODO - Fix ++#undef FFI_TRAMPOLINE_SIZE ++#define FFI_TRAMPOLINE_SIZE 12 ++ ++/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */ ++#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080)); ++ ++/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */ ++#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16 ++ ++/* Total number of trampolines that fit in one trampoline table */ ++#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE) ++ ++static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; ++static ffi_trampoline_table *ffi_trampoline_tables = NULL; ++ ++static ffi_trampoline_table * ++ffi_trampoline_table_alloc () ++{ ++ ffi_trampoline_table *table = NULL; ++ ++ /* Loop until we can allocate two contiguous pages */ ++ while (table == NULL) { ++ vm_address_t config_page = 0x0; ++ kern_return_t kt; ++ ++ /* Try to allocate two pages */ ++ kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE); ++ if (kt != KERN_SUCCESS) { ++ fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); ++ break; ++ } ++ ++ /* Now drop the second half of the allocation to make room for the trampoline table */ ++ vm_address_t trampoline_page = config_page+PAGE_SIZE; ++ kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE); ++ if (kt != KERN_SUCCESS) { ++ fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); ++ break; ++ } ++ ++ /* Remap the trampoline table to directly follow the config page */ ++ vm_prot_t cur_prot; ++ vm_prot_t max_prot; ++ ++ kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); ++ ++ /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */ ++ if (kt != KERN_SUCCESS) { ++ /* Log unexpected failures */ ++ if (kt != KERN_NO_SPACE) { ++ fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); ++ } ++ ++ vm_deallocate (mach_task_self (), config_page, PAGE_SIZE); ++ continue; ++ } ++ ++ /* We have valid trampoline and config pages */ ++ table = calloc (1, sizeof(ffi_trampoline_table)); ++ table->free_count = FFI_TRAMPOLINE_COUNT; ++ table->config_page = config_page; ++ table->trampoline_page = trampoline_page; ++ ++ /* Create and initialize the free list */ ++ table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry)); ++ ++ uint16_t i; ++ for (i = 0; i < table->free_count; i++) { ++ ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; ++ entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); ++ ++ if (i < table->free_count - 1) ++ entry->next = &table->free_list_pool[i+1]; ++ } ++ ++ table->free_list = table->free_list_pool; ++ } ++ ++ return table; ++} ++ ++void * ++ffi_closure_alloc (size_t size, void **code) ++{ ++ /* Create the closure */ ++ ffi_closure *closure = malloc(size); ++ if (closure == NULL) ++ return NULL; ++ ++ pthread_mutex_lock(&ffi_trampoline_lock); ++ ++ /* Check for an active trampoline table with available entries. */ ++ ffi_trampoline_table *table = ffi_trampoline_tables; ++ if (table == NULL || table->free_list == NULL) { ++ table = ffi_trampoline_table_alloc (); ++ if (table == NULL) { ++ free(closure); ++ return NULL; ++ } ++ ++ /* Insert the new table at the top of the list */ ++ table->next = ffi_trampoline_tables; ++ if (table->next != NULL) ++ table->next->prev = table; ++ ++ ffi_trampoline_tables = table; ++ } ++ ++ /* Claim the free entry */ ++ ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; ++ ffi_trampoline_tables->free_list = entry->next; ++ ffi_trampoline_tables->free_count--; ++ entry->next = NULL; ++ ++ pthread_mutex_unlock(&ffi_trampoline_lock); ++ ++ /* Initialize the return values */ ++ *code = entry->trampoline; ++ closure->trampoline_table = table; ++ closure->trampoline_table_entry = entry; ++ ++ return closure; ++} ++ ++void ++ffi_closure_free (void *ptr) ++{ ++ ffi_closure *closure = ptr; ++ ++ pthread_mutex_lock(&ffi_trampoline_lock); ++ ++ /* Fetch the table and entry references */ ++ ffi_trampoline_table *table = closure->trampoline_table; ++ ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; ++ ++ /* Return the entry to the free list */ ++ entry->next = table->free_list; ++ table->free_list = entry; ++ table->free_count++; ++ ++ /* If all trampolines within this table are free, and at least one other table exists, deallocate ++ * the table */ ++ if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) { ++ /* Remove from the list */ ++ if (table->prev != NULL) ++ table->prev->next = table->next; ++ ++ if (table->next != NULL) ++ table->next->prev = table->prev; ++ ++ /* Deallocate pages */ ++ kern_return_t kt; ++ kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE); ++ if (kt != KERN_SUCCESS) ++ fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); ++ ++ kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE); ++ if (kt != KERN_SUCCESS) ++ fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); ++ ++ /* Deallocate free list */ ++ free (table->free_list_pool); ++ free (table); ++ } else if (ffi_trampoline_tables != table) { ++ /* Otherwise, bump this table to the top of the list */ ++ table->prev = NULL; ++ table->next = ffi_trampoline_tables; ++ if (ffi_trampoline_tables != NULL) ++ ffi_trampoline_tables->prev = table; ++ ++ ffi_trampoline_tables = table; ++ } ++ ++ pthread_mutex_unlock (&ffi_trampoline_lock); ++ ++ /* Free the closure */ ++ free (closure); ++} ++ ++#else ++ + #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ + ({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ +- *(unsigned int*) &__tramp[0] = 0xe92d000f; /* stmfd sp!, {r0-r3} */ \ +- *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */ \ +- *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */ \ ++ unsigned char *insns = (unsigned char *)(CTX); \ ++ memcpy (__tramp, ffi_arm_trampoline, sizeof ffi_arm_trampoline); \ + *(unsigned int*) &__tramp[12] = __ctx; \ + *(unsigned int*) &__tramp[16] = __fun; \ +- __clear_cache((&__tramp[0]), (&__tramp[19])); \ ++ __clear_cache((&__tramp[0]), (&__tramp[19])); /* Clear data mapping. */ \ ++ __clear_cache(insns, insns + 3 * sizeof (unsigned int)); \ ++ /* Clear instruction \ ++ mapping. */ \ + }) + ++#endif + + /* the cif must already be prep'ed */ + + ffi_status + ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) + { + void (*closure_func)(ffi_closure*) = NULL; + + if (cif->abi == FFI_SYSV) + closure_func = &ffi_closure_SYSV; ++#ifdef __ARM_EABI__ + else if (cif->abi == FFI_VFP) + closure_func = &ffi_closure_VFP; ++#endif + else +- FFI_ASSERT (0); +- ++ return FFI_BAD_ABI; ++ ++#if FFI_EXEC_TRAMPOLINE_TABLE ++ void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc); ++ config[0] = closure; ++ config[1] = closure_func; ++#else + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + closure_func, \ + codeloc); +- ++#endif ++ + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; + } + + /* Below are routines for VFP hard-float support. */ +@@ -439,19 +864,19 @@ static int vfp_type_p (ffi_type *t) + ? FFI_TYPE_STRUCT_VFP_FLOAT + : FFI_TYPE_STRUCT_VFP_DOUBLE); + } + return (int) t->type; + } + return 0; + } + +-static void place_vfp_arg (ffi_cif *cif, ffi_type *t) ++static int place_vfp_arg (ffi_cif *cif, ffi_type *t) + { +- int reg = cif->vfp_reg_free; ++ short reg = cif->vfp_reg_free; + int nregs = t->size / sizeof (float); + int align = ((t->type == FFI_TYPE_STRUCT_VFP_FLOAT + || t->type == FFI_TYPE_FLOAT) ? 1 : 2); + /* Align register number. */ + if ((reg & 1) && align == 2) + reg++; + while (reg + nregs <= 16) + { +@@ -472,29 +897,35 @@ static void place_vfp_arg (ffi_cif *cif, + /* Update vfp_reg_free. */ + if (cif->vfp_used & (1 << cif->vfp_reg_free)) + { + reg += nregs; + while (cif->vfp_used & (1 << reg)) + reg += 1; + cif->vfp_reg_free = reg; + } +- return; ++ return 0; + next_reg: ; + } ++ // done, mark all regs as used ++ cif->vfp_reg_free = 16; ++ cif->vfp_used = 0xFFFF; ++ return 1; + } + + static void layout_vfp_args (ffi_cif *cif) + { + int i; + /* Init VFP fields */ + cif->vfp_used = 0; + cif->vfp_nargs = 0; + cif->vfp_reg_free = 0; + memset (cif->vfp_args, -1, 16); /* Init to -1. */ + + for (i = 0; i < cif->nargs; i++) + { + ffi_type *t = cif->arg_types[i]; +- if (vfp_type_p (t)) +- place_vfp_arg (cif, t); ++ if (vfp_type_p (t) && place_vfp_arg (cif, t) == 1) ++ { ++ break; ++ } + } + } +diff --git a/js/src/ctypes/libffi/src/arm/ffitarget.h b/js/src/ctypes/libffi/src/arm/ffitarget.h +--- a/js/src/ctypes/libffi/src/arm/ffitarget.h ++++ b/js/src/ctypes/libffi/src/arm/ffitarget.h +@@ -1,10 +1,13 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 2010 CodeSourcery ++ Copyright (c) 1996-2003 Red Hat, Inc. ++ + Target configuration macros for ARM. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,42 +25,47 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_VFP, + FFI_LAST_ABI, + #ifdef __ARM_PCS_VFP +- FFI_DEFAULT_ABI = FFI_VFP ++ FFI_DEFAULT_ABI = FFI_VFP, + #else +- FFI_DEFAULT_ABI = FFI_SYSV ++ FFI_DEFAULT_ABI = FFI_SYSV, + #endif + } ffi_abi; + #endif + + #define FFI_EXTRA_CIF_FIELDS \ + int vfp_used; \ + short vfp_reg_free, vfp_nargs; \ + signed char vfp_args[16] \ + + /* Internally used. */ + #define FFI_TYPE_STRUCT_VFP_FLOAT (FFI_TYPE_LAST + 1) + #define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2) + ++#define FFI_TARGET_SPECIFIC_VARIADIC ++ + /* ---- Definitions for closures ----------------------------------------- */ + + #define FFI_CLOSURES 1 + #define FFI_TRAMPOLINE_SIZE 20 + #define FFI_NATIVE_RAW_API 0 + + #endif +- +diff --git a/js/src/ctypes/libffi/src/arm/gentramp.sh b/js/src/ctypes/libffi/src/arm/gentramp.sh +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/arm/gentramp.sh +@@ -0,0 +1,118 @@ ++#!/bin/sh ++ ++# ----------------------------------------------------------------------- ++# gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc. ++# ++# ARM Trampoline Page Generator ++# ++# Permission is hereby granted, free of charge, to any person obtaining ++# a copy of this software and associated documentation files (the ++# ``Software''), to deal in the Software without restriction, including ++# without limitation the rights to use, copy, modify, merge, publish, ++# distribute, sublicense, and/or sell copies of the Software, and to ++# permit persons to whom the Software is furnished to do so, subject to ++# the following conditions: ++# ++# The above copyright notice and this permission notice shall be included ++# in all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++# DEALINGS IN THE SOFTWARE. ++# ----------------------------------------------------------------------- ++ ++PROGNAME=$0 ++ ++# Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change, ++# the entire arm trampoline implementation must be updated to match, too. ++ ++# Size of an individual trampoline, in bytes ++TRAMPOLINE_SIZE=12 ++ ++# Page size, in bytes ++PAGE_SIZE=4096 ++ ++# Compute the size of the reachable config page; The first 16 bytes of the config page ++# are unreachable due to our maximum pc-relative ldr offset. ++PAGE_AVAIL=`expr $PAGE_SIZE - 16` ++ ++# Compute the number of of available trampolines. ++TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE` ++ ++header () { ++ echo "# GENERATED CODE - DO NOT EDIT" ++ echo "# This file was generated by $PROGNAME" ++ echo "" ++ ++ # Write out the license header ++cat << EOF ++# Copyright (c) 2010, Plausible Labs Cooperative, Inc. ++# ++# Permission is hereby granted, free of charge, to any person obtaining ++# a copy of this software and associated documentation files (the ++# ``Software''), to deal in the Software without restriction, including ++# without limitation the rights to use, copy, modify, merge, publish, ++# distribute, sublicense, and/or sell copies of the Software, and to ++# permit persons to whom the Software is furnished to do so, subject to ++# the following conditions: ++# ++# The above copyright notice and this permission notice shall be included ++# in all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++# DEALINGS IN THE SOFTWARE. ++# ----------------------------------------------------------------------- ++ ++EOF ++ ++ # Write out the trampoline table, aligned to the page boundary ++ echo ".text" ++ echo ".align 12" ++ echo ".globl _ffi_closure_trampoline_table_page" ++ echo "_ffi_closure_trampoline_table_page:" ++} ++ ++ ++# WARNING - Don't modify the trampoline code size without also updating the relevant libffi code ++trampoline () { ++ cat << END ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++END ++} ++ ++main () { ++ # Write out the header ++ header ++ ++ # Write out the trampolines ++ local i=0 ++ while [ $i -lt ${TRAMPOLINE_COUNT} ]; do ++ trampoline ++ local i=`expr $i + 1` ++ done ++} ++ ++main +diff --git a/js/src/ctypes/libffi/src/arm/sysv.S b/js/src/ctypes/libffi/src/arm/sysv.S +--- a/js/src/ctypes/libffi/src/arm/sysv.S ++++ b/js/src/ctypes/libffi/src/arm/sysv.S +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- sysv.S - Copyright (c) 1998, 2008 Red Hat, Inc. ++ sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. ++ Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -34,25 +35,35 @@ + #define CONCAT1(a, b) CONCAT2(a, b) + #define CONCAT2(a, b) a ## b + + /* Use the right prefix for global labels. */ + #define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) + #else + #define CNAME(x) x + #endif ++#ifdef __APPLE__ ++#define ENTRY(x) .globl _##x; _##x: ++#else + #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): ++#endif /* __APPLE__ */ + #endif + + #ifdef __ELF__ + #define LSYM(x) .x + #else + #define LSYM(x) x + #endif + ++/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI ++ Function Call Guide */ ++#ifdef __APPLE__ ++#define __SOFTFP__ ++#endif ++ + /* We need a better way of testing for this, but for now, this is all + we can do. */ + @ This selects the minimum architecture level required. + #define __ARM_ARCH__ 3 + + #if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) + # undef __ARM_ARCH__ + # define __ARM_ARCH__ 4 +@@ -93,40 +104,37 @@ + + /* Conditionally compile unwinder directives. */ + #ifdef __ARM_EABI__ + #define UNWIND + #else + #define UNWIND @ + #endif + +- ++.syntax unified ++ + #if defined(__thumb__) && !defined(__THUMB_INTERWORK__) +-.macro ARM_FUNC_START name +- .text +- .align 0 +- .thumb +- .thumb_func +- ENTRY(\name) +- bx pc +- nop +- .arm ++#define ARM_FUNC_START(name) \ ++ .text; \ ++ .align 2; \ ++ .thumb; \ ++ .thumb_func; \ ++ ENTRY(name); \ ++ bx pc; \ ++ nop; \ ++ .arm; \ ++ UNWIND .fnstart; \ ++_L__##name: ++#else ++#define ARM_FUNC_START(name) \ ++ .text; \ ++ .align 2; \ ++ .arm; \ ++ ENTRY(name); \ + UNWIND .fnstart +-/* A hook to tell gdb that we've switched to ARM mode. Also used to call +- directly from other local arm routines. */ +-_L__\name: +-.endm +-#else +-.macro ARM_FUNC_START name +- .text +- .align 0 +- .arm +- ENTRY(\name) +- UNWIND .fnstart +-.endm + #endif + + .macro RETLDM regs=, cond=, dirn=ia + #if defined (__INTERWORKING__) + .ifc "\regs","" + ldr\cond lr, [sp], #4 + .else + ldm\cond\dirn sp!, {\regs, lr} +@@ -136,41 +144,40 @@ + .ifc "\regs","" + ldr\cond pc, [sp], #4 + .else + ldm\cond\dirn sp!, {\regs, pc} + .endif + #endif + .endm + +- +- @ r0: fn ++ @ r0: ffi_prep_args + @ r1: &ecif + @ r2: cif->bytes + @ r3: fig->flags + @ sp+0: ecif.rvalue + + @ This assumes we are using gas. +-ARM_FUNC_START ffi_call_SYSV ++ARM_FUNC_START(ffi_call_SYSV) + @ Save registers + stmfd sp!, {r0-r3, fp, lr} + UNWIND .save {r0-r3, fp, lr} + mov fp, sp + + UNWIND .setfp fp, sp + + @ Make room for all of the new args. + sub sp, fp, r2 + + @ Place all of the ffi_prep_args in position + mov r0, sp + @ r1 already set + + @ Call ffi_prep_args(stack, &ecif) +- bl ffi_prep_args ++ bl CNAME(ffi_prep_args_SYSV) + + @ move first 4 parameters in registers + ldmia sp, {r0-r3} + + @ and adjust stack + sub lr, fp, sp @ cif->bytes == fp - sp + ldr ip, [fp] @ load fn() in advance + cmp lr, #16 +@@ -201,156 +208,65 @@ ARM_FUNC_START ffi_call_SYSV + streq r0, [r2] + beq LSYM(Lepilogue) + + @ return INT64 + cmp r3, #FFI_TYPE_SINT64 + #if defined(__SOFTFP__) || defined(__ARM_EABI__) + cmpne r3, #FFI_TYPE_DOUBLE + #endif +- stmeqia r2, {r0, r1} ++ stmiaeq r2, {r0, r1} + + #if !defined(__SOFTFP__) && !defined(__ARM_EABI__) + beq LSYM(Lepilogue) + + @ return FLOAT + cmp r3, #FFI_TYPE_FLOAT + stfeqs f0, [r2] + beq LSYM(Lepilogue) + + @ return DOUBLE or LONGDOUBLE + cmp r3, #FFI_TYPE_DOUBLE + stfeqd f0, [r2] + #endif + + LSYM(Lepilogue): +- RETLDM "r0-r3,fp" ++#if defined (__INTERWORKING__) ++ ldmia sp!, {r0-r3,fp, lr} ++ bx lr ++#else ++ ldmia sp!, {r0-r3,fp, pc} ++#endif + + .ffi_call_SYSV_end: + UNWIND .fnend ++#ifdef __ELF__ + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) ++#endif + + +-/* Below are VFP hard-float ABI call and closure implementations. +- Add VFP FPU directive here. */ +- .fpu vfp +- +- @ r0: fn +- @ r1: &ecif +- @ r2: cif->bytes +- @ r3: fig->flags +- @ sp+0: ecif.rvalue +- +-ARM_FUNC_START ffi_call_VFP +- @ Save registers +- stmfd sp!, {r0-r3, fp, lr} +- UNWIND .save {r0-r3, fp, lr} +- mov fp, sp +- UNWIND .setfp fp, sp +- +- @ Make room for all of the new args. +- sub sp, sp, r2 +- +- @ Make room for loading VFP args +- sub sp, sp, #64 +- +- @ Place all of the ffi_prep_args in position +- mov r0, sp +- @ r1 already set +- sub r2, fp, #64 @ VFP scratch space +- +- @ Call ffi_prep_args(stack, &ecif, vfp_space) +- bl ffi_prep_args +- +- @ Load VFP register args if needed +- cmp r0, #0 +- beq LSYM(Lbase_args) +- +- @ Load only d0 if possible +- cmp r0, #3 +- sub ip, fp, #64 +- flddle d0, [ip] +- fldmiadgt ip, {d0-d7} +- +-LSYM(Lbase_args): +- @ move first 4 parameters in registers +- ldmia sp, {r0-r3} +- +- @ and adjust stack +- sub lr, ip, sp @ cif->bytes == (fp - 64) - sp +- ldr ip, [fp] @ load fn() in advance +- cmp lr, #16 +- movhs lr, #16 +- add sp, sp, lr +- +- @ call (fn) (...) +- call_reg(ip) +- +- @ Remove the space we pushed for the args +- mov sp, fp +- +- @ Load r2 with the pointer to storage for +- @ the return value +- ldr r2, [sp, #24] +- +- @ Load r3 with the return type code +- ldr r3, [sp, #12] +- +- @ If the return value pointer is NULL, +- @ assume no return value. +- cmp r2, #0 +- beq LSYM(Lepilogue_vfp) +- +- cmp r3, #FFI_TYPE_INT +- streq r0, [r2] +- beq LSYM(Lepilogue_vfp) +- +- cmp r3, #FFI_TYPE_SINT64 +- stmeqia r2, {r0, r1} +- beq LSYM(Lepilogue_vfp) +- +- cmp r3, #FFI_TYPE_FLOAT +- fstseq s0, [r2] +- beq LSYM(Lepilogue_vfp) +- +- cmp r3, #FFI_TYPE_DOUBLE +- fstdeq d0, [r2] +- beq LSYM(Lepilogue_vfp) +- +- cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT +- cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE +- fstmiadeq r2, {d0-d3} +- +-LSYM(Lepilogue_vfp): +- RETLDM "r0-r3,fp" +- +-.ffi_call_VFP_end: +- UNWIND .fnend +- .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP) +- +- + /* + unsigned int FFI_HIDDEN +- ffi_closure_SYSV_inner (closure, respp, args) ++ ffi_closure_inner (closure, respp, args) + ffi_closure *closure; + void **respp; + void *args; + */ + +-ARM_FUNC_START ffi_closure_SYSV ++ARM_FUNC_START(ffi_closure_SYSV) + UNWIND .pad #16 + add ip, sp, #16 + stmfd sp!, {ip, lr} + UNWIND .save {r0, lr} + add r2, sp, #8 +- .pad #16 ++ UNWIND .pad #16 + sub sp, sp, #16 + str sp, [sp, #8] + add r1, sp, #8 +- bl ffi_closure_SYSV_inner ++ bl CNAME(ffi_closure_inner) + cmp r0, #FFI_TYPE_INT + beq .Lretint + + cmp r0, #FFI_TYPE_FLOAT + #if defined(__SOFTFP__) || defined(__ARM_EABI__) + beq .Lretint + #else + beq .Lretfloat +@@ -392,33 +308,136 @@ ARM_FUNC_START ffi_closure_SYSV + b .Lclosure_epilogue + .Lretlongdouble: + ldfd f0, [sp] + b .Lclosure_epilogue + #endif + + .ffi_closure_SYSV_end: + UNWIND .fnend ++#ifdef __ELF__ + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) ++#endif + + +-ARM_FUNC_START ffi_closure_VFP ++/* Below are VFP hard-float ABI call and closure implementations. ++ Add VFP FPU directive here. This is only compiled into the library ++ under EABI. */ ++#ifdef __ARM_EABI__ ++ .fpu vfp ++ ++ @ r0: fn ++ @ r1: &ecif ++ @ r2: cif->bytes ++ @ r3: fig->flags ++ @ sp+0: ecif.rvalue ++ ++ARM_FUNC_START(ffi_call_VFP) ++ @ Save registers ++ stmfd sp!, {r0-r3, fp, lr} ++ UNWIND .save {r0-r3, fp, lr} ++ mov fp, sp ++ UNWIND .setfp fp, sp ++ ++ @ Make room for all of the new args. ++ sub sp, sp, r2 ++ ++ @ Make room for loading VFP args ++ sub sp, sp, #64 ++ ++ @ Place all of the ffi_prep_args in position ++ mov r0, sp ++ @ r1 already set ++ sub r2, fp, #64 @ VFP scratch space ++ ++ @ Call ffi_prep_args(stack, &ecif, vfp_space) ++ bl CNAME(ffi_prep_args_VFP) ++ ++ @ Load VFP register args if needed ++ cmp r0, #0 ++ mov ip, fp ++ beq LSYM(Lbase_args) ++ ++ @ Load only d0 if possible ++ cmp r0, #3 ++ sub ip, fp, #64 ++ flddle d0, [ip] ++ fldmiadgt ip, {d0-d7} ++ ++LSYM(Lbase_args): ++ @ move first 4 parameters in registers ++ ldmia sp, {r0-r3} ++ ++ @ and adjust stack ++ sub lr, ip, sp @ cif->bytes == (fp - 64) - sp ++ ldr ip, [fp] @ load fn() in advance ++ cmp lr, #16 ++ movhs lr, #16 ++ add sp, sp, lr ++ ++ @ call (fn) (...) ++ call_reg(ip) ++ ++ @ Remove the space we pushed for the args ++ mov sp, fp ++ ++ @ Load r2 with the pointer to storage for ++ @ the return value ++ ldr r2, [sp, #24] ++ ++ @ Load r3 with the return type code ++ ldr r3, [sp, #12] ++ ++ @ If the return value pointer is NULL, ++ @ assume no return value. ++ cmp r2, #0 ++ beq LSYM(Lepilogue_vfp) ++ ++ cmp r3, #FFI_TYPE_INT ++ streq r0, [r2] ++ beq LSYM(Lepilogue_vfp) ++ ++ cmp r3, #FFI_TYPE_SINT64 ++ stmeqia r2, {r0, r1} ++ beq LSYM(Lepilogue_vfp) ++ ++ cmp r3, #FFI_TYPE_FLOAT ++ fstseq s0, [r2] ++ beq LSYM(Lepilogue_vfp) ++ ++ cmp r3, #FFI_TYPE_DOUBLE ++ fstdeq d0, [r2] ++ beq LSYM(Lepilogue_vfp) ++ ++ cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT ++ cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE ++ fstmiadeq r2, {d0-d3} ++ ++LSYM(Lepilogue_vfp): ++ RETLDM "r0-r3,fp" ++ ++.ffi_call_VFP_end: ++ UNWIND .fnend ++ .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP) ++ ++ ++ARM_FUNC_START(ffi_closure_VFP) + fstmfdd sp!, {d0-d7} + @ r0-r3, then d0-d7 + UNWIND .pad #80 + add ip, sp, #80 + stmfd sp!, {ip, lr} + UNWIND .save {r0, lr} + add r2, sp, #72 + add r3, sp, #8 +- .pad #72 ++ UNWIND .pad #72 + sub sp, sp, #72 + str sp, [sp, #64] + add r1, sp, #64 +- bl ffi_closure_SYSV_inner ++ bl CNAME(ffi_closure_inner) + + cmp r0, #FFI_TYPE_INT + beq .Lretint_vfp + + cmp r0, #FFI_TYPE_FLOAT + beq .Lretfloat_vfp + + cmp r0, #FFI_TYPE_DOUBLE +@@ -455,12 +474,18 @@ ARM_FUNC_START ffi_closure_VFP + b .Lclosure_epilogue_vfp + .Lretdouble_struct_vfp: + fldmiad sp, {d0-d3} + b .Lclosure_epilogue_vfp + + .ffi_closure_VFP_end: + UNWIND .fnend + .size CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP) ++#endif ++ ++ENTRY(ffi_arm_trampoline) ++ stmfd sp!, {r0-r3} ++ ldr r0, [pc] ++ ldr pc, [pc] + + #if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",%progbits + #endif +diff --git a/js/src/ctypes/libffi/src/arm/trampoline.S b/js/src/ctypes/libffi/src/arm/trampoline.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/arm/trampoline.S +@@ -0,0 +1,4450 @@ ++# GENERATED CODE - DO NOT EDIT ++# This file was generated by src/arm/gentramp.sh ++ ++# Copyright (c) 2010, Plausible Labs Cooperative, Inc. ++# ++# Permission is hereby granted, free of charge, to any person obtaining ++# a copy of this software and associated documentation files (the ++# Software''), to deal in the Software without restriction, including ++# without limitation the rights to use, copy, modify, merge, publish, ++# distribute, sublicense, and/or sell copies of the Software, and to ++# permit persons to whom the Software is furnished to do so, subject to ++# the following conditions: ++# ++# The above copyright notice and this permission notice shall be included ++# in all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED AS IS'', WITHOUT WARRANTY OF ANY KIND, ++# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++# DEALINGS IN THE SOFTWARE. ++# ----------------------------------------------------------------------- ++ ++.text ++.align 12 ++.globl _ffi_closure_trampoline_table_page ++_ffi_closure_trampoline_table_page: ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ ++ ++ // trampoline ++ // Save to stack ++ stmfd sp!, {r0-r3} ++ ++ // Load the context argument from the config page. ++ // This places the first usable config value at _ffi_closure_trampoline_table-4080 ++ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ++ ldr r0, [pc, #-4092] ++ ++ // Load the jump address from the config page. ++ ldr pc, [pc, #-4092] ++ +diff --git a/js/src/ctypes/libffi/src/avr32/ffi.c b/js/src/ctypes/libffi/src/avr32/ffi.c +--- a/js/src/ctypes/libffi/src/avr32/ffi.c ++++ b/js/src/ctypes/libffi/src/avr32/ffi.c +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 2009 Bradley Smith ++ ffi.c - Copyright (c) 2011 Anthony Green ++ Copyright (c) 2009 Bradley Smith + + AVR32 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -389,17 +390,18 @@ unsigned int ffi_closure_SYSV_inner(ffi_ + + return cif->flags; + } + + ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, + void *codeloc) + { +- FFI_ASSERT(cif->abi == FFI_SYSV); ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; + + unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]); + unsigned int __fun = (unsigned int)(&ffi_closure_SYSV); + unsigned int __ctx = (unsigned int)(codeloc); + unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag); + unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner); + *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */ + *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */ +diff --git a/js/src/ctypes/libffi/src/avr32/ffitarget.h b/js/src/ctypes/libffi/src/avr32/ffitarget.h +--- a/js/src/ctypes/libffi/src/avr32/ffitarget.h ++++ b/js/src/ctypes/libffi/src/avr32/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 2009 Bradley Smith ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 2009 Bradley Smith + Target configuration macros for AVR32. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, +diff --git a/js/src/ctypes/libffi/src/bfin/ffi.c b/js/src/ctypes/libffi/src/bfin/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/bfin/ffi.c +@@ -0,0 +1,196 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca , ++ Paulo Pizarro ++ ++ Blackfin Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++#include ++#include ++ ++#include ++#include ++ ++/* Maximum number of GPRs available for argument passing. */ ++#define MAX_GPRARGS 3 ++ ++/* ++ * Return types ++ */ ++#define FFIBFIN_RET_VOID 0 ++#define FFIBFIN_RET_BYTE 1 ++#define FFIBFIN_RET_HALFWORD 2 ++#define FFIBFIN_RET_INT64 3 ++#define FFIBFIN_RET_INT32 4 ++ ++/*====================================================================*/ ++/* PROTOTYPE * ++ /*====================================================================*/ ++void ffi_prep_args(unsigned char *, extended_cif *); ++ ++/*====================================================================*/ ++/* Externals */ ++/* (Assembly) */ ++/*====================================================================*/ ++ ++extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void)); ++ ++/*====================================================================*/ ++/* Implementation */ ++/* */ ++/*====================================================================*/ ++ ++ ++/* ++ * This function calculates the return type (size) based on type. ++ */ ++ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* --------------------------------------* ++ * Return handling * ++ * --------------------------------------*/ ++ switch (cif->rtype->type) { ++ case FFI_TYPE_VOID: ++ cif->flags = FFIBFIN_RET_VOID; ++ break; ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ cif->flags = FFIBFIN_RET_HALFWORD; ++ break; ++ case FFI_TYPE_UINT8: ++ cif->flags = FFIBFIN_RET_BYTE; ++ break; ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_SINT8: ++ cif->flags = FFIBFIN_RET_INT32; ++ break; ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_DOUBLE: ++ cif->flags = FFIBFIN_RET_INT64; ++ break; ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size <= 4){ ++ cif->flags = FFIBFIN_RET_INT32; ++ }else if (cif->rtype->size == 8){ ++ cif->flags = FFIBFIN_RET_INT64; ++ }else{ ++ //it will return via a hidden pointer in P0 ++ cif->flags = FFIBFIN_RET_VOID; ++ } ++ break; ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ return FFI_OK; ++} ++ ++/* ++ * This will prepare the arguments and will call the assembly routine ++ * cif = the call interface ++ * fn = the function to be called ++ * rvalue = the return value ++ * avalue = the arguments ++ */ ++void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue) ++{ ++ int ret_type = cif->flags; ++ extended_cif ecif; ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) { ++ case FFI_SYSV: ++ ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn); ++ break; ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/* ++* This function prepares the parameters (copies them from the ecif to the stack) ++* to call the function (ffi_prep_args is called by the assembly routine in file ++* sysv.S, which also calls the actual function) ++*/ ++void ffi_prep_args(unsigned char *stack, extended_cif *ecif) ++{ ++ register unsigned int i = 0; ++ void **p_argv; ++ unsigned char *argp; ++ ffi_type **p_arg; ++ argp = stack; ++ p_argv = ecif->avalue; ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ (i != 0); ++ i--, p_arg++) { ++ size_t z; ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) { ++ z = sizeof(int); ++ switch ((*p_arg)->type) { ++ case FFI_TYPE_SINT8: { ++ signed char v = *(SINT8 *)(* p_argv); ++ signed int t = v; ++ *(signed int *) argp = t; ++ } ++ break; ++ case FFI_TYPE_UINT8: { ++ unsigned char v = *(UINT8 *)(* p_argv); ++ unsigned int t = v; ++ *(unsigned int *) argp = t; ++ } ++ break; ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv); ++ break; ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv); ++ break; ++ case FFI_TYPE_STRUCT: ++ memcpy(argp, *p_argv, (*p_arg)->size); ++ break; ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } else if (z == sizeof(int)) { ++ *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv); ++ } else { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++} ++ ++ ++ +diff --git a/js/src/ctypes/libffi/src/bfin/ffitarget.h b/js/src/ctypes/libffi/src/bfin/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/bfin/ffitarget.h +@@ -0,0 +1,43 @@ ++/* ----------------------------------------------------------------------- ++ ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca ++ ++ Blackfin Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_SYSV, ++ FFI_LAST_ABI, ++ FFI_DEFAULT_ABI = FFI_SYSV ++} ffi_abi; ++#endif ++ ++#endif ++ +diff --git a/js/src/ctypes/libffi/src/bfin/sysv.S b/js/src/ctypes/libffi/src/bfin/sysv.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/bfin/sysv.S +@@ -0,0 +1,179 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca , ++ Paulo Pizarro ++ ++ Blackfin Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++.text ++.align 4 ++ ++ /* ++ There is a "feature" in the bfin toolchain that it puts a _ before function names ++ that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV ++ */ ++ .global _ffi_call_SYSV; ++ .type _ffi_call_SYSV, STT_FUNC; ++ .func ffi_call_SYSV ++ ++ /* ++ cif->bytes = R0 (fp+8) ++ &ecif = R1 (fp+12) ++ ffi_prep_args = R2 (fp+16) ++ ret_type = stack (fp+20) ++ ecif.rvalue = stack (fp+24) ++ fn = stack (fp+28) ++ got (fp+32) ++ ++ There is room for improvement here (we can use temporary registers ++ instead of saving the values in the memory) ++ REGS: ++ P5 => Stack pointer (function arguments) ++ R5 => cif->bytes ++ R4 => ret->type ++ ++ FP-20 = P3 ++ FP-16 = SP (parameters area) ++ FP-12 = SP (temp) ++ FP-08 = function return part 1 [R0] ++ FP-04 = function return part 2 [R1] ++ */ ++ ++_ffi_call_SYSV: ++.prologue: ++ LINK 20; ++ [FP-20] = P3; ++ [FP+8] = R0; ++ [FP+12] = R1; ++ [FP+16] = R2; ++ ++.allocate_stack: ++ //alocate cif->bytes into the stack ++ R1 = [FP+8]; ++ R0 = SP; ++ R0 = R0 - R1; ++ R1 = 4; ++ R0 = R0 - R1; ++ [FP-12] = SP; ++ SP = R0; ++ [FP-16] = SP; ++ ++.call_prep_args: ++ //get the addr of prep_args ++ P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4]; ++ P1 = [P0]; ++ P3 = [P0+4]; ++ R0 = [FP-16];//SP (parameter area) ++ R1 = [FP+12];//ecif ++ call (P1); ++ ++.call_user_function: ++ //ajust SP so as to allow the user function access the parameters on the stack ++ SP = [FP-16]; //point to function parameters ++ R0 = [SP]; ++ R1 = [SP+4]; ++ R2 = [SP+8]; ++ //load user function address ++ P0 = FP; ++ P0 +=28; ++ P1 = [P0]; ++ P1 = [P1]; ++ P3 = [P0+4]; ++ /* ++ For functions returning aggregate values (struct) occupying more than 8 bytes, ++ the caller allocates the return value object on the stack and the address ++ of this object is passed to the callee as a hidden argument in register P0. ++ */ ++ P0 = [FP+24]; ++ ++ call (P1); ++ SP = [FP-12]; ++.compute_return: ++ P2 = [FP-20]; ++ [FP-8] = R0; ++ [FP-4] = R1; ++ ++ R0 = [FP+20]; ++ R1 = R0 << 2; ++ ++ R0 = [P2+.rettable@GOT17M4]; ++ R0 = R1 + R0; ++ P2 = R0; ++ R1 = [P2]; ++ ++ P2 = [FP+-20]; ++ R0 = [P2+.rettable@GOT17M4]; ++ R0 = R1 + R0; ++ P2 = R0; ++ R0 = [FP-8]; ++ R1 = [FP-4]; ++ jump (P2); ++ ++/* ++#define FFIBFIN_RET_VOID 0 ++#define FFIBFIN_RET_BYTE 1 ++#define FFIBFIN_RET_HALFWORD 2 ++#define FFIBFIN_RET_INT64 3 ++#define FFIBFIN_RET_INT32 4 ++*/ ++.align 4 ++.align 4 ++.rettable: ++ .dd .epilogue - .rettable ++ .dd .rbyte - .rettable; ++ .dd .rhalfword - .rettable; ++ .dd .rint64 - .rettable; ++ .dd .rint32 - .rettable; ++ ++.rbyte: ++ P0 = [FP+24]; ++ R0 = R0.B (Z); ++ [P0] = R0; ++ JUMP .epilogue ++.rhalfword: ++ P0 = [FP+24]; ++ R0 = R0.L; ++ [P0] = R0; ++ JUMP .epilogue ++.rint64: ++ P0 = [FP+24];// &rvalue ++ [P0] = R0; ++ [P0+4] = R1; ++ JUMP .epilogue ++.rint32: ++ P0 = [FP+24]; ++ [P0] = R0; ++.epilogue: ++ R0 = [FP+8]; ++ R1 = [FP+12]; ++ R2 = [FP+16]; ++ P3 = [FP-20]; ++ UNLINK; ++ RTS; ++ ++.size _ffi_call_SYSV,.-_ffi_call_SYSV; ++.endfunc +diff --git a/js/src/ctypes/libffi/src/closures.c b/js/src/ctypes/libffi/src/closures.c +--- a/js/src/ctypes/libffi/src/closures.c ++++ b/js/src/ctypes/libffi/src/closures.c +@@ -1,11 +1,12 @@ + /* ----------------------------------------------------------------------- +- closures.c - Copyright (c) 2007 Red Hat, Inc. +- Copyright (C) 2007, 2009 Free Software Foundation, Inc ++ closures.c - Copyright (c) 2007, 2009, 2010 Red Hat, Inc. ++ Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc ++ Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + Code to allocate and deallocate memory for closures. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -27,18 +28,18 @@ + + #if defined __linux__ && !defined _GNU_SOURCE + #define _GNU_SOURCE 1 + #endif + + #include + #include + +-#ifndef FFI_MMAP_EXEC_WRIT +-# if __gnu_linux__ ++#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE ++# if __gnu_linux__ && !defined(__ANDROID__) + /* This macro indicates it may be forbidden to map anonymous memory + with both write and execute permission. Code compiled when this + option is defined will attempt to map such pages once, but if it + fails, it falls back to creating a temporary file in a writable and + executable filesystem and mapping pages from it into separate + locations in the virtual memory space, one location writable and + another executable. */ + # define FFI_MMAP_EXEC_WRIT 1 +@@ -58,17 +59,21 @@ + don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that + might cause audit messages. */ + # define FFI_MMAP_EXEC_SELINUX 1 + # endif + #endif + + #if FFI_CLOSURES + +-# if FFI_MMAP_EXEC_WRIT ++# if FFI_EXEC_TRAMPOLINE_TABLE ++ ++// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. ++ ++# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ + + #define USE_LOCKS 1 + #define USE_DL_PREFIX 1 + #ifdef __GNUC__ + #ifndef USE_BUILTIN_FFS + #define USE_BUILTIN_FFS 1 + #endif + #endif +@@ -162,25 +167,48 @@ selinux_enabled_check (void) + : (selinux_enabled = selinux_enabled_check ())) + + #else + + #define is_selinux_enabled() 0 + + #endif /* !FFI_MMAP_EXEC_SELINUX */ + +-#elif defined (__CYGWIN__) ++/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */ ++#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX ++#include ++ ++static int emutramp_enabled = -1; ++ ++static int ++emutramp_enabled_check (void) ++{ ++ if (getenv ("FFI_DISABLE_EMUTRAMP") == NULL) ++ return 1; ++ else ++ return 0; ++} ++ ++#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \ ++ : (emutramp_enabled = emutramp_enabled_check ())) ++#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ ++ ++#elif defined (__CYGWIN__) || defined(__INTERIX) + + #include + + /* Cygwin is Linux-like, but not quite that Linux-like. */ + #define is_selinux_enabled() 0 + + #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */ + ++#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX ++#define is_emutramp_enabled() 0 ++#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ ++ + /* Declare all functions defined in dlmalloc.c as static. */ + static void *dlmalloc(size_t); + static void dlfree(void*); + static void *dlcalloc(size_t, size_t) MAYBE_UNUSED; + static void *dlrealloc(void *, size_t) MAYBE_UNUSED; + static void *dlmemalign(size_t, size_t) MAYBE_UNUSED; + static void *dlvalloc(size_t) MAYBE_UNUSED; + static int dlmallopt(int, int) MAYBE_UNUSED; +@@ -188,31 +216,31 @@ static size_t dlmalloc_footprint(void) M + static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED; + static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED; + static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED; + static void *dlpvalloc(size_t) MAYBE_UNUSED; + static int dlmalloc_trim(size_t) MAYBE_UNUSED; + static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED; + static void dlmalloc_stats(void) MAYBE_UNUSED; + +-#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) ++#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) + /* Use these for mmap and munmap within dlmalloc.c. */ + static void *dlmmap(void *, size_t, int, int, int, off_t); + static int dlmunmap(void *, size_t); +-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) */ ++#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + + #define mmap dlmmap + #define munmap dlmunmap + + #include "dlmalloc.c" + + #undef mmap + #undef munmap + +-#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) ++#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) + + /* A mutex used to synchronize access to *exec* variables in this file. */ + static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER; + + /* A file descriptor of a temporary file from which we'll map + executable pages. */ + static int execfd = -1; + +@@ -231,17 +259,17 @@ open_temp_exec_file_name (char *name) + return fd; + } + + /* Open a temporary file in the named directory. */ + static int + open_temp_exec_file_dir (const char *dir) + { + static const char suffix[] = "/ffiXXXXXX"; +- int lendir = strlen (dir); ++ size_t lendir = strlen (dir); + char *tempname = __builtin_alloca (lendir + sizeof (suffix)); + + if (!tempname) + return -1; + + memcpy (tempname, dir, lendir); + memcpy (tempname + lendir, suffix, sizeof (suffix)); + +@@ -289,17 +317,17 @@ open_temp_exec_file_mnt (const char *mou + return -1; + + for (;;) + { + int fd; + struct mntent mnt; + char buf[MAXPATHLEN * 3]; + +- if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf))) ++ if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL) + return -1; + + if (hasmntopt (&mnt, "ro") + || hasmntopt (&mnt, "noexec") + || access (mnt.mnt_dir, W_OK)) + continue; + + fd = open_temp_exec_file_dir (mnt.mnt_dir); +@@ -349,17 +377,17 @@ open_temp_exec_file_opts_next (void) + open_temp_exec_file_opts_idx = 0; + return 1; + } + + return 0; + } + + /* Return a file descriptor of a temporary zero-sized file in a +- writable and exexutable filesystem. */ ++ writable and executable filesystem. */ + static int + open_temp_exec_file (void) + { + int fd; + + do + { + fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func +@@ -448,16 +476,22 @@ dlmmap (void *start, size_t length, int + && prot == (PROT_READ | PROT_WRITE) + && flags == (MAP_PRIVATE | MAP_ANONYMOUS) + && fd == -1 && offset == 0); + + #if FFI_CLOSURE_TEST + printf ("mapping in %zi\n", length); + #endif + ++ if (execfd == -1 && is_emutramp_enabled ()) ++ { ++ ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset); ++ return ptr; ++ } ++ + if (execfd == -1 && !is_selinux_enabled ()) + { + ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset); + + if (ptr != MFAIL || (errno != EPERM && errno != EACCES)) + /* Cool, no need to mess with separate segments. */ + return ptr; + +@@ -517,17 +551,17 @@ segment_holding_code (mstate m, char* ad + && addr < add_segment_exec_offset (sp->base, sp) + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } + } + #endif + +-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) */ ++#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + + /* Allocate a chunk of memory with the given size. Returns a pointer + to the writable address, and sets *CODE to the executable + corresponding virtual address. */ + void * + ffi_closure_alloc (size_t size, void **code) + { + void *ptr; +diff --git a/js/src/ctypes/libffi/src/cris/ffi.c b/js/src/ctypes/libffi/src/cris/ffi.c +--- a/js/src/ctypes/libffi/src/cris/ffi.c ++++ b/js/src/ctypes/libffi/src/cris/ffi.c +@@ -148,31 +148,34 @@ ffi_prep_args (char *stack, extended_cif + } + p_argv++; + argp += z; + } + + return (struct_count); + } + +-ffi_status +-ffi_prep_cif (ffi_cif * cif, +- ffi_abi abi, unsigned int nargs, +- ffi_type * rtype, ffi_type ** atypes) ++ffi_status FFI_HIDDEN ++ffi_prep_cif_core (ffi_cif * cif, ++ ffi_abi abi, unsigned int isvariadic, ++ unsigned int nfixedargs, unsigned int ntotalargs, ++ ffi_type * rtype, ffi_type ** atypes) + { + unsigned bytes = 0; + unsigned int i; + ffi_type **ptr; + + FFI_ASSERT (cif != NULL); ++ FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); ++ FFI_ASSERT(nfixedargs <= ntotalargs); + FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); + + cif->abi = abi; + cif->arg_types = atypes; +- cif->nargs = nargs; ++ cif->nargs = ntotalargs; + cif->rtype = rtype; + + cif->flags = 0; + + if ((cif->rtype->size == 0) + && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + +diff --git a/js/src/ctypes/libffi/src/cris/ffitarget.h b/js/src/ctypes/libffi/src/cris/ffitarget.h +--- a/js/src/ctypes/libffi/src/cris/ffitarget.h ++++ b/js/src/ctypes/libffi/src/cris/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for CRIS. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, +diff --git a/js/src/ctypes/libffi/src/dlmalloc.c b/js/src/ctypes/libffi/src/dlmalloc.c +--- a/js/src/ctypes/libffi/src/dlmalloc.c ++++ b/js/src/ctypes/libffi/src/dlmalloc.c +@@ -617,16 +617,19 @@ DEFAULT_MMAP_THRESHOLD default: 25 + */ + + /* #define HAVE_USR_INCLUDE_MALLOC_H */ + + #ifdef HAVE_USR_INCLUDE_MALLOC_H + #include "/usr/include/malloc.h" + #else /* HAVE_USR_INCLUDE_MALLOC_H */ + ++/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */ ++#define _STRUCT_MALLINFO ++ + struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ +@@ -1247,17 +1250,17 @@ extern void* sbrk(ptrdiff_t); + + /* ------------------- size_t and alignment properties -------------------- */ + + /* The byte and bit size of a size_t */ + #define SIZE_T_SIZE (sizeof(size_t)) + #define SIZE_T_BITSIZE (sizeof(size_t) << 3) + + /* Some constants coerced to size_t */ +-/* Annoying but necessary to avoid errors on some plaftorms */ ++/* Annoying but necessary to avoid errors on some platforms */ + #define SIZE_T_ZERO ((size_t)0) + #define SIZE_T_ONE ((size_t)1) + #define SIZE_T_TWO ((size_t)2) + #define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) + #define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) + #define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) + #define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) + +@@ -1401,17 +1404,17 @@ static int win32munmap(void* ptr, size_t + #endif /* HAVE_MMAP && HAVE_MREMAP */ + + #if HAVE_MORECORE + #define CALL_MORECORE(S) MORECORE(S) + #else /* HAVE_MORECORE */ + #define CALL_MORECORE(S) MFAIL + #endif /* HAVE_MORECORE */ + +-/* mstate bit set if continguous morecore disabled or failed */ ++/* mstate bit set if contiguous morecore disabled or failed */ + #define USE_NONCONTIGUOUS_BIT (4U) + + /* segment bit set in create_mspace_with_base */ + #define EXTERN_BIT (8U) + + + /* --------------------------- Lock preliminaries ------------------------ */ + +@@ -1653,17 +1656,17 @@ struct malloc_chunk { + size_t head; /* Size and inuse bits. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; + }; + + typedef struct malloc_chunk mchunk; + typedef struct malloc_chunk* mchunkptr; + typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ +-typedef unsigned int bindex_t; /* Described below */ ++typedef size_t bindex_t; /* Described below */ + typedef unsigned int binmap_t; /* Described below */ + typedef unsigned int flag_t; /* The type of various bit flag sets */ + + /* ------------------- Chunks sizes and alignments ----------------------- */ + + #define MCHUNK_SIZE (sizeof(mchunk)) + + #if FOOTERS +@@ -3082,18 +3085,18 @@ static void internal_malloc_stats(mstate + + /* + Unlink steps: + + 1. If x is a chained node, unlink it from its same-sized fd/bk links + and choose its bk node as its replacement. + 2. If x was the last node of its size, but not a leaf node, it must + be replaced with a leaf node (not merely one with an open left or +- right), to make sure that lefts and rights of descendents +- correspond properly to bit masks. We use the rightmost descendent ++ right), to make sure that lefts and rights of descendants ++ correspond properly to bit masks. We use the rightmost descendant + of x. We could use any other leaf, but this is easy to locate and + tends to counteract removal of leftmosts elsewhere, and so keeps + paths shorter than minimally guaranteed. This doesn't loop much + because on average a node in a tree is near the bottom. + 3. If x is the base of a chain (i.e., has parent links) relink + x's parent and children to x's replacement (or null if none). + */ + +@@ -3380,17 +3383,17 @@ static void add_segment(mstate m, char* + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + + /* Set up segment record */ + assert(is_aligned(ss)); + set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); + *ss = m->seg; /* Push current record */ + m->seg.base = tbase; + m->seg.size = tsize; +- set_segment_flags(&m->seg, mmapped); ++ (void)set_segment_flags(&m->seg, mmapped); + m->seg.next = ss; + + /* Insert trailing fenceposts */ + for (;;) { + mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); + p->head = FENCEPOST_HEAD; + ++nfences; + if ((char*)(&(nextp->head)) < old_end) +@@ -3540,17 +3543,17 @@ static void* sys_alloc(mstate m, size_t + if (tbase != CMFAIL) { + + if ((m->footprint += tsize) > m->max_footprint) + m->max_footprint = m->footprint; + + if (!is_initialized(m)) { /* first-time initialization */ + m->seg.base = m->least_addr = tbase; + m->seg.size = tsize; +- set_segment_flags(&m->seg, mmap_flag); ++ (void)set_segment_flags(&m->seg, mmap_flag); + m->magic = mparams.magic; + init_bins(m); + if (is_global(m)) + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + else { + /* Offset top by embedded malloc_state */ + mchunkptr mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); +@@ -5083,20 +5086,20 @@ History: + * Add linux mremap support code from HJ Liu + + V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) + * Integrated most documentation with the code. + * Add support for mmap, with help from + Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Use last_remainder in more cases. + * Pack bins using idea from colin@nyx10.cs.du.edu +- * Use ordered bins instead of best-fit threshhold ++ * Use ordered bins instead of best-fit threshold + * Eliminate block-local decls to simplify tracing and debugging. + * Support another case of realloc via move into top +- * Fix error occuring when initial sbrk_base not word-aligned. ++ * Fix error occurring when initial sbrk_base not word-aligned. + * Rely on page size for units instead of SBRK_UNIT to + avoid surprises about sbrk alignment conventions. + * Add mallinfo, mallopt. Thanks to Raymond Nijssen + (raymond@es.ele.tue.nl) for the suggestion. + * Add `pad' argument to malloc_trim and top_pad mallopt parameter. + * More precautions for cases where other routines call sbrk, + courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Added macros etc., allowing use in linux libc from +diff --git a/js/src/ctypes/libffi/src/frv/ffitarget.h b/js/src/ctypes/libffi/src/frv/ffitarget.h +--- a/js/src/ctypes/libffi/src/frv/ffitarget.h ++++ b/js/src/ctypes/libffi/src/frv/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2004 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2004 Red Hat, Inc. + Target configuration macros for FR-V + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + /* ---- System specific configurations ----------------------------------- */ + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, +diff --git a/js/src/ctypes/libffi/src/ia64/ffi.c b/js/src/ctypes/libffi/src/ia64/ffi.c +--- a/js/src/ctypes/libffi/src/ia64/ffi.c ++++ b/js/src/ctypes/libffi/src/ia64/ffi.c +@@ -1,11 +1,12 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 1998, 2007, 2008 Red Hat, Inc. ++ ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. + Copyright (c) 2000 Hewlett Packard Company ++ Copyright (c) 2011 Anthony Green + + IA64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -319,23 +320,27 @@ ffi_call(ffi_cif *cif, void (*fn)(void), + + case FFI_TYPE_POINTER: + stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i]; + break; + + case FFI_TYPE_FLOAT: + if (gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]); +- stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i]; ++ { ++ UINT32 tmp; ++ memcpy (&tmp, avalue[i], sizeof (UINT32)); ++ stack->gp_regs[gpcount++] = tmp; ++ } + break; + + case FFI_TYPE_DOUBLE: + if (gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]); +- stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i]; ++ memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64)); + break; + + case FFI_TYPE_LONGDOUBLE: + if (gpcount & 1) + gpcount++; + if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]); + memcpy (&stack->gp_regs[gpcount], avalue[i], 16); +@@ -391,17 +396,17 @@ ffi_call(ffi_cif *cif, void (*fn)(void), + interpreted procedure, into a closure. + + For IA64, function pointer are already pairs consisting of a code + pointer, and a gp pointer. The latter is needed to access global + variables. Here we set up such a pair as the first two words of + the closure (in the "trampoline" area), but we replace the gp + pointer with a pointer to the closure itself. We also add the real + gp pointer to the closure. This allows the function entry code to +- both retrieve the user data, and to restire the correct gp pointer. */ ++ both retrieve the user data, and to restore the correct gp pointer. */ + + extern void ffi_closure_unix (); + + ffi_status + ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, +@@ -420,17 +425,18 @@ ffi_prep_closure_loc (ffi_closure* closu + UINT64 code_pointer; /* Pointer to ffi_closure_unix. */ + UINT64 fake_gp; /* Pointer to closure, installed as gp. */ + UINT64 real_gp; /* Real gp value. */ + }; + + struct ffi_ia64_trampoline_struct *tramp; + struct ia64_fd *fd; + +- FFI_ASSERT (cif->abi == FFI_UNIX); ++ if (cif->abi != FFI_UNIX) ++ return FFI_BAD_ABI; + + tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp; + fd = (struct ia64_fd *)(void *)ffi_closure_unix; + + tramp->code_pointer = fd->code_pointer; + tramp->real_gp = fd->gp; + tramp->fake_gp = (UINT64)(PTR64)codeloc; + closure->cif = cif; +diff --git a/js/src/ctypes/libffi/src/ia64/ffitarget.h b/js/src/ctypes/libffi/src/ia64/ffitarget.h +--- a/js/src/ctypes/libffi/src/ia64/ffitarget.h ++++ b/js/src/ctypes/libffi/src/ia64/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for IA-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #ifndef LIBFFI_ASM + typedef unsigned long long ffi_arg; + typedef signed long long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_UNIX, /* Linux and all Unix variants use the same conventions */ + FFI_LAST_ABI, +diff --git a/js/src/ctypes/libffi/src/java_raw_api.c b/js/src/ctypes/libffi/src/java_raw_api.c +--- a/js/src/ctypes/libffi/src/java_raw_api.c ++++ b/js/src/ctypes/libffi/src/java_raw_api.c +@@ -306,17 +306,17 @@ void ffi_java_raw_call (ffi_cif *cif, vo + static void + ffi_java_translate_args (ffi_cif *cif, void *rvalue, + void **avalue, void *user_data) + { + ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); + ffi_raw_closure *cl = (ffi_raw_closure*)user_data; + + ffi_java_ptrarray_to_raw (cif, avalue, raw); +- (*cl->fun) (cif, rvalue, raw, cl->user_data); ++ (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data); + ffi_java_raw_to_rvalue (cif, rvalue); + } + + ffi_status + ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, +diff --git a/js/src/ctypes/libffi/src/m32r/ffitarget.h b/js/src/ctypes/libffi/src/m32r/ffitarget.h +--- a/js/src/ctypes/libffi/src/m32r/ffitarget.h ++++ b/js/src/ctypes/libffi/src/m32r/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 2004 Renesas Technology. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 2004 Renesas Technology. + Target configuration macros for M32R. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -21,16 +22,20 @@ + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + /* ---- Generic type definitions ----------------------------------------- */ + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi + { +diff --git a/js/src/ctypes/libffi/src/m68k/ffi.c b/js/src/ctypes/libffi/src/m68k/ffi.c +--- a/js/src/ctypes/libffi/src/m68k/ffi.c ++++ b/js/src/ctypes/libffi/src/m68k/ffi.c +@@ -1,21 +1,30 @@ + /* ----------------------------------------------------------------------- + ffi.c +- +- m68k Foreign Function Interface ++ ++ m68k Foreign Function Interface + ----------------------------------------------------------------------- */ + + #include + #include + + #include + #include ++#ifdef __rtems__ ++void rtems_cache_flush_multiple_data_lines( const void *, size_t ); ++#else + #include ++#ifdef __MINT__ ++#include ++#include ++#else + #include ++#endif ++#endif + + void ffi_call_SYSV (extended_cif *, + unsigned, unsigned, + void *, void (*fn) ()); + void *ffi_prep_args (void *stack, extended_cif *ecif); + void ffi_closure_SYSV (ffi_closure *); + void ffi_closure_struct_SYSV (ffi_closure *); + unsigned int ffi_closure_SYSV_inner (ffi_closure *closure, +@@ -30,34 +39,38 @@ ffi_prep_args (void *stack, extended_cif + unsigned int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + void *struct_value_ptr; + + argp = stack; + +- if (ecif->cif->rtype->type == FFI_TYPE_STRUCT +- && !ecif->cif->flags) ++ if ( ++#ifdef __MINT__ ++ (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) || ++#endif ++ (((ecif->cif->rtype->type == FFI_TYPE_STRUCT) ++ && !ecif->cif->flags))) + struct_value_ptr = ecif->rvalue; + else + struct_value_ptr = NULL; + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { +- size_t z; ++ size_t z = (*p_arg)->size; ++ int type = (*p_arg)->type; + +- z = (*p_arg)->size; + if (z < sizeof (int)) + { +- switch ((*p_arg)->type) ++ switch (type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; + break; +@@ -66,17 +79,24 @@ ffi_prep_args (void *stack, extended_cif + *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; + break; + + case FFI_TYPE_STRUCT: ++#ifdef __MINT__ ++ if (z == 1 || z == 2) ++ memcpy (argp + 2, *p_argv, z); ++ else ++ memcpy (argp, *p_argv, z); ++#else + memcpy (argp + sizeof (int) - z, *p_argv, z); ++#endif + break; + + default: + FFI_ASSERT (0); + } + z = sizeof (int); + } + else +@@ -98,40 +118,59 @@ ffi_prep_args (void *stack, extended_cif + #define CIF_FLAGS_INT 1 + #define CIF_FLAGS_DINT 2 + #define CIF_FLAGS_FLOAT 4 + #define CIF_FLAGS_DOUBLE 8 + #define CIF_FLAGS_LDOUBLE 16 + #define CIF_FLAGS_POINTER 32 + #define CIF_FLAGS_STRUCT1 64 + #define CIF_FLAGS_STRUCT2 128 ++#define CIF_FLAGS_SINT8 256 ++#define CIF_FLAGS_SINT16 512 + + /* Perform machine dependent cif processing */ + ffi_status + ffi_prep_cif_machdep (ffi_cif *cif) + { + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = 0; + break; + + case FFI_TYPE_STRUCT: ++ if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && ++ cif->rtype->elements[1]) ++ { ++ cif->flags = 0; ++ break; ++ } ++ + switch (cif->rtype->size) + { + case 1: ++#ifdef __MINT__ ++ cif->flags = CIF_FLAGS_STRUCT2; ++#else + cif->flags = CIF_FLAGS_STRUCT1; ++#endif + break; + case 2: + cif->flags = CIF_FLAGS_STRUCT2; + break; ++#ifdef __MINT__ ++ case 3: ++#endif + case 4: + cif->flags = CIF_FLAGS_INT; + break; ++#ifdef __MINT__ ++ case 7: ++#endif + case 8: + cif->flags = CIF_FLAGS_DINT; + break; + default: + cif->flags = 0; + break; + } + break; +@@ -139,29 +178,43 @@ ffi_prep_cif_machdep (ffi_cif *cif) + case FFI_TYPE_FLOAT: + cif->flags = CIF_FLAGS_FLOAT; + break; + + case FFI_TYPE_DOUBLE: + cif->flags = CIF_FLAGS_DOUBLE; + break; + ++#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE) + case FFI_TYPE_LONGDOUBLE: ++#ifdef __MINT__ ++ cif->flags = 0; ++#else + cif->flags = CIF_FLAGS_LDOUBLE; ++#endif + break; ++#endif + + case FFI_TYPE_POINTER: + cif->flags = CIF_FLAGS_POINTER; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = CIF_FLAGS_DINT; + break; + ++ case FFI_TYPE_SINT16: ++ cif->flags = CIF_FLAGS_SINT16; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ cif->flags = CIF_FLAGS_SINT8; ++ break; ++ + default: + cif->flags = CIF_FLAGS_INT; + break; + } + + return FFI_OK; + } + +@@ -207,16 +260,36 @@ ffi_prep_incoming_args_SYSV (char *stack + argp = stack; + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; ++#ifdef __MINT__ ++ if (cif->flags && ++ cif->rtype->type == FFI_TYPE_STRUCT && ++ (z == 1 || z == 2)) ++ { ++ *p_argv = (void *) (argp + 2); ++ ++ z = 4; ++ } ++ else ++ if (cif->flags && ++ cif->rtype->type == FFI_TYPE_STRUCT && ++ (z == 3 || z == 4)) ++ { ++ *p_argv = (void *) (argp); ++ ++ z = 4; ++ } ++ else ++#endif + if (z <= 4) + { + *p_argv = (void *) (argp + 4 - z); + + z = 4; + } + else + { +@@ -250,29 +323,40 @@ ffi_closure_SYSV_inner (ffi_closure *clo + + ffi_status + ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) + { +- FFI_ASSERT (cif->abi == FFI_SYSV); ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; + + *(unsigned short *)closure->tramp = 0x207c; + *(void **)(closure->tramp + 2) = codeloc; + *(unsigned short *)(closure->tramp + 6) = 0x4ef9; +- if (cif->rtype->type == FFI_TYPE_STRUCT +- && !cif->flags) ++ ++ if ( ++#ifdef __MINT__ ++ (cif->rtype->type == FFI_TYPE_LONGDOUBLE) || ++#endif ++ (((cif->rtype->type == FFI_TYPE_STRUCT) ++ && !cif->flags))) + *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV; + else + *(void **)(closure->tramp + 8) = ffi_closure_SYSV; + ++#ifdef __rtems__ ++ rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE ); ++#elif defined(__MINT__) ++ Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE); ++#else + syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE, + FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE); ++#endif + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; + } +- +diff --git a/js/src/ctypes/libffi/src/m68k/ffitarget.h b/js/src/ctypes/libffi/src/m68k/ffitarget.h +--- a/js/src/ctypes/libffi/src/m68k/ffitarget.h ++++ b/js/src/ctypes/libffi/src/m68k/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for Motorola 68K. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, +diff --git a/js/src/ctypes/libffi/src/m68k/sysv.S b/js/src/ctypes/libffi/src/m68k/sysv.S +--- a/js/src/ctypes/libffi/src/m68k/sysv.S ++++ b/js/src/ctypes/libffi/src/m68k/sysv.S +@@ -1,13 +1,16 @@ + /* ----------------------------------------------------------------------- +- sysv.S - Copyright (c) 1998 Andreas Schwab +- Copyright (c) 2008 Red Hat, Inc. +- +- m68k Foreign Function Interface ++ ++ sysv.S - Copyright (c) 2012 Alan Hourihane ++ Copyright (c) 1998, 2012 Andreas Schwab ++ Copyright (c) 2008 Red Hat, Inc. ++ Copyright (c) 2012 Thorsten Glaser ++ ++ m68k Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: +@@ -36,61 +39,76 @@ + #define CFI_ENDPROC() .cfi_endproc + #else + #define CFI_STARTPROC() + #define CFI_OFFSET(reg,off) + #define CFI_DEF_CFA(reg,off) + #define CFI_ENDPROC() + #endif + ++#ifdef __MINT__ ++#define CALLFUNC(funcname) _ ## funcname ++#else ++#define CALLFUNC(funcname) funcname ++#endif ++ + .text + +- .globl ffi_call_SYSV +- .type ffi_call_SYSV,@function ++ .globl CALLFUNC(ffi_call_SYSV) ++ .type CALLFUNC(ffi_call_SYSV),@function + .align 4 + +-ffi_call_SYSV: ++CALLFUNC(ffi_call_SYSV): + CFI_STARTPROC() + link %fp,#0 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %d2,-(%sp) + CFI_OFFSET(2,-12) + + | Make room for all of the new args. + sub.l 12(%fp),%sp + + | Call ffi_prep_args + move.l 8(%fp),-(%sp) + pea 4(%sp) + #if !defined __PIC__ +- jsr ffi_prep_args ++ jsr CALLFUNC(ffi_prep_args) + #else +- bsr.l ffi_prep_args@PLTPC ++ bsr.l CALLFUNC(ffi_prep_args@PLTPC) + #endif + addq.l #8,%sp + + | Pass pointer to struct value, if any ++#ifdef __MINT__ ++ move.l %d0,%a1 ++#else + move.l %a0,%a1 ++#endif + + | Call the function + move.l 24(%fp),%a0 + jsr (%a0) + + | Remove the space we pushed for the args + add.l 12(%fp),%sp + + | Load the pointer to storage for the return value + move.l 20(%fp),%a1 + + | Load the return type code + move.l 16(%fp),%d2 + + | If the return value pointer is NULL, assume no return value. ++ | NOTE: On the mc68000, tst on an address register is not supported. ++#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) ++ cmp.w #0, %a1 ++#else + tst.l %a1 ++#endif + jbeq noretval + + btst #0,%d2 + jbeq retlongint + move.l %d0,(%a1) + jbra epilogue + + retlongint: +@@ -98,137 +116,215 @@ retlongint: + jbeq retfloat + move.l %d0,(%a1) + move.l %d1,4(%a1) + jbra epilogue + + retfloat: + btst #2,%d2 + jbeq retdouble ++#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.s %fp0,(%a1) ++#else ++ move.l %d0,(%a1) ++#endif + jbra epilogue + + retdouble: + btst #3,%d2 + jbeq retlongdouble ++#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.d %fp0,(%a1) ++#else ++ move.l %d0,(%a1)+ ++ move.l %d1,(%a1) ++#endif + jbra epilogue + + retlongdouble: + btst #4,%d2 + jbeq retpointer ++#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.x %fp0,(%a1) ++#else ++ move.l %d0,(%a1)+ ++ move.l %d1,(%a1)+ ++ move.l %d2,(%a1) ++#endif + jbra epilogue + + retpointer: + btst #5,%d2 + jbeq retstruct1 ++#ifdef __MINT__ ++ move.l %d0,(%a1) ++#else + move.l %a0,(%a1) ++#endif + jbra epilogue + + retstruct1: + btst #6,%d2 + jbeq retstruct2 + move.b %d0,(%a1) + jbra epilogue + + retstruct2: + btst #7,%d2 ++ jbeq retsint8 ++ move.w %d0,(%a1) ++ jbra epilogue ++ ++retsint8: ++ btst #8,%d2 ++ jbeq retsint16 ++ | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. ++#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) ++ ext.w %d0 ++ ext.l %d0 ++#else ++ extb.l %d0 ++#endif ++ move.l %d0,(%a1) ++ jbra epilogue ++ ++retsint16: ++ btst #9,%d2 + jbeq noretval +- move.w %d0,(%a1) ++ ext.l %d0 ++ move.l %d0,(%a1) + + noretval: + epilogue: + move.l (%sp)+,%d2 + unlk %fp + rts + CFI_ENDPROC() +- .size ffi_call_SYSV,.-ffi_call_SYSV ++ .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) + +- .globl ffi_closure_SYSV +- .type ffi_closure_SYSV, @function ++ .globl CALLFUNC(ffi_closure_SYSV) ++ .type CALLFUNC(ffi_closure_SYSV), @function + .align 4 + +-ffi_closure_SYSV: ++CALLFUNC(ffi_closure_SYSV): + CFI_STARTPROC() + link %fp,#-12 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %sp,-12(%fp) + pea 8(%fp) + pea -12(%fp) + move.l %a0,-(%sp) + #if !defined __PIC__ +- jsr ffi_closure_SYSV_inner ++ jsr CALLFUNC(ffi_closure_SYSV_inner) + #else +- bsr.l ffi_closure_SYSV_inner@PLTPC ++ bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) + #endif + + lsr.l #1,%d0 + jne 1f + jcc .Lcls_epilogue ++ | CIF_FLAGS_INT + move.l -12(%fp),%d0 + .Lcls_epilogue: ++ | no CIF_FLAGS_* + unlk %fp + rts + 1: + lea -12(%fp),%a0 + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_float ++ | CIF_FLAGS_DINT + move.l (%a0)+,%d0 + move.l (%a0),%d1 + jra .Lcls_epilogue + .Lcls_ret_float: ++#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.s (%a0),%fp0 ++#else ++ move.l (%a0),%d0 ++#endif + jra .Lcls_epilogue + 1: + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_ldouble ++ | CIF_FLAGS_DOUBLE ++#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.d (%a0),%fp0 ++#else ++ move.l (%a0)+,%d0 ++ move.l (%a0),%d1 ++#endif + jra .Lcls_epilogue + .Lcls_ret_ldouble: ++#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.x (%a0),%fp0 ++#else ++ move.l (%a0)+,%d0 ++ move.l (%a0)+,%d1 ++ move.l (%a0),%d2 ++#endif + jra .Lcls_epilogue + 1: + lsr.l #2,%d0 +- jne .Lcls_ret_struct2 ++ jne 1f + jcs .Lcls_ret_struct1 ++ | CIF_FLAGS_POINTER + move.l (%a0),%a0 + move.l %a0,%d0 + jra .Lcls_epilogue + .Lcls_ret_struct1: + move.b (%a0),%d0 + jra .Lcls_epilogue +-.Lcls_ret_struct2: ++1: ++ lsr.l #2,%d0 ++ jne 1f ++ jcs .Lcls_ret_sint8 ++ | CIF_FLAGS_STRUCT2 + move.w (%a0),%d0 + jra .Lcls_epilogue ++.Lcls_ret_sint8: ++ move.l (%a0),%d0 ++ | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. ++#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) ++ ext.w %d0 ++ ext.l %d0 ++#else ++ extb.l %d0 ++#endif ++ jra .Lcls_epilogue ++1: ++ | CIF_FLAGS_SINT16 ++ move.l (%a0),%d0 ++ ext.l %d0 ++ jra .Lcls_epilogue + CFI_ENDPROC() + +- .size ffi_closure_SYSV,.-ffi_closure_SYSV ++ .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) + +- .globl ffi_closure_struct_SYSV +- .type ffi_closure_struct_SYSV, @function ++ .globl CALLFUNC(ffi_closure_struct_SYSV) ++ .type CALLFUNC(ffi_closure_struct_SYSV), @function + .align 4 + +-ffi_closure_struct_SYSV: ++CALLFUNC(ffi_closure_struct_SYSV): + CFI_STARTPROC() + link %fp,#0 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %sp,-12(%fp) + pea 8(%fp) + move.l %a1,-(%sp) + move.l %a0,-(%sp) + #if !defined __PIC__ +- jsr ffi_closure_SYSV_inner ++ jsr CALLFUNC(ffi_closure_SYSV_inner) + #else +- bsr.l ffi_closure_SYSV_inner@PLTPC ++ bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) + #endif + unlk %fp + rts + CFI_ENDPROC() +- .size ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV ++ .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV) + + #if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits + #endif +diff --git a/js/src/ctypes/libffi/src/m88k/ffi.c b/js/src/ctypes/libffi/src/m88k/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/m88k/ffi.c +@@ -0,0 +1,400 @@ ++/* ++ * Copyright (c) 2013 Miodrag Vallat. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * ``Software''), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/* ++ * m88k Foreign Function Interface ++ * ++ * This file attempts to provide all the FFI entry points which can reliably ++ * be implemented in C. ++ * ++ * Only OpenBSD/m88k is currently supported; other platforms (such as ++ * Motorola's SysV/m88k) could be supported with the following tweaks: ++ * ++ * - non-OpenBSD systems use an `outgoing parameter area' as part of the ++ * 88BCS calling convention, which is not supported under OpenBSD from ++ * release 3.6 onwards. Supporting it should be as easy as taking it ++ * into account when adjusting the stack, in the assembly code. ++ * ++ * - the logic deciding whether a function argument gets passed through ++ * registers, or on the stack, has changed several times in OpenBSD in ++ * edge cases (especially for structs larger than 32 bytes being passed ++ * by value). The code below attemps to match the logic used by the ++ * system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend ++ * fixes. ++ */ ++ ++#include ++#include ++ ++#include ++#include ++ ++void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *, ++ void (*fn) ()); ++void *ffi_prep_args (void *, extended_cif *); ++void ffi_closure_OBSD (ffi_closure *); ++void ffi_closure_struct_OBSD (ffi_closure *); ++unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *, ++ char *); ++void ffi_cacheflush_OBSD (unsigned int, unsigned int); ++ ++#define CIF_FLAGS_INT (1 << 0) ++#define CIF_FLAGS_DINT (1 << 1) ++ ++/* ++ * Foreign Function Interface API ++ */ ++ ++/* ffi_prep_args is called by the assembly routine once stack space has ++ been allocated for the function's arguments. */ ++ ++void * ++ffi_prep_args (void *stack, extended_cif *ecif) ++{ ++ unsigned int i; ++ void **p_argv; ++ char *argp, *stackp; ++ unsigned int *regp; ++ unsigned int regused; ++ ffi_type **p_arg; ++ void *struct_value_ptr; ++ ++ regp = (unsigned int *)stack; ++ stackp = (char *)(regp + 8); ++ regused = 0; ++ ++ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT ++ && !ecif->cif->flags) ++ struct_value_ptr = ecif->rvalue; ++ else ++ struct_value_ptr = NULL; ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++) ++ { ++ size_t z; ++ unsigned short t, a; ++ ++ z = (*p_arg)->size; ++ t = (*p_arg)->type; ++ a = (*p_arg)->alignment; ++ ++ /* ++ * Figure out whether the argument can be passed through registers ++ * or on the stack. ++ * The rule is that registers can only receive simple types not larger ++ * than 64 bits, or structs the exact size of a register and aligned to ++ * the size of a register. ++ */ ++ if (t == FFI_TYPE_STRUCT) ++ { ++ if (z == sizeof (int) && a == sizeof (int) && regused < 8) ++ argp = (char *)regp; ++ else ++ argp = stackp; ++ } ++ else ++ { ++ if (z > sizeof (int) && regused < 8 - 1) ++ { ++ /* align to an even register pair */ ++ if (regused & 1) ++ { ++ regp++; ++ regused++; ++ } ++ } ++ if (regused < 8) ++ argp = (char *)regp; ++ else ++ argp = stackp; ++ } ++ ++ /* Enforce proper stack alignment of 64-bit types */ ++ if (argp == stackp && a > sizeof (int)) ++ { ++ stackp = (char *) ALIGN(stackp, a); ++ argp = stackp; ++ } ++ ++ switch (t) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ *(unsigned int *) argp = *(unsigned int *) *p_argv; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_STRUCT: ++ memcpy (argp, *p_argv, z); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ } ++ ++ /* Align if necessary. */ ++ if ((sizeof (int) - 1) & z) ++ z = ALIGN(z, sizeof (int)); ++ ++ p_argv++; ++ ++ /* Be careful, once all registers are filled, and about to continue ++ on stack, regp == stackp. Therefore the check for regused as well. */ ++ if (argp == (char *)regp && regused < 8) ++ { ++ regp += z / sizeof (int); ++ regused += z / sizeof (int); ++ } ++ else ++ stackp += z; ++ } ++ ++ return struct_value_ptr; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep (ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++ cif->flags = 0; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == sizeof (int) && ++ cif->rtype->alignment == sizeof (int)) ++ cif->flags = CIF_FLAGS_INT; ++ else ++ cif->flags = 0; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ cif->flags = CIF_FLAGS_DINT; ++ break; ++ ++ default: ++ cif->flags = CIF_FLAGS_INT; ++ break; ++ } ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. */ ++ ++ if (rvalue == NULL ++ && cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->rtype->size != sizeof (int) ++ || cif->rtype->alignment != sizeof (int))) ++ ecif.rvalue = alloca (cif->rtype->size); ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_OBSD: ++ ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++/* ++ * Closure API ++ */ ++ ++static void ++ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp, ++ char *stackp) ++{ ++ unsigned int i; ++ void **p_argv; ++ char *argp; ++ unsigned int regused; ++ ffi_type **p_arg; ++ ++ regused = 0; ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) ++ { ++ size_t z; ++ unsigned short t, a; ++ ++ z = (*p_arg)->size; ++ t = (*p_arg)->type; ++ a = (*p_arg)->alignment; ++ ++ /* ++ * Figure out whether the argument has been passed through registers ++ * or on the stack. ++ * The rule is that registers can only receive simple types not larger ++ * than 64 bits, or structs the exact size of a register and aligned to ++ * the size of a register. ++ */ ++ if (t == FFI_TYPE_STRUCT) ++ { ++ if (z == sizeof (int) && a == sizeof (int) && regused < 8) ++ argp = (char *)regp; ++ else ++ argp = stackp; ++ } ++ else ++ { ++ if (z > sizeof (int) && regused < 8 - 1) ++ { ++ /* align to an even register pair */ ++ if (regused & 1) ++ { ++ regp++; ++ regused++; ++ } ++ } ++ if (regused < 8) ++ argp = (char *)regp; ++ else ++ argp = stackp; ++ } ++ ++ /* Enforce proper stack alignment of 64-bit types */ ++ if (argp == stackp && a > sizeof (int)) ++ { ++ stackp = (char *) ALIGN(stackp, a); ++ argp = stackp; ++ } ++ ++ if (z < sizeof (int) && t != FFI_TYPE_STRUCT) ++ *p_argv = (void *) (argp + sizeof (int) - z); ++ else ++ *p_argv = (void *) argp; ++ ++ /* Align if necessary */ ++ if ((sizeof (int) - 1) & z) ++ z = ALIGN(z, sizeof (int)); ++ ++ p_argv++; ++ ++ /* Be careful, once all registers are exhausted, and about to fetch from ++ stack, regp == stackp. Therefore the check for regused as well. */ ++ if (argp == (char *)regp && regused < 8) ++ { ++ regp += z / sizeof (int); ++ regused += z / sizeof (int); ++ } ++ else ++ stackp += z; ++ } ++} ++ ++unsigned int ++ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp, ++ char *stackp) ++{ ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void *)); ++ ++ ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp); ++ ++ (closure->fun) (cif, resp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++ffi_status ++ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data, void *codeloc) ++{ ++ unsigned int *tramp = (unsigned int *) codeloc; ++ void *fn; ++ ++ FFI_ASSERT (cif->abi == FFI_OBSD); ++ ++ if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags) ++ fn = &ffi_closure_struct_OBSD; ++ else ++ fn = &ffi_closure_OBSD; ++ ++ /* or.u %r10, %r0, %hi16(fn) */ ++ tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16); ++ /* or.u %r13, %r0, %hi16(closure) */ ++ tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16); ++ /* or %r10, %r10, %lo16(fn) */ ++ tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff); ++ /* jmp.n %r10 */ ++ tramp[3] = 0xf400c40a; ++ /* or %r13, %r13, %lo16(closure) */ ++ tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff); ++ ++ ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} +diff --git a/js/src/ctypes/libffi/src/m88k/ffitarget.h b/js/src/ctypes/libffi/src/m88k/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/m88k/ffitarget.h +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (c) 2013 Miodrag Vallat. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * ``Software''), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/* ++ * m88k Foreign Function Interface ++ */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_OBSD, ++ FFI_DEFAULT_ABI = FFI_OBSD, ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++#endif ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 0x14 ++#define FFI_NATIVE_RAW_API 0 ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/m88k/obsd.S b/js/src/ctypes/libffi/src/m88k/obsd.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/m88k/obsd.S +@@ -0,0 +1,209 @@ ++/* ++ * Copyright (c) 2013 Miodrag Vallat. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * ``Software''), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/* ++ * m88k Foreign Function Interface ++ */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .text ++ ++/* ++ * ffi_cacheflush_OBSD(unsigned int addr, %r2 ++ * unsigned int size); %r3 ++ */ ++ .align 4 ++ .globl ffi_cacheflush_OBSD ++ .type ffi_cacheflush_OBSD,@function ++ffi_cacheflush_OBSD: ++ tb0 0, %r0, 451 ++ or %r0, %r0, %r0 ++ jmp %r1 ++ .size ffi_cacheflush_OBSD, . - ffi_cacheflush_OBSD ++ ++/* ++ * ffi_call_OBSD(unsigned bytes, %r2 ++ * extended_cif *ecif, %r3 ++ * unsigned flags, %r4 ++ * void *rvalue, %r5 ++ * void (*fn)()); %r6 ++ */ ++ .align 4 ++ .globl ffi_call_OBSD ++ .type ffi_call_OBSD,@function ++ffi_call_OBSD: ++ subu %r31, %r31, 32 ++ st %r30, %r31, 4 ++ st %r1, %r31, 0 ++ addu %r30, %r31, 32 ++ ++ | Save the few arguments we'll need after ffi_prep_args() ++ st.d %r4, %r31, 8 ++ st %r6, %r31, 16 ++ ++ | Allocate room for the image of r2-r9, and the stack space for ++ | the args (rounded to a 16-byte boundary) ++ addu %r2, %r2, (8 * 4) + 15 ++ clr %r2, %r2, 4<0> ++ subu %r31, %r31, %r2 ++ ++ | Fill register and stack image ++ or %r2, %r31, %r0 ++#ifdef PIC ++ bsr ffi_prep_args#plt ++#else ++ bsr ffi_prep_args ++#endif ++ ++ | Save pointer to return struct address, if any ++ or %r12, %r2, %r0 ++ ++ | Get function pointer ++ subu %r4, %r30, 32 ++ ld %r1, %r4, 16 ++ ++ | Fetch the register arguments ++ ld.d %r2, %r31, (0 * 4) ++ ld.d %r4, %r31, (2 * 4) ++ ld.d %r6, %r31, (4 * 4) ++ ld.d %r8, %r31, (6 * 4) ++ addu %r31, %r31, (8 * 4) ++ ++ | Invoke the function ++ jsr %r1 ++ ++ | Restore stack now that we don't need the args anymore ++ subu %r31, %r30, 32 ++ ++ | Figure out what to return as the function's return value ++ ld %r5, %r31, 12 | rvalue ++ ld %r4, %r31, 8 | flags ++ ++ bcnd eq0, %r5, 9f ++ ++ bb0 0, %r4, 1f | CIF_FLAGS_INT ++ st %r2, %r5, 0 ++ br 9f ++ ++1: ++ bb0 1, %r4, 1f | CIF_FLAGS_DINT ++ st.d %r2, %r5, 0 ++ br 9f ++ ++1: ++9: ++ ld %r1, %r31, 0 ++ ld %r30, %r31, 4 ++ jmp.n %r1 ++ addu %r31, %r31, 32 ++ .size ffi_call_OBSD, . - ffi_call_OBSD ++ ++/* ++ * ffi_closure_OBSD(ffi_closure *closure); %r13 ++ */ ++ .align 4 ++ .globl ffi_closure_OBSD ++ .type ffi_closure_OBSD, @function ++ffi_closure_OBSD: ++ subu %r31, %r31, 16 ++ st %r30, %r31, 4 ++ st %r1, %r31, 0 ++ addu %r30, %r31, 16 ++ ++ | Make room on the stack for saved register arguments and return ++ | value ++ subu %r31, %r31, (8 * 4) + (2 * 4) ++ st.d %r2, %r31, (0 * 4) ++ st.d %r4, %r31, (2 * 4) ++ st.d %r6, %r31, (4 * 4) ++ st.d %r8, %r31, (6 * 4) ++ ++ | Invoke the closure function ++ or %r5, %r30, 0 | calling stack ++ addu %r4, %r31, 0 | saved registers ++ addu %r3, %r31, (8 * 4) | return value ++ or %r2, %r13, %r0 | closure ++#ifdef PIC ++ bsr ffi_closure_OBSD_inner#plt ++#else ++ bsr ffi_closure_OBSD_inner ++#endif ++ ++ | Figure out what to return as the function's return value ++ bb0 0, %r2, 1f | CIF_FLAGS_INT ++ ld %r2, %r31, (8 * 4) ++ br 9f ++ ++1: ++ bb0 1, %r2, 1f | CIF_FLAGS_DINT ++ ld.d %r2, %r31, (8 * 4) ++ br 9f ++ ++1: ++9: ++ subu %r31, %r30, 16 ++ ld %r1, %r31, 0 ++ ld %r30, %r31, 4 ++ jmp.n %r1 ++ addu %r31, %r31, 16 ++ .size ffi_closure_OBSD,.-ffi_closure_OBSD ++ ++/* ++ * ffi_closure_struct_OBSD(ffi_closure *closure); %r13 ++ */ ++ .align 4 ++ .globl ffi_closure_struct_OBSD ++ .type ffi_closure_struct_OBSD, @function ++ffi_closure_struct_OBSD: ++ subu %r31, %r31, 16 ++ st %r30, %r31, 4 ++ st %r1, %r31, 0 ++ addu %r30, %r31, 16 ++ ++ | Make room on the stack for saved register arguments ++ subu %r31, %r31, (8 * 4) ++ st.d %r2, %r31, (0 * 4) ++ st.d %r4, %r31, (2 * 4) ++ st.d %r6, %r31, (4 * 4) ++ st.d %r8, %r31, (6 * 4) ++ ++ | Invoke the closure function ++ or %r5, %r30, 0 | calling stack ++ addu %r4, %r31, 0 | saved registers ++ or %r3, %r12, 0 | return value ++ or %r2, %r13, %r0 | closure ++#ifdef PIC ++ bsr ffi_closure_OBSD_inner#plt ++#else ++ bsr ffi_closure_OBSD_inner ++#endif ++ ++ subu %r31, %r30, 16 ++ ld %r1, %r31, 0 ++ ld %r30, %r31, 4 ++ jmp.n %r1 ++ addu %r31, %r31, 16 ++ .size ffi_closure_struct_OBSD,.-ffi_closure_struct_OBSD +diff --git a/js/src/ctypes/libffi/src/metag/ffi.c b/js/src/ctypes/libffi/src/metag/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/metag/ffi.c +@@ -0,0 +1,330 @@ ++/* ---------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2013 Imagination Technologies ++ ++ Meta Foreign Function Interface ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ `Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED `AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++#define MIN(a,b) (((a) < (b)) ? (a) : (b)) ++ ++/* ++ * ffi_prep_args is called by the assembly routine once stack space has been ++ * allocated for the function's arguments ++ */ ++ ++unsigned int ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ /* Store return value */ ++ if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { ++ argp -= 4; ++ *(void **) argp = ecif->rvalue; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ /* point to next location */ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++, p_argv++) ++ { ++ size_t z; ++ ++ /* Move argp to address of argument */ ++ z = (*p_arg)->size; ++ argp -= z; ++ ++ /* Align if necessary */ ++ argp = (char *) ALIGN_DOWN(ALIGN_DOWN(argp, (*p_arg)->alignment), 4); ++ ++ if (z < sizeof(int)) { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ case FFI_TYPE_STRUCT: ++ memcpy(argp, *p_argv, (*p_arg)->size); ++ break; ++ default: ++ FFI_ASSERT(0); ++ } ++ } else if ( z == sizeof(int)) { ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ } else { ++ memcpy(argp, *p_argv, z); ++ } ++ } ++ ++ /* return the size of the arguments to be passed in registers, ++ padded to an 8 byte boundary to preserve stack alignment */ ++ return ALIGN(MIN(stack - argp, 6*4), 8); ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ ffi_type **ptr; ++ unsigned i, bytes = 0; ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { ++ if ((*ptr)->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += ALIGN((*ptr)->size, 4); ++ } ++ ++ /* Ensure arg space is aligned to an 8-byte boundary */ ++ bytes = ALIGN(bytes, 8); ++ ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT) { ++ bytes += sizeof(void*); ++ ++ /* Ensure stack is aligned to an 8-byte boundary */ ++ bytes = ALIGN(bytes, 8); ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) { ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ cif->flags = (unsigned) FFI_TYPE_SINT64; ++ break; ++ case FFI_TYPE_STRUCT: ++ /* Meta can store return values which are <= 64 bits */ ++ if (cif->rtype->size <= 4) ++ /* Returned to D0Re0 as 32-bit value */ ++ cif->flags = (unsigned)FFI_TYPE_INT; ++ else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8)) ++ /* Returned valued is stored to D1Re0|R0Re0 */ ++ cif->flags = (unsigned)FFI_TYPE_DOUBLE; ++ else ++ /* value stored in memory */ ++ cif->flags = (unsigned)FFI_TYPE_STRUCT; ++ break; ++ default: ++ cif->flags = (unsigned)FFI_TYPE_INT; ++ break; ++ } ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*fn)(void), extended_cif *, unsigned, unsigned, double *); ++ ++/* ++ * Exported in API. Entry point ++ * cif -> ffi_cif object ++ * fn -> function pointer ++ * rvalue -> pointer to return value ++ * avalue -> vector of void * pointers pointing to memory locations holding the ++ * arguments ++ */ ++void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT)); ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ double temp; ++ ++ /* ++ * If the return value is a struct and we don't have a return value address ++ * then we need to make one ++ */ ++ ++ if ((rvalue == NULL ) && (cif->flags == FFI_TYPE_STRUCT)) ++ ecif.rvalue = alloca(cif->rtype->size); ++ else if (small_struct) ++ ecif.rvalue = &temp; ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) { ++ case FFI_SYSV: ++ ffi_call_SYSV(fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); ++ break; ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ if (small_struct) ++ memcpy (rvalue, &temp, cif->rtype->size); ++} ++ ++/* private members */ ++ ++static void ffi_prep_incoming_args_SYSV (char *, void **, void **, ++ ffi_cif*, float *); ++ ++void ffi_closure_SYSV (ffi_closure *); ++ ++/* Do NOT change that without changing the FFI_TRAMPOLINE_SIZE */ ++extern unsigned int ffi_metag_trampoline[10]; /* 10 instructions */ ++ ++/* end of private members */ ++ ++/* ++ * __tramp: trampoline memory location ++ * __fun: assembly routine ++ * __ctx: memory location for wrapper ++ * ++ * At this point, tramp[0] == __ctx ! ++ */ ++void ffi_init_trampoline(unsigned char *__tramp, unsigned int __fun, unsigned int __ctx) { ++ memcpy (__tramp, ffi_metag_trampoline, sizeof(ffi_metag_trampoline)); ++ *(unsigned int*) &__tramp[40] = __ctx; ++ *(unsigned int*) &__tramp[44] = __fun; ++ /* This will flush the instruction cache */ ++ __builtin_meta2_cachewd(&__tramp[0], 1); ++ __builtin_meta2_cachewd(&__tramp[47], 1); ++} ++ ++ ++ ++/* the cif must already be prepared */ ++ ++ffi_status ++ffi_prep_closure_loc (ffi_closure *closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ void (*closure_func)(ffi_closure*) = NULL; ++ ++ if (cif->abi == FFI_SYSV) ++ closure_func = &ffi_closure_SYSV; ++ else ++ return FFI_BAD_ABI; ++ ++ ffi_init_trampoline( ++ (unsigned char*)&closure->tramp[0], ++ (unsigned int)closure_func, ++ (unsigned int)codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++ ++/* This function is jumped to by the trampoline */ ++unsigned int ffi_closure_SYSV_inner (closure, respp, args, vfp_args) ++ ffi_closure *closure; ++ void **respp; ++ void *args; ++ void *vfp_args; ++{ ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* ++ * This call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. ++ */ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); ++ ++ (closure->fun) ( cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, ++ void **avalue, ffi_cif *cif, ++ float *vfp_stack) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ /* stack points to original arguments */ ++ argp = stack; ++ ++ /* Store return value */ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ argp -= 4; ++ *rvalue = *(void **) argp; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { ++ size_t z; ++ size_t alignment; ++ ++ alignment = (*p_arg)->alignment; ++ if (alignment < 4) ++ alignment = 4; ++ if ((alignment - 1) & (unsigned)argp) ++ argp = (char *) ALIGN(argp, alignment); ++ ++ z = (*p_arg)->size; ++ *p_argv = (void*) argp; ++ p_argv++; ++ argp -= z; ++ } ++ return; ++} +diff --git a/js/src/ctypes/libffi/src/metag/ffitarget.h b/js/src/ctypes/libffi/src/metag/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/metag/ffitarget.h +@@ -0,0 +1,53 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd. ++ Target configuration macros for Meta ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_SYSV, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1, ++} ffi_abi; ++#endif ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 48 ++#define FFI_NATIVE_RAW_API 0 ++ ++#endif ++ +diff --git a/js/src/ctypes/libffi/src/metag/sysv.S b/js/src/ctypes/libffi/src/metag/sysv.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/metag/sysv.S +@@ -0,0 +1,311 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2013 Imagination Technologies Ltd. ++ ++ Meta Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#include ++#ifdef HAVE_MACHINE_ASM_H ++#include ++#else ++#ifdef __USER_LABEL_PREFIX__ ++#define CONCAT1(a, b) CONCAT2(a, b) ++#define CONCAT2(a, b) a ## b ++ ++/* Use the right prefix for global labels. */ ++#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) ++#else ++#define CNAME(x) x ++#endif ++#define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x): ++#endif ++ ++#ifdef __ELF__ ++#define LSYM(x) .x ++#else ++#define LSYM(x) x ++#endif ++ ++.macro call_reg x= ++ .text ++ .balign 4 ++ mov D1RtP, \x ++ swap D1RtP, PC ++.endm ++ ++! Save register arguments ++.macro SAVE_ARGS ++ .text ++ .balign 4 ++ setl [A0StP++], D0Ar6, D1Ar5 ++ setl [A0StP++], D0Ar4, D1Ar3 ++ setl [A0StP++], D0Ar2, D1Ar1 ++.endm ++ ++! Save retrun, frame pointer and other regs ++.macro SAVE_REGS regs= ++ .text ++ .balign 4 ++ setl [A0StP++], D0FrT, D1RtP ++ ! Needs to be a pair of regs ++ .ifnc "\regs","" ++ setl [A0StP++], \regs ++ .endif ++.endm ++ ++! Declare a global function ++.macro METAG_FUNC_START name ++ .text ++ .balign 4 ++ ENTRY(\name) ++.endm ++ ++! Return registers from the stack. Reverse SAVE_REGS operation ++.macro RET_REGS regs=, cond= ++ .ifnc "\regs", "" ++ getl \regs, [--A0StP] ++ .endif ++ getl D0FrT, D1RtP, [--A0StP] ++.endm ++ ++! Return arguments ++.macro RET_ARGS ++ getl D0Ar2, D1Ar1, [--A0StP] ++ getl D0Ar4, D1Ar3, [--A0StP] ++ getl D0Ar6, D1Ar5, [--A0StP] ++.endm ++ ++ ++ ! D1Ar1: fn ++ ! D0Ar2: &ecif ++ ! D1Ar3: cif->bytes ++ ! D0Ar4: fig->flags ++ ! D1Ar5: ecif.rvalue ++ ++ ! This assumes we are using GNU as ++METAG_FUNC_START ffi_call_SYSV ++ ! Save argument registers ++ ++ SAVE_ARGS ++ ++ ! new frame ++ mov D0FrT, A0FrP ++ add A0FrP, A0StP, #0 ++ ++ ! Preserve the old frame pointer ++ SAVE_REGS "D1.5, D0.5" ++ ++ ! Make room for new args. cifs->bytes is the total space for input ++ ! and return arguments ++ ++ add A0StP, A0StP, D1Ar3 ++ ++ ! Preserve cifs->bytes & fn ++ mov D0.5, D1Ar3 ++ mov D1.5, D1Ar1 ++ ++ ! Place all of the ffi_prep_args in position ++ mov D1Ar1, A0StP ++ ++ ! Call ffi_prep_args(stack, &ecif) ++#ifdef __PIC__ ++ callr D1RtP, CNAME(ffi_prep_args@PLT) ++#else ++ callr D1RtP, CNAME(ffi_prep_args) ++#endif ++ ++ ! Restore fn pointer ++ ++ ! The foreign stack should look like this ++ ! XXXXX XXXXXX <--- stack pointer ++ ! FnArgN rvalue ++ ! FnArgN+2 FnArgN+1 ++ ! FnArgN+4 FnArgN+3 ++ ! .... ++ ! ++ ++ ! A0StP now points to the first (or return) argument + 4 ++ ++ ! Preserve cif->bytes ++ getl D0Ar2, D1Ar1, [--A0StP] ++ getl D0Ar4, D1Ar3, [--A0StP] ++ getl D0Ar6, D1Ar5, [--A0StP] ++ ++ ! Place A0StP to the first argument again ++ add A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each ++ ++ ! A0FrP points to the initial stack without the reserved space for the ++ ! cifs->bytes, whilst A0StP points to the stack after the space allocation ++ ++ ! fn was the first argument of ffi_call_SYSV. ++ ! The stack at this point looks like this: ++ ! ++ ! A0StP(on entry to _SYSV) -> Arg6 Arg5 | low ++ ! Arg4 Arg3 | ++ ! Arg2 Arg1 | ++ ! A0FrP ----> D0FrtP D1RtP | ++ ! D1.5 D0.5 | ++ ! A0StP(bf prep_args) -> FnArgn FnArgn-1 | ++ ! FnArgn-2FnArgn-3 | ++ ! ................ | <= cifs->bytes ++ ! FnArg4 FnArg3 | ++ ! A0StP (prv_A0StP+cifs->bytes) FnArg2 FnArg1 | high ++ ! ++ ! fn was in Arg1 so it's located in in A0FrP+#-0xC ++ ! ++ ++ ! D0Re0 contains the size of arguments stored in registers ++ sub A0StP, A0StP, D0Re0 ++ ++ ! Arg1 is the function pointer for the foreign call. This has been ++ ! preserved in D1.5 ++ ++ ! Time to call (fn). Arguments should be like this: ++ ! Arg1-Arg6 are loaded to regs ++ ! The rest of the arguments are stored in stack pointed by A0StP ++ ++ call_reg D1.5 ++ ++ ! Reset stack. ++ ++ mov A0StP, A0FrP ++ ++ ! Load Arg1 with the pointer to storage for the return type ++ ! This was stored in Arg5 ++ ++ getd D1Ar1, [A0FrP+#-20] ++ ++ ! Load D0Ar2 with the return type code. This was stored in Arg4 (flags) ++ ++ getd D0Ar2, [A0FrP+#-16] ++ ++ ! We are ready to start processing the return value ++ ! D0Re0 (and D1Re0) hold the return value ++ ++ ! If the return value is NULL, assume no return value ++ cmp D1Ar1, #0 ++ beq LSYM(Lepilogue) ++ ++ ! return INT ++ cmp D0Ar2, #FFI_TYPE_INT ++ ! Sadly, there is no setd{cc} instruction so we need to workaround that ++ bne .INT64 ++ setd [D1Ar1], D0Re0 ++ b LSYM(Lepilogue) ++ ++ ! return INT64 ++.INT64: ++ cmp D0Ar2, #FFI_TYPE_SINT64 ++ setleq [D1Ar1], D0Re0, D1Re0 ++ ++ ! return DOUBLE ++ cmp D0Ar2, #FFI_TYPE_DOUBLE ++ setl [D1AR1++], D0Re0, D1Re0 ++ ++LSYM(Lepilogue): ++ ! At this point, the stack pointer points right after the argument ++ ! saved area. We need to restore 4 regs, therefore we need to move ++ ! 16 bytes ahead. ++ add A0StP, A0StP, #16 ++ RET_REGS "D1.5, D0.5" ++ RET_ARGS ++ getd D0Re0, [A0StP] ++ mov A0FrP, D0FrT ++ swap D1RtP, PC ++ ++.ffi_call_SYSV_end: ++ .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) ++ ++ ++/* ++ (called by ffi_metag_trampoline) ++ void ffi_closure_SYSV (ffi_closure*) ++ ++ (called by ffi_closure_SYSV) ++ unsigned int FFI_HIDDEN ++ ffi_closure_SYSV_inner (closure,respp, args) ++ ffi_closure *closure; ++ void **respp; ++ void *args; ++*/ ++ ++METAG_FUNC_START ffi_closure_SYSV ++ ! We assume that D1Ar1 holds the address of the ++ ! ffi_closure struct. We will use that to fetch the ++ ! arguments. The stack pointer points to an empty space ++ ! and it is ready to store more data. ++ ++ ! D1Ar1 is ready ++ ! Allocate stack space for return value ++ add A0StP, A0StP, #8 ++ ! Store it to D0Ar2 ++ sub D0Ar2, A0StP, #8 ++ ++ sub D1Ar3, A0FrP, #4 ++ ++ ! D1Ar3 contains the address of the original D1Ar1 argument ++ ! We need to subtract #4 later on ++ ++ ! Preverve D0Ar2 ++ mov D0.5, D0Ar2 ++ ++#ifdef __PIC__ ++ callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT) ++#else ++ callr D1RtP, CNAME(ffi_closure_SYSV_inner) ++#endif ++ ++ ! Check the return value and store it to D0.5 ++ cmp D0Re0, #FFI_TYPE_INT ++ beq .Lretint ++ cmp D0Re0, #FFI_TYPE_DOUBLE ++ beq .Lretdouble ++.Lclosure_epilogue: ++ sub A0StP, A0StP, #8 ++ RET_REGS "D1.5, D0.5" ++ RET_ARGS ++ swap D1RtP, PC ++ ++.Lretint: ++ setd [D0.5], D0Re0 ++ b .Lclosure_epilogue ++.Lretdouble: ++ setl [D0.5++], D0Re0, D1Re0 ++ b .Lclosure_epilogue ++.ffi_closure_SYSV_end: ++.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) ++ ++ ++ENTRY(ffi_metag_trampoline) ++ SAVE_ARGS ++ ! New frame ++ mov A0FrP, A0StP ++ SAVE_REGS "D1.5, D0.5" ++ mov D0.5, PC ++ ! Load D1Ar1 the value of ffi_metag_trampoline ++ getd D1Ar1, [D0.5 + #8] ++ ! Jump to ffi_closure_SYSV ++ getd PC, [D0.5 + #12] +diff --git a/js/src/ctypes/libffi/src/microblaze/ffi.c b/js/src/ctypes/libffi/src/microblaze/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/microblaze/ffi.c +@@ -0,0 +1,321 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc ++ ++ MicroBlaze Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*, ++ unsigned int, unsigned int, unsigned int*, void (*fn)(void), ++ unsigned int, unsigned int); ++ ++extern void ffi_closure_SYSV(void); ++ ++#define WORD_SIZE sizeof(unsigned int) ++#define ARGS_REGISTER_SIZE (WORD_SIZE * 6) ++#define WORD_ALIGN(x) ALIGN(x, WORD_SIZE) ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++void ffi_prep_args(void* stack, extended_cif* ecif) ++{ ++ unsigned int i; ++ ffi_type** p_arg; ++ void** p_argv; ++ void* stack_args_p = stack; ++ ++ p_argv = ecif->avalue; ++ ++ if (ecif == NULL || ecif->cif == NULL) { ++ return; /* no description to prepare */ ++ } ++ ++ if ((ecif->cif->rtype != NULL) && ++ (ecif->cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /* if return type is a struct which is referenced on the stack/reg5, ++ * by a pointer. Stored the return value pointer in r5. ++ */ ++ char* addr = stack_args_p; ++ memcpy(addr, &(ecif->rvalue), WORD_SIZE); ++ stack_args_p += WORD_SIZE; ++ } ++ ++ if (ecif->avalue == NULL) { ++ return; /* no arguments to prepare */ ++ } ++ ++ for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; ++ i++, p_arg++) ++ { ++ size_t size = (*p_arg)->size; ++ int type = (*p_arg)->type; ++ void* value = p_argv[i]; ++ char* addr = stack_args_p; ++ int aligned_size = WORD_ALIGN(size); ++ ++ /* force word alignment on the stack */ ++ stack_args_p += aligned_size; ++ ++ switch (type) ++ { ++ case FFI_TYPE_UINT8: ++ *(unsigned int *)addr = (unsigned int)*(UINT8*)(value); ++ break; ++ case FFI_TYPE_SINT8: ++ *(signed int *)addr = (signed int)*(SINT8*)(value); ++ break; ++ case FFI_TYPE_UINT16: ++ *(unsigned int *)addr = (unsigned int)*(UINT16*)(value); ++ break; ++ case FFI_TYPE_SINT16: ++ *(signed int *)addr = (signed int)*(SINT16*)(value); ++ break; ++ case FFI_TYPE_STRUCT: ++#if __BIG_ENDIAN__ ++ /* ++ * MicroBlaze toolchain appears to emit: ++ * bsrli r5, r5, 8 (caller) ++ * ... ++ * ++ * ... ++ * bslli r5, r5, 8 (callee) ++ * ++ * For structs like "struct a { uint8_t a[3]; };", when passed ++ * by value. ++ * ++ * Structs like "struct b { uint16_t a; };" are also expected ++ * to be packed strangely in registers. ++ * ++ * This appears to be because the microblaze toolchain expects ++ * "struct b == uint16_t", which is only any issue for big ++ * endian. ++ * ++ * The following is a work around for big-endian only, for the ++ * above mentioned case, it will re-align the contents of a ++ * <= 3-byte struct value. ++ */ ++ if (size < WORD_SIZE) ++ { ++ memcpy (addr + (WORD_SIZE - size), value, size); ++ break; ++ } ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_DOUBLE: ++ default: ++ memcpy(addr, value, aligned_size); ++ } ++ } ++} ++ ++ffi_status ffi_prep_cif_machdep(ffi_cif* cif) ++{ ++ /* check ABI */ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ break; ++ default: ++ return FFI_BAD_ABI; ++ } ++ return FFI_OK; ++} ++ ++void ffi_call(ffi_cif* cif, void (*fn)(void), void* rvalue, void** avalue) ++{ ++ extended_cif ecif; ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } else { ++ ecif.rvalue = rvalue; ++ } ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn, cif->rtype->type, cif->rtype->size); ++ break; ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++void ffi_closure_call_SYSV(void* register_args, void* stack_args, ++ ffi_closure* closure, void* rvalue, ++ unsigned int* rtype, unsigned int* rsize) ++{ ++ /* prepare arguments for closure call */ ++ ffi_cif* cif = closure->cif; ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* re-allocate data for the args. This needs to be done in order to keep ++ * multi-word objects (e.g. structs) in contiguous memory. Callers are not ++ * required to store the value of args in the lower 6 words in the stack ++ * (although they are allocated in the stack). ++ */ ++ char* stackclone = alloca(cif->bytes); ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ void* struct_rvalue = NULL; ++ char* ptr = stackclone; ++ int i; ++ ++ /* copy registers into stack clone */ ++ int registers_used = cif->bytes; ++ if (registers_used > ARGS_REGISTER_SIZE) { ++ registers_used = ARGS_REGISTER_SIZE; ++ } ++ memcpy(stackclone, register_args, registers_used); ++ ++ /* copy stack allocated args into stack clone */ ++ if (cif->bytes > ARGS_REGISTER_SIZE) { ++ int stack_used = cif->bytes - ARGS_REGISTER_SIZE; ++ memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used); ++ } ++ ++ /* preserve struct type return pointer passing */ ++ if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ++ struct_rvalue = *((void**)ptr); ++ ptr += WORD_SIZE; ++ } ++ ++ /* populate arg pointer list */ ++ for (i = 0; i < cif->nargs; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++#ifdef __BIG_ENDIAN__ ++ avalue[i] = ptr + 3; ++#else ++ avalue[i] = ptr; ++#endif ++ break; ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++#ifdef __BIG_ENDIAN__ ++ avalue[i] = ptr + 2; ++#else ++ avalue[i] = ptr; ++#endif ++ break; ++ case FFI_TYPE_STRUCT: ++#if __BIG_ENDIAN__ ++ /* ++ * Work around strange ABI behaviour. ++ * (see info in ffi_prep_args) ++ */ ++ if (arg_types[i]->size < WORD_SIZE) ++ { ++ memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size); ++ } ++#endif ++ avalue[i] = (void*)ptr; ++ break; ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ avalue[i] = ptr; ++ break; ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_FLOAT: ++ default: ++ /* default 4-byte argument */ ++ avalue[i] = ptr; ++ break; ++ } ++ ptr += WORD_ALIGN(arg_types[i]->size); ++ } ++ ++ /* set the return type info passed back to the wrapper */ ++ *rsize = cif->rtype->size; ++ *rtype = cif->rtype->type; ++ if (struct_rvalue != NULL) { ++ closure->fun(cif, struct_rvalue, avalue, closure->user_data); ++ /* copy struct return pointer value into function return value */ ++ *((void**)rvalue) = struct_rvalue; ++ } else { ++ closure->fun(cif, rvalue, avalue, closure->user_data); ++ } ++} ++ ++ffi_status ffi_prep_closure_loc( ++ ffi_closure* closure, ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data, void* codeloc) ++{ ++ unsigned long* tramp = (unsigned long*)&(closure->tramp[0]); ++ unsigned long cls = (unsigned long)codeloc; ++ unsigned long fn = 0; ++ unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV; ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ fn = (unsigned long)ffi_closure_SYSV; ++ ++ /* load r11 (temp) with fn */ ++ /* imm fn(upper) */ ++ tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff); ++ /* addik r11, r0, fn(lower) */ ++ tramp[1] = 0x31600000 | (fn & 0xffff); ++ ++ /* load r12 (temp) with cls */ ++ /* imm cls(upper) */ ++ tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff); ++ /* addik r12, r0, cls(lower) */ ++ tramp[3] = 0x31800000 | (cls & 0xffff); ++ ++ /* load r3 (temp) with ffi_closure_call_SYSV */ ++ /* imm fn_closure_call_sysv(upper) */ ++ tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff); ++ /* addik r3, r0, fn_closure_call_sysv(lower) */ ++ tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff); ++ /* branch/jump to address stored in r11 (fn) */ ++ tramp[6] = 0x98085800; /* bra r11 */ ++ ++ break; ++ default: ++ return FFI_BAD_ABI; ++ } ++ return FFI_OK; ++} +diff --git a/js/src/ctypes/libffi/src/microblaze/ffitarget.h b/js/src/ctypes/libffi/src/microblaze/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/microblaze/ffitarget.h +@@ -0,0 +1,53 @@ ++/* ----------------------------------------------------------------------- ++ ffitarget.h - Copyright (c) 2012, 2013 Xilinx, Inc ++ ++ Target configuration macros for MicroBlaze. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_SYSV, ++ FFI_LAST_ABI, ++ FFI_DEFAULT_ABI = FFI_SYSV ++} ffi_abi; ++#endif ++ ++/* Definitions for closures */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++#define FFI_TRAMPOLINE_SIZE (4*8) ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/microblaze/sysv.S b/js/src/ctypes/libffi/src/microblaze/sysv.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/microblaze/sysv.S +@@ -0,0 +1,302 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2012, 2013 Xilinx, Inc ++ ++ MicroBlaze Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++ /* ++ * arg[0] (r5) = ffi_prep_args, ++ * arg[1] (r6) = &ecif, ++ * arg[2] (r7) = cif->bytes, ++ * arg[3] (r8) = cif->flags, ++ * arg[4] (r9) = ecif.rvalue, ++ * arg[5] (r10) = fn ++ * arg[6] (sp[0]) = cif->rtype->type ++ * arg[7] (sp[4]) = cif->rtype->size ++ */ ++ .text ++ .globl ffi_call_SYSV ++ .type ffi_call_SYSV, @function ++ffi_call_SYSV: ++ /* push callee saves */ ++ addik r1, r1, -20 ++ swi r19, r1, 0 /* Frame Pointer */ ++ swi r20, r1, 4 /* PIC register */ ++ swi r21, r1, 8 /* PIC register */ ++ swi r22, r1, 12 /* save for locals */ ++ swi r23, r1, 16 /* save for locals */ ++ ++ /* save the r5-r10 registers in the stack */ ++ addik r1, r1, -24 /* increment sp to store 6x 32-bit words */ ++ swi r5, r1, 0 ++ swi r6, r1, 4 ++ swi r7, r1, 8 ++ swi r8, r1, 12 ++ swi r9, r1, 16 ++ swi r10, r1, 20 ++ ++ /* save function pointer */ ++ addik r3, r5, 0 /* copy ffi_prep_args into r3 */ ++ addik r22, r1, 0 /* save sp for unallocated args into r22 (callee-saved) */ ++ addik r23, r10, 0 /* save function address into r23 (callee-saved) */ ++ ++ /* prepare stack with allocation for n (bytes = r7) args */ ++ rsub r1, r7, r1 /* subtract bytes from sp */ ++ ++ /* prep args for ffi_prep_args call */ ++ addik r5, r1, 0 /* store stack pointer into arg[0] */ ++ /* r6 still holds ecif for arg[1] */ ++ ++ /* Call ffi_prep_args(stack, &ecif). */ ++ addik r1, r1, -4 ++ swi r15, r1, 0 /* store the link register in the frame */ ++ brald r15, r3 ++ nop /* branch has delay slot */ ++ lwi r15, r1, 0 ++ addik r1, r1, 4 /* restore the link register from the frame */ ++ /* returns calling stack pointer location */ ++ ++ /* prepare args for fn call, prep_args populates them onto the stack */ ++ lwi r5, r1, 0 /* arg[0] */ ++ lwi r6, r1, 4 /* arg[1] */ ++ lwi r7, r1, 8 /* arg[2] */ ++ lwi r8, r1, 12 /* arg[3] */ ++ lwi r9, r1, 16 /* arg[4] */ ++ lwi r10, r1, 20 /* arg[5] */ ++ ++ /* call (fn) (...). */ ++ addik r1, r1, -4 ++ swi r15, r1, 0 /* store the link register in the frame */ ++ brald r15, r23 ++ nop /* branch has delay slot */ ++ lwi r15, r1, 0 ++ addik r1, r1, 4 /* restore the link register from the frame */ ++ ++ /* Remove the space we pushed for the args. */ ++ addik r1, r22, 0 /* restore old SP */ ++ ++ /* restore this functions parameters */ ++ lwi r5, r1, 0 /* arg[0] */ ++ lwi r6, r1, 4 /* arg[1] */ ++ lwi r7, r1, 8 /* arg[2] */ ++ lwi r8, r1, 12 /* arg[3] */ ++ lwi r9, r1, 16 /* arg[4] */ ++ lwi r10, r1, 20 /* arg[5] */ ++ addik r1, r1, 24 /* decrement sp to de-allocate 6x 32-bit words */ ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ beqi r9, ffi_call_SYSV_end ++ ++ lwi r22, r1, 48 /* get return type (20 for locals + 28 for arg[6]) */ ++ lwi r23, r1, 52 /* get return size (20 for locals + 32 for arg[7]) */ ++ ++ /* Check if return type is actually a struct, do nothing */ ++ rsubi r11, r22, FFI_TYPE_STRUCT ++ beqi r11, ffi_call_SYSV_end ++ ++ /* Return 8bit */ ++ rsubi r11, r23, 1 ++ beqi r11, ffi_call_SYSV_store8 ++ ++ /* Return 16bit */ ++ rsubi r11, r23, 2 ++ beqi r11, ffi_call_SYSV_store16 ++ ++ /* Return 32bit */ ++ rsubi r11, r23, 4 ++ beqi r11, ffi_call_SYSV_store32 ++ ++ /* Return 64bit */ ++ rsubi r11, r23, 8 ++ beqi r11, ffi_call_SYSV_store64 ++ ++ /* Didn't match anything */ ++ bri ffi_call_SYSV_end ++ ++ffi_call_SYSV_store64: ++ swi r3, r9, 0 /* store word r3 into return value */ ++ swi r4, r9, 4 /* store word r4 into return value */ ++ bri ffi_call_SYSV_end ++ ++ffi_call_SYSV_store32: ++ swi r3, r9, 0 /* store word r3 into return value */ ++ bri ffi_call_SYSV_end ++ ++ffi_call_SYSV_store16: ++#ifdef __BIG_ENDIAN__ ++ shi r3, r9, 2 /* store half-word r3 into return value */ ++#else ++ shi r3, r9, 0 /* store half-word r3 into return value */ ++#endif ++ bri ffi_call_SYSV_end ++ ++ffi_call_SYSV_store8: ++#ifdef __BIG_ENDIAN__ ++ sbi r3, r9, 3 /* store byte r3 into return value */ ++#else ++ sbi r3, r9, 0 /* store byte r3 into return value */ ++#endif ++ bri ffi_call_SYSV_end ++ ++ffi_call_SYSV_end: ++ /* callee restores */ ++ lwi r19, r1, 0 /* frame pointer */ ++ lwi r20, r1, 4 /* PIC register */ ++ lwi r21, r1, 8 /* PIC register */ ++ lwi r22, r1, 12 ++ lwi r23, r1, 16 ++ addik r1, r1, 20 ++ ++ /* return from sub-routine (with delay slot) */ ++ rtsd r15, 8 ++ nop ++ ++ .size ffi_call_SYSV, . - ffi_call_SYSV ++ ++/* ------------------------------------------------------------------------- */ ++ ++ /* ++ * args passed into this function, are passed down to the callee. ++ * this function is the target of the closure trampoline, as such r12 is ++ * a pointer to the closure object. ++ */ ++ .text ++ .globl ffi_closure_SYSV ++ .type ffi_closure_SYSV, @function ++ffi_closure_SYSV: ++ /* push callee saves */ ++ addik r11, r1, 28 /* save stack args start location (excluding regs/link) */ ++ addik r1, r1, -12 ++ swi r19, r1, 0 /* Frame Pointer */ ++ swi r20, r1, 4 /* PIC register */ ++ swi r21, r1, 8 /* PIC register */ ++ ++ /* store register args on stack */ ++ addik r1, r1, -24 ++ swi r5, r1, 0 ++ swi r6, r1, 4 ++ swi r7, r1, 8 ++ swi r8, r1, 12 ++ swi r9, r1, 16 ++ swi r10, r1, 20 ++ ++ /* setup args */ ++ addik r5, r1, 0 /* register_args */ ++ addik r6, r11, 0 /* stack_args */ ++ addik r7, r12, 0 /* closure object */ ++ addik r1, r1, -8 /* allocate return value */ ++ addik r8, r1, 0 /* void* rvalue */ ++ addik r1, r1, -8 /* allocate for return type/size values */ ++ addik r9, r1, 0 /* void* rtype */ ++ addik r10, r1, 4 /* void* rsize */ ++ ++ /* call the wrap_call function */ ++ addik r1, r1, -28 /* allocate args + link reg */ ++ swi r15, r1, 0 /* store the link register in the frame */ ++ brald r15, r3 ++ nop /* branch has delay slot */ ++ lwi r15, r1, 0 ++ addik r1, r1, 28 /* restore the link register from the frame */ ++ ++ffi_closure_SYSV_prepare_return: ++ lwi r9, r1, 0 /* rtype */ ++ lwi r10, r1, 4 /* rsize */ ++ addik r1, r1, 8 /* de-allocate return info values */ ++ ++ /* Check if return type is actually a struct, store 4 bytes */ ++ rsubi r11, r9, FFI_TYPE_STRUCT ++ beqi r11, ffi_closure_SYSV_store32 ++ ++ /* Return 8bit */ ++ rsubi r11, r10, 1 ++ beqi r11, ffi_closure_SYSV_store8 ++ ++ /* Return 16bit */ ++ rsubi r11, r10, 2 ++ beqi r11, ffi_closure_SYSV_store16 ++ ++ /* Return 32bit */ ++ rsubi r11, r10, 4 ++ beqi r11, ffi_closure_SYSV_store32 ++ ++ /* Return 64bit */ ++ rsubi r11, r10, 8 ++ beqi r11, ffi_closure_SYSV_store64 ++ ++ /* Didn't match anything */ ++ bri ffi_closure_SYSV_end ++ ++ffi_closure_SYSV_store64: ++ lwi r3, r1, 0 /* store word r3 into return value */ ++ lwi r4, r1, 4 /* store word r4 into return value */ ++ /* 64 bits == 2 words, no sign extend occurs */ ++ bri ffi_closure_SYSV_end ++ ++ffi_closure_SYSV_store32: ++ lwi r3, r1, 0 /* store word r3 into return value */ ++ /* 32 bits == 1 word, no sign extend occurs */ ++ bri ffi_closure_SYSV_end ++ ++ffi_closure_SYSV_store16: ++#ifdef __BIG_ENDIAN__ ++ lhui r3, r1, 2 /* store half-word r3 into return value */ ++#else ++ lhui r3, r1, 0 /* store half-word r3 into return value */ ++#endif ++ rsubi r11, r9, FFI_TYPE_SINT16 ++ bnei r11, ffi_closure_SYSV_end ++ sext16 r3, r3 /* fix sign extend of sint8 */ ++ bri ffi_closure_SYSV_end ++ ++ffi_closure_SYSV_store8: ++#ifdef __BIG_ENDIAN__ ++ lbui r3, r1, 3 /* store byte r3 into return value */ ++#else ++ lbui r3, r1, 0 /* store byte r3 into return value */ ++#endif ++ rsubi r11, r9, FFI_TYPE_SINT8 ++ bnei r11, ffi_closure_SYSV_end ++ sext8 r3, r3 /* fix sign extend of sint8 */ ++ bri ffi_closure_SYSV_end ++ ++ffi_closure_SYSV_end: ++ addik r1, r1, 8 /* de-allocate return value */ ++ ++ /* de-allocate stored args */ ++ addik r1, r1, 24 ++ ++ /* callee restores */ ++ lwi r19, r1, 0 /* frame pointer */ ++ lwi r20, r1, 4 /* PIC register */ ++ lwi r21, r1, 8 /* PIC register */ ++ addik r1, r1, 12 ++ ++ /* return from sub-routine (with delay slot) */ ++ rtsd r15, 8 ++ nop ++ ++ .size ffi_closure_SYSV, . - ffi_closure_SYSV +diff --git a/js/src/ctypes/libffi/src/mips/ffi.c b/js/src/ctypes/libffi/src/mips/ffi.c +--- a/js/src/ctypes/libffi/src/mips/ffi.c ++++ b/js/src/ctypes/libffi/src/mips/ffi.c +@@ -1,11 +1,12 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 1996, 2007, 2008 Red Hat, Inc. +- Copyright (c) 2008 David Daney ++ ffi.c - Copyright (c) 2011 Anthony Green ++ Copyright (c) 2008 David Daney ++ Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. + + MIPS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -164,17 +165,24 @@ static void ffi_prep_args(char *stack, + *(ffi_arg *)argp = *(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(ffi_arg *)argp = *(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: ++#ifdef FFI_MIPS_N32 ++ /* The N32 ABI requires that 32-bit integers ++ be sign-extended to 64-bits, regardless of ++ whether they are signed or unsigned. */ ++ *(ffi_arg *)argp = *(SINT32 *)(* p_argv); ++#else + *(ffi_arg *)argp = *(UINT32 *)(* p_argv); ++#endif + break; + + /* This can only happen with 64bit slots. */ + case FFI_TYPE_FLOAT: + *(float *) argp = *(float *)(* p_argv); + break; + + /* Handle structures. */ +@@ -661,20 +669,29 @@ ffi_prep_closure_loc (ffi_closure *closu + void *user_data, + void *codeloc) + { + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + void * fn; + char *clear_location = (char *) codeloc; + + #if defined(FFI_MIPS_O32) +- FFI_ASSERT(cif->abi == FFI_O32 || cif->abi == FFI_O32_SOFT_FLOAT); ++ if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) ++ return FFI_BAD_ABI; + fn = ffi_closure_O32; +-#else /* FFI_MIPS_N32 */ +- FFI_ASSERT(cif->abi == FFI_N32 || cif->abi == FFI_N64); ++#else ++#if _MIPS_SIM ==_ABIN32 ++ if (cif->abi != FFI_N32 ++ && cif->abi != FFI_N32_SOFT_FLOAT) ++ return FFI_BAD_ABI; ++#else ++ if (cif->abi != FFI_N64 ++ && cif->abi != FFI_N64_SOFT_FLOAT) ++ return FFI_BAD_ABI; ++#endif + fn = ffi_closure_N32; + #endif /* FFI_MIPS_O32 */ + + #if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) + /* lui $25,high(fn) */ + tramp[0] = 0x3c190000 | ((unsigned)fn >> 16); + /* ori $25,low(fn) */ + tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff); +diff --git a/js/src/ctypes/libffi/src/mips/ffitarget.h b/js/src/ctypes/libffi/src/mips/ffitarget.h +--- a/js/src/ctypes/libffi/src/mips/ffitarget.h ++++ b/js/src/ctypes/libffi/src/mips/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for MIPS. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,41 +23,53 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #ifdef linux + # include ++#elif defined(__rtems__) ++/* ++ * Subprogram calling convention - copied from sgidefs.h ++ */ ++#define _MIPS_SIM_ABI32 1 ++#define _MIPS_SIM_NABI32 2 ++#define _MIPS_SIM_ABI64 3 + #elif !defined(__OpenBSD__) + # include + #endif ++ + # ifndef _ABIN32 + # define _ABIN32 _MIPS_SIM_NABI32 + # endif + # ifndef _ABI64 + # define _ABI64 _MIPS_SIM_ABI64 + # endif + # ifndef _ABIO32 + # define _ABIO32 _MIPS_SIM_ABI32 + # endif + + #if !defined(_MIPS_SIM) +--- something is very wrong -- ++# error -- something is very wrong -- + #else + # if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) + # define FFI_MIPS_N32 + # else + # if (_MIPS_SIM==_ABIO32 && defined(_ABIO32)) + # define FFI_MIPS_O32 + # else +--- this is an unsupported platform -- ++# error -- this is an unsupported platform -- + # endif + # endif + #endif + + #ifdef FFI_MIPS_O32 + /* O32 stack frames have 32bit integer args */ + # define FFI_SIZEOF_ARG 4 + #else +diff --git a/js/src/ctypes/libffi/src/mips/n32.S b/js/src/ctypes/libffi/src/mips/n32.S +--- a/js/src/ctypes/libffi/src/mips/n32.S ++++ b/js/src/ctypes/libffi/src/mips/n32.S +@@ -38,16 +38,17 @@ + #define raddr a4 + #define fn a5 + + #define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG ) + + #ifdef __GNUC__ + .abicalls + #endif ++ .set mips4 + .text + .align 2 + .globl ffi_call_N32 + .ent ffi_call_N32 + ffi_call_N32: + .LFB3: + .frame $fp, SIZEOF_FRAME, ra + .mask 0xc0000000,-FFI_SIZEOF_ARG +@@ -102,111 +103,95 @@ sixteen: + + ADDU t9, t9, t8 + + loadregs: + + REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. + + and t4, t6, ((1<bytes +- # gr11: fig->flags +- # gr12: ecif.rvalue +- # gr13: fn ++ # $r0 : ffi_prep_args ++ # $r1 : &ecif ++ # $r2 : cif->bytes ++ # $r3 : fig->flags ++ # $r4 : ecif.rvalue ++ # $r5 : fn + +-ffi_call_EABI: +- addi sp, #-80, sp +- sti fp, @(sp, #24) +- addi sp, #24, fp +- movsg lr, gr5 ++ffi_call_EABI: ++ push $sp, $r6 ++ push $sp, $r7 ++ push $sp, $r8 ++ dec $sp, 24 + +- /* Make room for the new arguments. */ +- /* subi sp, fp, gr10 */ +- +- /* Store return address and incoming args on stack. */ +- sti gr5, @(fp, #8) +- sti gr8, @(fp, #-4) +- sti gr9, @(fp, #-8) +- sti gr10, @(fp, #-12) +- sti gr11, @(fp, #-16) +- sti gr12, @(fp, #-20) +- sti gr13, @(fp, #-24) +- +- sub sp, gr10, sp ++ /* Store incoming args on stack. */ ++ sto.l 0($sp), $r0 /* ffi_prep_args */ ++ sto.l 4($sp), $r1 /* ecif */ ++ sto.l 8($sp), $r2 /* bytes */ ++ sto.l 12($sp), $r3 /* flags */ ++ sto.l 16($sp), $r4 /* &rvalue */ ++ sto.l 20($sp), $r5 /* fn */ + + /* Call ffi_prep_args. */ +- ldi @(fp, #-4), gr4 +- addi sp, #0, gr8 +- ldi @(fp, #-8), gr9 +-#ifdef __FRV_FDPIC__ +- ldd @(gr4, gr0), gr14 +- calll @(gr14, gr0) +-#else +- calll @(gr4, gr0) +-#endif ++ mov $r6, $r4 /* Save result buffer */ ++ mov $r7, $r5 /* Save the target fn */ ++ mov $r8, $r3 /* Save the flags */ ++ sub.l $sp, $r2 /* Allocate stack space */ ++ mov $r0, $sp /* We can stomp over $r0 */ ++ /* $r1 is already set up */ ++ jsra ffi_prep_args + +- /* ffi_prep_args returns the new stack pointer. */ +- mov gr8, gr4 +- +- ldi @(sp, #0), gr8 +- ldi @(sp, #4), gr9 +- ldi @(sp, #8), gr10 +- ldi @(sp, #12), gr11 +- ldi @(sp, #16), gr12 +- ldi @(sp, #20), gr13 +- +- /* Always copy the return value pointer into the hidden +- parameter register. This is only strictly necessary +- when we're returning an aggregate type, but it doesn't +- hurt to do this all the time, and it saves a branch. */ +- ldi @(fp, #-20), gr3 +- +- /* Use the ffi_prep_args return value for the new sp. */ +- mov gr4, sp ++ /* Load register arguments. */ ++ ldo.l $r0, 0($sp) ++ ldo.l $r1, 4($sp) ++ ldo.l $r2, 8($sp) ++ ldo.l $r3, 12($sp) ++ ldo.l $r4, 16($sp) ++ ldo.l $r5, 20($sp) + + /* Call the target function. */ +- ldi @(fp, -24), gr4 +-#ifdef __FRV_FDPIC__ +- ldd @(gr4, gr0), gr14 +- calll @(gr14, gr0) +-#else +- calll @(gr4, gr0) +-#endif ++ jsr $r7 + +- /* Store the result. */ +- ldi @(fp, #-16), gr10 /* fig->flags */ +- ldi @(fp, #-20), gr4 /* ecif.rvalue */ ++ ldi.l $r7, 0xffffffff ++ cmp $r8, $r7 ++ beq retstruct + +- /* Is the return value stored in two registers? */ +- cmpi gr10, #8, icc0 +- bne icc0, 0, .L2 +- /* Yes, save them. */ +- sti gr8, @(gr4, #0) +- sti gr9, @(gr4, #4) +- bra .L3 +-.L2: +- /* Is the return value a structure? */ +- cmpi gr10, #-1, icc0 +- beq icc0, 0, .L3 +- /* No, save a 4 byte return value. */ +- sti gr8, @(gr4, #0) +-.L3: ++ ldi.l $r7, 4 ++ cmp $r8, $r7 ++ bgt ret2reg + +- /* Restore the stack, and return. */ +- ldi @(fp, 8), gr5 +- ld @(fp, gr0), fp +- addi sp,#80,sp +- jmpl @(gr5,gr0) ++ st.l ($r6), $r0 ++ jmpa retdone ++ ++ret2reg: ++ st.l ($r6), $r0 ++ sto.l 4($r6), $r1 ++ ++retstruct: ++retdone: ++ /* Return. */ ++ ldo.l $r6, -4($fp) ++ ldo.l $r7, -8($fp) ++ ldo.l $r8, -12($fp) ++ ret + .size ffi_call_EABI, .-ffi_call_EABI + +diff --git a/js/src/ctypes/libffi/src/moxie/ffi.c b/js/src/ctypes/libffi/src/moxie/ffi.c +--- a/js/src/ctypes/libffi/src/moxie/ffi.c ++++ b/js/src/ctypes/libffi/src/moxie/ffi.c +@@ -1,10 +1,10 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (C) 2009 Anthony Green ++ ffi.c - Copyright (C) 2012, 2013 Anthony Green + + Moxie Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -38,40 +38,35 @@ void *ffi_prep_args(char *stack, extende + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + register int count = 0; + + p_argv = ecif->avalue; + argp = stack; + ++ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + z = sizeof(void*); + *(void **) argp = *p_argv; + } +- /* if ((*p_arg)->type == FFI_TYPE_FLOAT) +- { +- if (count > 24) +- { +- // This is going on the stack. Turn it into a double. +- *(double *) argp = (double) *(float*)(* p_argv); +- z = sizeof(double); +- } +- else +- *(void **) argp = *(void **)(* p_argv); +- } */ + else if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; +@@ -142,135 +137,136 @@ void ffi_call(ffi_cif *cif, + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; +- +- ++ + switch (cif->abi) + { + case FFI_EABI: + ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } + } + + void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, + unsigned arg4, unsigned arg5, unsigned arg6) + { + /* This function is called by a trampoline. The trampoline stows a +- pointer to the ffi_closure object in gr7. We must save this ++ pointer to the ffi_closure object in $r7. We must save this + pointer in a place that will persist while we do our work. */ +- register ffi_closure *creg __asm__ ("gr7"); ++ register ffi_closure *creg __asm__ ("$r12"); + ffi_closure *closure = creg; + + /* Arguments that don't fit in registers are found on the stack + at a fixed offset above the current frame pointer. */ +- register char *frame_pointer __asm__ ("fp"); +- char *stack_args = frame_pointer + 16; ++ register char *frame_pointer __asm__ ("$fp"); ++ ++ /* Pointer to a struct return value. */ ++ void *struct_rvalue = (void *) arg1; ++ ++ /* 6 words reserved for register args + 3 words from jsr */ ++ char *stack_args = frame_pointer + 9*4; + + /* Lay the register arguments down in a continuous chunk of memory. */ + unsigned register_args[6] = + { arg1, arg2, arg3, arg4, arg5, arg6 }; ++ char *register_args_ptr = (char *) register_args; + + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + void **avalue = alloca (cif->nargs * sizeof(void *)); + char *ptr = (char *) register_args; + int i; + ++ /* preserve struct type return pointer passing */ ++ if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ++ ptr += 4; ++ register_args_ptr = (char *)®ister_args[1]; ++ } ++ + /* Find the address of each argument. */ + for (i = 0; i < cif->nargs; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = ptr + 3; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = ptr + 2; + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: ++ case FFI_TYPE_POINTER: + avalue[i] = ptr; + break; + case FFI_TYPE_STRUCT: + avalue[i] = *(void**)ptr; + break; + default: + /* This is an 8-byte value. */ + avalue[i] = ptr; + ptr += 4; + break; + } + ptr += 4; + + /* If we've handled more arguments than fit in registers, + start looking at the those passed on the stack. */ +- if (ptr == ((char *)register_args + (6*4))) ++ if (ptr == ®ister_args[6]) + ptr = stack_args; + } + + /* Invoke the closure. */ +- if (cif->rtype->type == FFI_TYPE_STRUCT) ++ if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) + { +- /* The caller allocates space for the return structure, and +- passes a pointer to this space in gr3. Use this value directly +- as the return value. */ +- register void *return_struct_ptr __asm__("gr3"); +- (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data); ++ (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); + } + else + { + /* Allocate space for the return value and call the function. */ + long long rvalue; + (closure->fun) (cif, &rvalue, avalue, closure->user_data); +- +- /* Functions return 4-byte or smaller results in gr8. 8-byte +- values also use gr9. We fill the both, even for small return +- values, just to avoid a branch. */ +- asm ("ldi @(%0, #0), gr8" : : "r" (&rvalue)); +- asm ("ldi @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1])); ++ asm ("mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : : "r" (&rvalue)); + } + } + + ffi_status + ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) + { +- unsigned int *tramp = (unsigned int *) &closure->tramp[0]; ++ unsigned short *tramp = (unsigned short *) &closure->tramp[0]; + unsigned long fn = (long) ffi_closure_eabi; + unsigned long cls = (long) codeloc; +- int i; ++ ++ if (cif->abi != FFI_EABI) ++ return FFI_BAD_ABI; + + fn = (unsigned long) ffi_closure_eabi; + +- tramp[0] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ +- tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ +- tramp[2] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ +- tramp[3] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ +- tramp[4] = 0x80300006; /* jmpl @(gr0, gr6) */ ++ tramp[0] = 0x01e0; /* ldi.l $r7, .... */ ++ tramp[1] = cls >> 16; ++ tramp[2] = cls & 0xffff; ++ tramp[3] = 0x1a00; /* jmpa .... */ ++ tramp[4] = fn >> 16; ++ tramp[5] = fn & 0xffff; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + +- /* Cache flushing. */ +- for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++) +- __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i), +- "r" (codeloc)); +- + return FFI_OK; + } +diff --git a/js/src/ctypes/libffi/src/moxie/ffitarget.h b/js/src/ctypes/libffi/src/moxie/ffitarget.h +--- a/js/src/ctypes/libffi/src/moxie/ffitarget.h ++++ b/js/src/ctypes/libffi/src/moxie/ffitarget.h +@@ -1,10 +1,10 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 2009 Anthony Green ++ ffitarget.h - Copyright (c) 2012, 2013 Anthony Green + Target configuration macros for Moxie + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -31,22 +31,22 @@ + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_EABI, +- FFI_LAST_ABI, +- FFI_DEFAULT_ABI = FFI_EABI ++ FFI_DEFAULT_ABI = FFI_EABI, ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 + } ffi_abi; + #endif + + /* ---- Definitions for closures ----------------------------------------- */ + +-#define FFI_CLOSURES 0 ++#define FFI_CLOSURES 1 + #define FFI_NATIVE_RAW_API 0 + +-/* Trampolines are 5 4-byte instructions long. */ +-#define FFI_TRAMPOLINE_SIZE (5*4) ++/* Trampolines are 12-bytes long. See ffi_prep_closure_loc. */ ++#define FFI_TRAMPOLINE_SIZE (12) + + #endif +diff --git a/js/src/ctypes/libffi/src/nios2/ffi.c b/js/src/ctypes/libffi/src/nios2/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/nios2/ffi.c +@@ -0,0 +1,304 @@ ++/* libffi support for Altera Nios II. ++ ++ Copyright (c) 2013 Mentor Graphics. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be ++ included in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ ++ ++ ++#include ++#include ++ ++#include ++ ++/* The Nios II Processor Reference Handbook defines the procedure call ++ ABI as follows. ++ ++ Arguments are passed as if a structure containing the types of ++ the arguments were constructed. The first 16 bytes are passed in r4 ++ through r7, the remainder on the stack. The first 16 bytes of a function ++ taking variable arguments are passed in r4-r7 in the same way. ++ ++ Return values of types up to 8 bytes are returned in r2 and r3. For ++ return values greater than 8 bytes, the caller must allocate memory for ++ the result and pass the address as if it were argument 0. ++ ++ While this isn't specified explicitly in the ABI documentation, GCC ++ promotes integral arguments smaller than int size to 32 bits. ++ ++ Also of note, the ABI specifies that all structure objects are ++ aligned to 32 bits even if all their fields have a smaller natural ++ alignment. See FFI_AGGREGATE_ALIGNMENT. */ ++ ++ ++/* Declare the assembly language hooks. */ ++ ++extern UINT64 ffi_call_sysv (void (*) (char *, extended_cif *), ++ extended_cif *, ++ unsigned, ++ void (*fn) (void)); ++extern void ffi_closure_sysv (void); ++ ++/* Perform machine-dependent cif processing. */ ++ ++ffi_status ffi_prep_cif_machdep (ffi_cif *cif) ++{ ++ /* We always want at least 16 bytes in the parameter block since it ++ simplifies the low-level call function. Also round the parameter ++ block size up to a multiple of 4 bytes to preserve ++ 32-bit alignment of the stack pointer. */ ++ if (cif->bytes < 16) ++ cif->bytes = 16; ++ else ++ cif->bytes = (cif->bytes + 3) & ~3; ++ ++ return FFI_OK; ++} ++ ++ ++/* ffi_prep_args is called by the assembly routine to transfer arguments ++ to the stack using the pointers in the ecif array. ++ Note that the stack buffer is big enough to fit all the arguments, ++ but the first 16 bytes will be copied to registers for the actual ++ call. */ ++ ++void ffi_prep_args (char *stack, extended_cif *ecif) ++{ ++ char *argp = stack; ++ unsigned int i; ++ ++ /* The implicit return value pointer is passed as if it were a hidden ++ first argument. */ ++ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT ++ && ecif->cif->rtype->size > 8) ++ { ++ (*(void **) argp) = ecif->rvalue; ++ argp += 4; ++ } ++ ++ for (i = 0; i < ecif->cif->nargs; i++) ++ { ++ void *avalue = ecif->avalue[i]; ++ ffi_type *atype = ecif->cif->arg_types[i]; ++ size_t size = atype->size; ++ size_t alignment = atype->alignment; ++ ++ /* Align argp as appropriate for the argument type. */ ++ if ((alignment - 1) & (unsigned) argp) ++ argp = (char *) ALIGN (argp, alignment); ++ ++ /* Copy the argument, promoting integral types smaller than a ++ word to word size. */ ++ if (size < sizeof (int)) ++ { ++ size = sizeof (int); ++ switch (atype->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int) *(SINT8 *) avalue; ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int) *(UINT8 *) avalue; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int) *(SINT16 *) avalue; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int) *(UINT16 *) avalue; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ memcpy (argp, avalue, atype->size); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else if (size == sizeof (int)) ++ *(unsigned int *) argp = (unsigned int) *(UINT32 *) avalue; ++ else ++ memcpy (argp, avalue, size); ++ argp += size; ++ } ++} ++ ++ ++/* Call FN using the prepared CIF. RVALUE points to space allocated by ++ the caller for the return value, and AVALUE is an array of argument ++ pointers. */ ++ ++void ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) ++{ ++ ++ extended_cif ecif; ++ UINT64 result; ++ ++ /* If bigret is true, this is the case where a return value of larger ++ than 8 bytes is handled by being passed by reference as an implicit ++ argument. */ ++ int bigret = (cif->rtype->type == FFI_TYPE_STRUCT ++ && cif->rtype->size > 8); ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* Allocate space for return value if this is the pass-by-reference case ++ and the caller did not provide a buffer. */ ++ if (rvalue == NULL && bigret) ++ ecif.rvalue = alloca (cif->rtype->size); ++ else ++ ecif.rvalue = rvalue; ++ ++ result = ffi_call_sysv (ffi_prep_args, &ecif, cif->bytes, fn); ++ ++ /* Now result contains the 64 bit contents returned from fn in ++ r2 and r3. Copy the value of the appropriate size to the user-provided ++ rvalue buffer. */ ++ if (rvalue && !bigret) ++ switch (cif->rtype->size) ++ { ++ case 1: ++ *(UINT8 *)rvalue = (UINT8) result; ++ break; ++ case 2: ++ *(UINT16 *)rvalue = (UINT16) result; ++ break; ++ case 4: ++ *(UINT32 *)rvalue = (UINT32) result; ++ break; ++ case 8: ++ *(UINT64 *)rvalue = (UINT64) result; ++ break; ++ default: ++ memcpy (rvalue, (void *)&result, cif->rtype->size); ++ break; ++ } ++} ++ ++/* This function is invoked from the closure trampoline to invoke ++ CLOSURE with argument block ARGS. Parse ARGS according to ++ CLOSURE->cfi and invoke CLOSURE->fun. */ ++ ++static UINT64 ++ffi_closure_helper (unsigned char *args, ++ ffi_closure *closure) ++{ ++ ffi_cif *cif = closure->cif; ++ unsigned char *argp = args; ++ void **parsed_args = alloca (cif->nargs * sizeof (void *)); ++ UINT64 result; ++ void *retptr; ++ unsigned int i; ++ ++ /* First figure out what to do about the return type. If this is the ++ big-structure-return case, the first arg is the hidden return buffer ++ allocated by the caller. */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++ && cif->rtype->size > 8) ++ { ++ retptr = *((void **) argp); ++ argp += 4; ++ } ++ else ++ retptr = (void *) &result; ++ ++ /* Fill in the array of argument pointers. */ ++ for (i = 0; i < cif->nargs; i++) ++ { ++ size_t size = cif->arg_types[i]->size; ++ size_t alignment = cif->arg_types[i]->alignment; ++ ++ /* Align argp as appropriate for the argument type. */ ++ if ((alignment - 1) & (unsigned) argp) ++ argp = (char *) ALIGN (argp, alignment); ++ ++ /* Arguments smaller than an int are promoted to int. */ ++ if (size < sizeof (int)) ++ size = sizeof (int); ++ ++ /* Store the pointer. */ ++ parsed_args[i] = argp; ++ argp += size; ++ } ++ ++ /* Call the user-supplied function. */ ++ (closure->fun) (cif, retptr, parsed_args, closure->user_data); ++ return result; ++} ++ ++ ++/* Initialize CLOSURE with a trampoline to call FUN with ++ CIF and USER_DATA. */ ++ffi_status ++ffi_prep_closure_loc (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun) (ffi_cif*, void*, void**, void*), ++ void *user_data, ++ void *codeloc) ++{ ++ unsigned int *tramp = (unsigned int *) &closure->tramp[0]; ++ int i; ++ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ /* The trampoline looks like: ++ movhi r8, %hi(ffi_closure_sysv) ++ ori r8, r8, %lo(ffi_closure_sysv) ++ movhi r9, %hi(ffi_closure_helper) ++ ori r0, r9, %lo(ffi_closure_helper) ++ movhi r10, %hi(closure) ++ ori r10, r10, %lo(closure) ++ jmp r8 ++ and then ffi_closure_sysv retrieves the closure pointer out of r10 ++ in addition to the arguments passed in the normal way for the call, ++ and invokes ffi_closure_helper. We encode the pointer to ++ ffi_closure_helper in the trampoline because making a PIC call ++ to it in ffi_closure_sysv would be messy (it would have to indirect ++ through the GOT). */ ++ ++#define HI(x) ((((unsigned int) (x)) >> 16) & 0xffff) ++#define LO(x) (((unsigned int) (x)) & 0xffff) ++ tramp[0] = (0 << 27) | (8 << 22) | (HI (ffi_closure_sysv) << 6) | 0x34; ++ tramp[1] = (8 << 27) | (8 << 22) | (LO (ffi_closure_sysv) << 6) | 0x14; ++ tramp[2] = (0 << 27) | (9 << 22) | (HI (ffi_closure_helper) << 6) | 0x34; ++ tramp[3] = (9 << 27) | (9 << 22) | (LO (ffi_closure_helper) << 6) | 0x14; ++ tramp[4] = (0 << 27) | (10 << 22) | (HI (closure) << 6) | 0x34; ++ tramp[5] = (10 << 27) | (10 << 22) | (LO (closure) << 6) | 0x14; ++ tramp[6] = (8 << 27) | (0x0d << 11) | 0x3a; ++#undef HI ++#undef LO ++ ++ /* Flush the caches. ++ See Example 9-4 in the Nios II Software Developer's Handbook. */ ++ for (i = 0; i < 7; i++) ++ asm volatile ("flushd 0(%0); flushi %0" :: "r"(tramp + i) : "memory"); ++ asm volatile ("flushp" ::: "memory"); ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ +diff --git a/js/src/ctypes/libffi/src/nios2/ffitarget.h b/js/src/ctypes/libffi/src/nios2/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/nios2/ffitarget.h +@@ -0,0 +1,52 @@ ++/* libffi target includes for Altera Nios II. ++ ++ Copyright (c) 2013 Mentor Graphics. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be ++ included in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ ++ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_SYSV, ++ FFI_LAST_ABI, ++ FFI_DEFAULT_ABI = FFI_SYSV ++} ffi_abi; ++#endif ++ ++/* Structures have a 4-byte alignment even if all the fields have lesser ++ alignment requirements. */ ++#define FFI_AGGREGATE_ALIGNMENT 4 ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 28 /* 7 instructions */ ++#define FFI_NATIVE_RAW_API 0 ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/nios2/sysv.S b/js/src/ctypes/libffi/src/nios2/sysv.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/nios2/sysv.S +@@ -0,0 +1,136 @@ ++/* Low-level libffi support for Altera Nios II. ++ ++ Copyright (c) 2013 Mentor Graphics. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be ++ included in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ ++ ++/* This function is declared on the C side as ++ ++ extern UINT64 ffi_call_sysv (void (*arghook) (char *, extended_cif *), ++ extended_cif *ecif, ++ unsigned nbytes, ++ void (*fn) (void)); ++ ++ On input, the arguments appear as ++ r4 = arghook ++ r5 = ecif ++ r6 = nbytes ++ r7 = fn ++*/ ++ ++ .section .text ++ .align 2 ++ .global ffi_call_sysv ++ .type ffi_call_sysv, @function ++ ++ffi_call_sysv: ++ .cfi_startproc ++ ++ /* Create the stack frame, saving r16 so we can use it locally. */ ++ addi sp, sp, -12 ++ .cfi_def_cfa_offset 12 ++ stw ra, 8(sp) ++ stw fp, 4(sp) ++ stw r16, 0(sp) ++ .cfi_offset 31, -4 ++ .cfi_offset 28, -8 ++ .cfi_offset 16, -12 ++ mov fp, sp ++ .cfi_def_cfa_register 28 ++ mov r16, r7 ++ ++ /* Adjust the stack pointer to create the argument buffer ++ nbytes long. */ ++ sub sp, sp, r6 ++ ++ /* Call the arghook function. */ ++ mov r2, r4 /* fn */ ++ mov r4, sp /* argbuffer */ ++ callr r2 /* r5 already contains ecif */ ++ ++ /* Pop off the first 16 bytes of the argument buffer on the stack, ++ transferring the contents to the argument registers. */ ++ ldw r4, 0(sp) ++ ldw r5, 4(sp) ++ ldw r6, 8(sp) ++ ldw r7, 12(sp) ++ addi sp, sp, 16 ++ ++ /* Call the user function, which leaves its result in r2 and r3. */ ++ callr r16 ++ ++ /* Pop off the stack frame. */ ++ mov sp, fp ++ ldw ra, 8(sp) ++ ldw fp, 4(sp) ++ ldw r16, 0(sp) ++ addi sp, sp, 12 ++ ret ++ .cfi_endproc ++ .size ffi_call_sysv, .-ffi_call_sysv ++ ++ ++/* Closure trampolines jump here after putting the C helper address ++ in r9 and the closure pointer in r10. The user-supplied arguments ++ to the closure are in the normal places, in r4-r7 and on the ++ stack. Push the register arguments on the stack too and then call the ++ C helper function to deal with them. */ ++ ++ .section .text ++ .align 2 ++ .global ffi_closure_sysv ++ .type ffi_closure_sysv, @function ++ ++ffi_closure_sysv: ++ .cfi_startproc ++ ++ /* Create the stack frame, pushing the register args on the stack ++ just below the stack args. This is the same trick illustrated ++ in Figure 7-3 in the Nios II Processor Reference Handbook, used ++ for variable arguments and structures passed by value. */ ++ addi sp, sp, -20 ++ .cfi_def_cfa_offset 20 ++ stw ra, 0(sp) ++ .cfi_offset 31, -20 ++ stw r4, 4(sp) ++ .cfi_offset 4, -16 ++ stw r5, 8(sp) ++ .cfi_offset 5, -12 ++ stw r6, 12(sp) ++ .cfi_offset 6, -8 ++ stw r7, 16(sp) ++ .cfi_offset 7, -4 ++ ++ /* Call the helper. ++ r4 = pointer to arguments on stack ++ r5 = closure pointer (loaded in r10 by the trampoline) ++ r9 = address of helper function (loaded by trampoline) */ ++ addi r4, sp, 4 ++ mov r5, r10 ++ callr r9 ++ ++ /* Pop the stack and return. */ ++ ldw ra, 0(sp) ++ addi sp, sp, 20 ++ .cfi_def_cfa_offset -20 ++ ret ++ .cfi_endproc ++ .size ffi_closure_sysv, .-ffi_closure_sysv ++ +diff --git a/js/src/ctypes/libffi/src/pa/ffi.c b/js/src/ctypes/libffi/src/pa/ffi.c +--- a/js/src/ctypes/libffi/src/pa/ffi.c ++++ b/js/src/ctypes/libffi/src/pa/ffi.c +@@ -1,14 +1,16 @@ + /* ----------------------------------------------------------------------- +- ffi.c - (c) 2003-2004 Randolph Chung ++ ffi.c - (c) 2011 Anthony Green + (c) 2008 Red Hat, Inc. +- ++ (c) 2006 Free Software Foundation, Inc. ++ (c) 2003-2004 Randolph Chung ++ + HPPA Foreign Function Interface +- HP-UX PA ABI support (c) 2006 Free Software Foundation, Inc. ++ HP-UX PA ABI support + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: +@@ -628,17 +630,18 @@ ffi_prep_closure_loc (ffi_closure* closu + void *user_data, + void *codeloc) + { + UINT32 *tramp = (UINT32 *)(closure->tramp); + #ifdef PA_HPUX + UINT32 *tmp; + #endif + +- FFI_ASSERT (cif->abi == FFI_PA32); ++ if (cif->abi != FFI_PA32) ++ return FFI_BAD_ABI; + + /* Make a small trampoline that will branch to our + handler function. Use PC-relative addressing. */ + + #ifdef PA_LINUX + tramp[0] = 0xeaa00000; /* b,l .+8,%r21 ; %r21 <- pc+8 */ + tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21 ; mask priv bits */ + tramp[2] = 0x4aa10028; /* ldw 20(%r21),%r1 ; load plabel */ +diff --git a/js/src/ctypes/libffi/src/pa/ffitarget.h b/js/src/ctypes/libffi/src/pa/ffitarget.h +--- a/js/src/ctypes/libffi/src/pa/ffitarget.h ++++ b/js/src/ctypes/libffi/src/pa/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for hppa. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + /* ---- System specific configurations ----------------------------------- */ + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, +diff --git a/js/src/ctypes/libffi/src/powerpc/aix.S b/js/src/ctypes/libffi/src/powerpc/aix.S +--- a/js/src/ctypes/libffi/src/powerpc/aix.S ++++ b/js/src/ctypes/libffi/src/powerpc/aix.S +@@ -1,10 +1,10 @@ + /* ----------------------------------------------------------------------- +- aix.S - Copyright (c) 2002,2009 Free Software Foundation, Inc. ++ aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. + based on darwin.S by John Hornkvist + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, +@@ -74,16 +74,18 @@ + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + ++ .extern .ffi_prep_args ++ + #define LIBFFI_ASM + #include + #include + #define JUMPTARGET(name) name + #define L(x) x + .file "aix.S" + .toc + +@@ -120,39 +122,40 @@ ffi_call_AIX: + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address. */ + std r2, 40(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args ++ nop + + /* Now do the call. */ + ld r0, 0(r29) + ld r2, 8(r29) + ld r11, 16(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ +- // We have set up a nice stack frame, just load it into registers. ++ /* We have set up a nice stack frame, just load it into registers. */ + ld r3, 40+(1*8)(r1) + ld r4, 40+(2*8)(r1) + ld r5, 40+(3*8)(r1) + ld r6, 40+(4*8)(r1) + nop + ld r7, 40+(5*8)(r1) + ld r8, 40+(6*8)(r1) + ld r9, 40+(7*8)(r1) + ld r10,40+(8*8)(r1) + + L1: + /* Load all the FP registers. */ +- bf 6,L2 // 2f + 0x18 ++ bf 6,L2 /* 2f + 0x18 */ + lfd f1,-32-(13*8)(r28) + lfd f2,-32-(12*8)(r28) + lfd f3,-32-(11*8)(r28) + lfd f4,-32-(10*8)(r28) + nop + lfd f5,-32-(9*8)(r28) + lfd f6,-32-(8*8)(r28) + lfd f7,-32-(7*8)(r28) +@@ -221,39 +224,40 @@ L(float_return_value): + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address, */ + stw r2, 20(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args ++ nop + + /* Now do the call. */ + lwz r0, 0(r29) + lwz r2, 4(r29) + lwz r11, 8(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ +- // We have set up a nice stack frame, just load it into registers. ++ /* We have set up a nice stack frame, just load it into registers. */ + lwz r3, 20+(1*4)(r1) + lwz r4, 20+(2*4)(r1) + lwz r5, 20+(3*4)(r1) + lwz r6, 20+(4*4)(r1) + nop + lwz r7, 20+(5*4)(r1) + lwz r8, 20+(6*4)(r1) + lwz r9, 20+(7*4)(r1) + lwz r10,20+(8*4)(r1) + + L1: + /* Load all the FP registers. */ +- bf 6,L2 // 2f + 0x18 ++ bf 6,L2 /* 2f + 0x18 */ + lfd f1,-16-(13*8)(r28) + lfd f2,-16-(12*8)(r28) + lfd f3,-16-(11*8)(r28) + lfd f4,-16-(10*8)(r28) + nop + lfd f5,-16-(9*8)(r28) + lfd f6,-16-(8*8)(r28) + lfd f7,-16-(7*8)(r28) +@@ -298,17 +302,17 @@ L(fp_return_value): + stfd f1, 0(r30) + b L(done_return_value) + L(float_return_value): + stfs f1, 0(r30) + b L(done_return_value) + #endif + .long 0 + .byte 0,0,0,1,128,4,0,0 +-//END(ffi_call_AIX) ++/* END(ffi_call_AIX) */ + + .csect .text[PR] + .align 2 + .globl ffi_call_DARWIN + .globl .ffi_call_DARWIN + .csect ffi_call_DARWIN[DS] + ffi_call_DARWIN: + #ifdef __64BIT__ +@@ -316,9 +320,9 @@ ffi_call_DARWIN: + #else + .long .ffi_call_DARWIN, TOC[tc0], 0 + #endif + .csect .text[PR] + .ffi_call_DARWIN: + blr + .long 0 + .byte 0,0,0,0,0,0,0,0 +-//END(ffi_call_DARWIN) ++/* END(ffi_call_DARWIN) */ +diff --git a/js/src/ctypes/libffi/src/powerpc/aix_closure.S b/js/src/ctypes/libffi/src/powerpc/aix_closure.S +--- a/js/src/ctypes/libffi/src/powerpc/aix_closure.S ++++ b/js/src/ctypes/libffi/src/powerpc/aix_closure.S +@@ -74,16 +74,18 @@ + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + ++ .extern .ffi_closure_helper_DARWIN ++ + #define LIBFFI_ASM + #define JUMPTARGET(name) name + #define L(x) x + .file "aix_closure.S" + .toc + LC..60: + .tc L..60[TC],L..60 + .csect .text[PR] +@@ -160,16 +162,17 @@ ffi_closure_ASM: + nop + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ ++ lhz r3, 10(r3) /* load type from return type */ + ld r4, LC..60(2) /* get address of jump table */ + sldi r3, r3, 4 /* now multiply return type by 16 */ + ld r0, 240+16(r1) /* load return address */ + add r3, r3, r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + + /* Each fragment must be exactly 16 bytes long (4 instructions). +@@ -332,18 +335,19 @@ L..finish: + nop + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ ++ lhz r3, 6(r3) /* load type from return type */ + lwz r4, LC..60(2) /* get address of jump table */ +- slwi r3, r3, 4 /* now multiply return type by 4 */ ++ slwi r3, r3, 4 /* now multiply return type by 16 */ + lwz r0, 176+8(r1) /* load return address */ + add r3, r3, r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + + /* Each fragment must be exactly 16 bytes long (4 instructions). + Align to 16 byte boundary for cache and dispatch efficiency. */ + .align 4 +diff --git a/js/src/ctypes/libffi/src/powerpc/asm.h b/js/src/ctypes/libffi/src/powerpc/asm.h +--- a/js/src/ctypes/libffi/src/powerpc/asm.h ++++ b/js/src/ctypes/libffi/src/powerpc/asm.h +@@ -37,17 +37,17 @@ + /* This seems to always be the case on PPC. */ + #define ALIGNARG(log2) log2 + /* For ELF we need the `.type' directive to make shared libs work right. */ + #define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; + #define ASM_SIZE_DIRECTIVE(name) .size name,.-name + + /* If compiled for profiling, call `_mcount' at the start of each function. */ + #ifdef PROF +-/* The mcount code relies on a the return address being on the stack ++/* The mcount code relies on the return address being on the stack + to locate our caller and so it can restore it; so store one just + for its benefit. */ + #ifdef PIC + #define CALL_MCOUNT \ + .pushsection; \ + .section ".data"; \ + .align ALIGNARG(2); \ + 0:.long 0; \ +diff --git a/js/src/ctypes/libffi/src/powerpc/darwin.S b/js/src/ctypes/libffi/src/powerpc/darwin.S +--- a/js/src/ctypes/libffi/src/powerpc/darwin.S ++++ b/js/src/ctypes/libffi/src/powerpc/darwin.S +@@ -1,11 +1,11 @@ + /* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 2000 John Hornkvist +- Copyright (c) 2004 Free Software Foundation, Inc. ++ Copyright (c) 2004, 2010 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -19,207 +19,342 @@ + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + ++#define LIBFFI_ASM + #if defined(__ppc64__) + #define MODE_CHOICE(x, y) y + #else + #define MODE_CHOICE(x, y) x + #endif + +-#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ ++#define machine_choice MODE_CHOICE(ppc7400,ppc64) + +-#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ ++; Define some pseudo-opcodes for size-independent load & store of GPRs ... ++#define lgu MODE_CHOICE(lwzu, ldu) ++#define lg MODE_CHOICE(lwz,ld) ++#define sg MODE_CHOICE(stw,std) ++#define sgu MODE_CHOICE(stwu,stdu) ++#define sgux MODE_CHOICE(stwux,stdux) + +-#define LIBFFI_ASM ++; ... and the size of GPRs and their storage indicator. ++#define GPR_BYTES MODE_CHOICE(4,8) ++#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ ++#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ ++ ++; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. ++#define LINKAGE_SIZE MODE_CHOICE(24,48) ++#define PARAM_AREA MODE_CHOICE(32,64) ++#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ ++ ++/* If there is any FP stuff we make space for all of the regs. */ ++#define SAVED_FPR_COUNT 13 ++#define FPR_SIZE 8 ++#define RESULT_BYTES 16 ++ ++/* This should be kept in step with the same value in ffi_darwin.c. */ ++#define ASM_NEEDS_REGISTERS 4 ++#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES) ++ + #include + #include ++ + #define JUMPTARGET(name) name + #define L(x) x +-.text ++ ++ .text + .align 2 +-.globl _ffi_prep_args ++ .globl _ffi_prep_args + +-.text + .align 2 +-.globl _ffi_call_DARWIN +-.text +- .align 2 ++ .globl _ffi_call_DARWIN ++ ++ /* We arrive here with: ++ r3 = ptr to extended cif. ++ r4 = -bytes. ++ r5 = cif flags. ++ r6 = ptr to return value. ++ r7 = fn pointer (user func). ++ r8 = fn pointer (ffi_prep_args). ++ r9 = ffi_type* for the ret val. */ ++ + _ffi_call_DARWIN: +-LFB0: ++Lstartcode: + mr r12,r8 /* We only need r12 until the call, +- so it doesn't have to be saved. */ ++ so it does not have to be saved. */ + LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + LCFI0: ++ ++ /* Save the retval type in parents frame. */ ++ sg r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8) ++ + /* Allocate the stack space we need. */ +- stwux r1,r1,r4 ++ sgux r1,r1,r4 + + /* Save registers we use. */ + mflr r9 ++ sg r9,SAVED_LR_OFFSET(r8) + +- stw r28,-16(r8) +- stw r29,-12(r8) +- stw r30,-8(r8) +- stw r31,-4(r8) ++ sg r28,-(4 * GPR_BYTES)(r8) ++ sg r29,-(3 * GPR_BYTES)(r8) ++ sg r30,-(2 * GPR_BYTES)(r8) ++ sg r31,-( GPR_BYTES)(r8) + +- stw r9,8(r8) +- stw r2,20(r1) ++#if !defined(POWERPC_DARWIN) ++ /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ ++ sg r2,(5 * GPR_BYTES)(r1) ++#endif ++ + LCFI1: + + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + LCFI2: +- /* Call ffi_prep_args. */ ++ /* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy. */ + mr r4,r1 + li r9,0 + + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +- lwz r2,20(r1) + ++#if !defined(POWERPC_DARWIN) ++ /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ ++ lg r2,(5 * GPR_BYTES)(r1) ++#endif + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + /* Get the address to call into CTR. */ + mtctr r29 + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ +- lwz r3,20+(1*4)(r1) +- lwz r4,20+(2*4)(r1) +- lwz r5,20+(3*4)(r1) +- lwz r6,20+(4*4)(r1) ++ lg r3, (LINKAGE_SIZE )(r1) ++ lg r4, (LINKAGE_SIZE + GPR_BYTES)(r1) ++ lg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1) ++ lg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1) + nop +- lwz r7,20+(5*4)(r1) +- lwz r8,20+(6*4)(r1) +- lwz r9,20+(7*4)(r1) +- lwz r10,20+(8*4)(r1) ++ lg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1) ++ lg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1) ++ lg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1) ++ lg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1) + + L1: +- /* Load all the FP registers. */ ++ /* ... Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +- lfd f1,-16-(13*8)(r28) +- lfd f2,-16-(12*8)(r28) +- lfd f3,-16-(11*8)(r28) +- lfd f4,-16-(10*8)(r28) ++ lfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) ++ lfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) ++ lfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) ++ lfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) + nop +- lfd f5,-16-(9*8)(r28) +- lfd f6,-16-(8*8)(r28) +- lfd f7,-16-(7*8)(r28) +- lfd f8,-16-(6*8)(r28) ++ lfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) ++ lfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) ++ lfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) ++ lfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) + nop +- lfd f9,-16-(5*8)(r28) +- lfd f10,-16-(4*8)(r28) +- lfd f11,-16-(3*8)(r28) +- lfd f12,-16-(2*8)(r28) ++ lfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) ++ lfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) ++ lfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) ++ lfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) + nop +- lfd f13,-16-(1*8)(r28) ++ lfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) + + L2: + mr r12,r29 /* Put the target address in r12 as specified. */ + mtctr r12 + nop + nop ++ + /* Make the call. */ + bctrl + + /* Now, deal with the return value. */ +- mtcrf 0x01,r31 + +- bt 30,L(done_return_value) +- bt 29,L(fp_return_value) +- stw r3,0(r30) +- bf 28,L(done_return_value) +- stw r4,4(r30) ++ /* m64 structure returns can occupy the same set of registers as ++ would be used to pass such a structure as arg0 - so take care ++ not to step on any possibly hot regs. */ + +- /* Fall through. */ ++ /* Get the flags.. */ ++ mtcrf 0x03,r31 ; we need c6 & cr7 now. ++ ; FLAG_RETURNS_NOTHING also covers struct ret-by-ref. ++ bt 30,L(done_return_value) ; FLAG_RETURNS_NOTHING ++ bf 27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT ++ ++ /* OK, so we have a struct. */ ++#if defined(__ppc64__) ++ bt 31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case + +-L(done_return_value): +- /* Restore the registers we used and return. */ +- lwz r9,8(r28) +- lwz r31,-4(r28) +- mtlr r9 +- lwz r30,-8(r28) +- lwz r29,-12(r28) +- lwz r28,-16(r28) +- lwz r1,0(r1) +- blr ++ /* OK, we have to map the return back to a mem struct. ++ We are about to trample the parents param area, so recover the ++ return type. r29 is free, since the call is done. */ ++ lg r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28) ++ ++ sg r3, (LINKAGE_SIZE )(r28) ++ sg r4, (LINKAGE_SIZE + GPR_BYTES)(r28) ++ sg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28) ++ sg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28) ++ nop ++ sg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28) ++ sg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28) ++ sg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28) ++ sg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) ++ /* OK, so do the block move - we trust that memcpy will not trample ++ the fprs... */ ++ mr r3,r30 ; dest ++ addi r4,r28,LINKAGE_SIZE ; source ++ /* The size is a size_t, should be long. */ ++ lg r5,0(r29) ++ /* Figure out small structs */ ++ cmpi 0,r5,4 ++ bgt L3 ; 1, 2 and 4 bytes have special rules. ++ cmpi 0,r5,3 ++ beq L3 ; not 3 ++ addi r4,r4,8 ++ subf r4,r5,r4 ++L3: ++ bl _memcpy ++ ++ /* ... do we need the FP registers? - recover the flags.. */ ++ mtcrf 0x03,r31 ; we need c6 & cr7 now. ++ bf 29,L(done_return_value) /* No floats in the struct. */ ++ stfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) ++ stfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) ++ stfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) ++ stfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) ++ nop ++ stfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) ++ stfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) ++ stfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) ++ stfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) ++ nop ++ stfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) ++ stfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) ++ stfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) ++ stfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) ++ nop ++ stfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) ++ ++ mr r3,r29 ; ffi_type * ++ mr r4,r30 ; dest ++ addi r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs ++ xor r6,r6,r6 ++ sg r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) ++ addi r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter. ++ bl _darwin64_struct_floats_to_mem ++ ++ b L(done_return_value) ++#else ++ stw r3,0(r30) ; m32 the only struct return in reg is 4 bytes. ++#endif ++ b L(done_return_value) + + L(fp_return_value): + /* Do we have long double to store? */ +- bf 31,L(fd_return_value) ++ bf 31,L(fd_return_value) ; FLAG_RETURNS_128BITS + stfd f1,0(r30) +- stfd f2,8(r30) ++ stfd f2,FPR_SIZE(r30) + b L(done_return_value) + + L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + + L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + ++L(scalar_return_value): ++ bt 29,L(fp_return_value) ; FLAG_RETURNS_FP ++ ; ffi_arg is defined as unsigned long. ++ sg r3,0(r30) ; Save the reg. ++ bf 28,L(done_return_value) ; not FLAG_RETURNS_64BITS ++ ++#if defined(__ppc64__) ++L(maybe_return_128): ++ std r3,0(r30) ++ bf 31,L(done_return_value) ; not FLAG_RETURNS_128BITS ++ std r4,8(r30) ++#else ++ stw r4,4(r30) ++#endif ++ ++ /* Fall through. */ ++ /* We want this at the end to simplify eh epilog computation. */ ++ ++L(done_return_value): ++ /* Restore the registers we used and return. */ ++ lg r29,SAVED_LR_OFFSET(r28) ++ ; epilog ++ lg r31,-(1 * GPR_BYTES)(r28) ++ mtlr r29 ++ lg r30,-(2 * GPR_BYTES)(r28) ++ lg r29,-(3 * GPR_BYTES)(r28) ++ lg r28,-(4 * GPR_BYTES)(r28) ++ lg r1,0(r1) ++ blr + LFE1: ++ .align 1 + /* END(_ffi_call_DARWIN) */ + + /* Provide a null definition of _ffi_call_AIX. */ +-.text +- .align 2 +-.globl _ffi_call_AIX +-.text ++ .text ++ .globl _ffi_call_AIX + .align 2 + _ffi_call_AIX: + blr + /* END(_ffi_call_AIX) */ + +-.data +-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++/* EH stuff. */ ++ ++#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) ++ ++ .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support + EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry + LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor +- .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size +- .byte 0x90 ; FDE Encoding (indirect pcrel) ++ .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES + LECIE1: +-.globl _ffi_call_DARWIN.eh ++ ++ .globl _ffi_call_DARWIN.eh + _ffi_call_DARWIN.eh: + LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset +- .g_long LLFB0$non_lazy_ptr-. ; FDE initial location +- .set L$set$3,LFE1-LFB0 ++ .g_long Lstartcode-. ; FDE initial location ++ .set L$set$3,LFE1-Lstartcode + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 +- .set L$set$4,LCFI0-LFB1 ++ .set L$set$4,LCFI0-Lstartcode + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 +@@ -234,12 +369,10 @@ LASFDE1: + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES + LEFDE1: +-.data +- .align LOG2_GPR_BYTES +-LLFB0$non_lazy_ptr: +- .g_long LFB0 ++ .align 1 ++ +diff --git a/js/src/ctypes/libffi/src/powerpc/darwin_closure.S b/js/src/ctypes/libffi/src/powerpc/darwin_closure.S +--- a/js/src/ctypes/libffi/src/powerpc/darwin_closure.S ++++ b/js/src/ctypes/libffi/src/powerpc/darwin_closure.S +@@ -1,11 +1,12 @@ + /* ----------------------------------------------------------------------- +- darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, +- Inc. based on ppc_closure.S ++ darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, ++ Free Software Foundation, Inc. ++ based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -28,101 +29,187 @@ + #define L(x) x + + #if defined(__ppc64__) + #define MODE_CHOICE(x, y) y + #else + #define MODE_CHOICE(x, y) x + #endif + +-#define lgu MODE_CHOICE(lwzu, ldu) ++#define machine_choice MODE_CHOICE(ppc7400,ppc64) + +-#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ ++; Define some pseudo-opcodes for size-independent load & store of GPRs ... ++#define lgu MODE_CHOICE(lwzu, ldu) ++#define lg MODE_CHOICE(lwz,ld) ++#define sg MODE_CHOICE(stw,std) ++#define sgu MODE_CHOICE(stwu,stdu) + +-#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ ++; ... and the size of GPRs and their storage indicator. ++#define GPR_BYTES MODE_CHOICE(4,8) ++#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ ++#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ ++ ++; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. ++#define LINKAGE_SIZE MODE_CHOICE(24,48) ++#define PARAM_AREA MODE_CHOICE(32,64) ++ ++#define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */ ++#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ ++ ++/* WARNING: if ffi_type is changed... here be monsters. ++ Offsets of items within the result type. */ ++#define FFI_TYPE_TYPE MODE_CHOICE(6,10) ++#define FFI_TYPE_ELEM MODE_CHOICE(8,16) ++ ++#define SAVED_FPR_COUNT 13 ++#define FPR_SIZE 8 ++/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */ ++#define RESULT_BYTES MODE_CHOICE(16,176) ++ ++; The whole stack frame **MUST** be 16byte-aligned. ++#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL) ++#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)) ++ ++#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE) ++#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA) ++ ++#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 ++; We no longer need the pic symbol stub for Darwin >= 9. ++#define BLCLS_HELP _ffi_closure_helper_DARWIN ++#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p ++#define PASS_STR_FLOATS _darwin64_pass_struct_floats ++#undef WANT_STUB ++#else ++#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub ++#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub ++#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub ++#define WANT_STUB ++#endif ++ ++/* m32/m64 ++ ++ The stack layout looks like this: ++ ++ | Additional params... | | Higher address ++ ~ ~ ~ ++ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS ++ |--------------------------------------------| | ++ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | ++ |--------------------------------------------| | ++ | Reserved 2*4/8 | | ++ |--------------------------------------------| | ++ | Space for callee`s LR 4/8 | | ++ |--------------------------------------------| | ++ | Saved CR [low word for m64] 4/8 | | ++ |--------------------------------------------| | ++ | Current backchain pointer 4/8 |-/ Parent`s frame. ++ |--------------------------------------------| <+ <<< on entry to ++ | Result Bytes 16/176 | | ++ |--------------------------------------------| | ++ ~ padding to 16-byte alignment ~ ~ ++ |--------------------------------------------| | ++ | NUM_FPR_ARG_REGISTERS slots | | ++ | here fp13 .. fp1 13*8 | | ++ |--------------------------------------------| | ++ | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS ++ |--------------------------------------------| | ++ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved [compiler,binder] 2*4/8 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callees LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR [low word for m64] 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 |-/ during ++ |--------------------------------------------| <<< call. ++ ++*/ + + .file "darwin_closure.S" +-.text +- .align LOG2_GPR_BYTES +-.globl _ffi_closure_ASM + +-.text ++ .machine machine_choice ++ ++ .text ++ .globl _ffi_closure_ASM + .align LOG2_GPR_BYTES + _ffi_closure_ASM: + LFB1: +- mflr r0 /* extract return address */ +- stw r0,8(r1) /* save the return address */ ++Lstartcode: ++ mflr r0 /* extract return address */ ++ sg r0,SAVED_LR_OFFSET(r1) /* save the return address */ + LCFI0: +- /* 24 Bytes (Linkage Area) +- 32 Bytes (outgoing parameter area, always reserved) +- 104 Bytes (13*8 from FPR) +- 16 Bytes (result) +- 176 Bytes */ +- +- stwu r1,-176(r1) /* skip over caller save area +- keep stack aligned to 16. */ ++ sgu r1,-SAVE_SIZE(r1) /* skip over caller save area ++ keep stack aligned to 16. */ + LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + +- /* We store gpr 3 to gpr 10 (aligned to 4) +- in the parents outgoing area. */ +- stw r3,200(r1) +- stw r4,204(r1) +- stw r5,208(r1) +- stw r6,212(r1) +- stw r7,216(r1) +- stw r8,220(r1) +- stw r9,224(r1) +- stw r10,228(r1) ++ /* Put gpr 3 to gpr 10 in the parents outgoing area... ++ ... the remainder of any params that overflowed the regs will ++ follow here. */ ++ sg r3, (PARENT_PARM_BASE )(r1) ++ sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1) ++ sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1) ++ sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1) ++ sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1) ++ sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1) ++ sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1) ++ sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1) + +- /* We save fpr 1 to fpr 13. (aligned to 8) */ +- stfd f1,56(r1) +- stfd f2,64(r1) +- stfd f3,72(r1) +- stfd f4,80(r1) +- stfd f5,88(r1) +- stfd f6,96(r1) +- stfd f7,104(r1) +- stfd f8,112(r1) +- stfd f9,120(r1) +- stfd f10,128(r1) +- stfd f11,136(r1) +- stfd f12,144(r1) +- stfd f13,152(r1) ++ /* We save fpr 1 to fpr 14 in our own save frame. */ ++ stfd f1, (FP_SAVE_BASE )(r1) ++ stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) ++ stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) ++ stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) ++ stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) ++ stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) ++ stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) ++ stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) ++ stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) ++ stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) ++ stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) ++ stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) ++ stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) + + /* Set up registers for the routine that actually does the work + get the context pointer from the trampoline. */ +- mr r3,r11 ++ mr r3,r11 + + /* Now load up the pointer to the result storage. */ +- addi r4,r1,160 ++ addi r4,r1,(SAVE_SIZE-RESULT_BYTES) + + /* Now load up the pointer to the saved gpr registers. */ +- addi r5,r1,200 ++ addi r5,r1,PARENT_PARM_BASE + + /* Now load up the pointer to the saved fpr registers. */ +- addi r6,r1,56 ++ addi r6,r1,FP_SAVE_BASE + + /* Make the call. */ +- bl Lffi_closure_helper_DARWIN$stub ++ bl BLCLS_HELP + +- /* Now r3 contains the return type +- so use it to look up in a table ++ /* r3 contains the rtype pointer... save it since we will need ++ it later. */ ++ sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type ++ lg r0,0(r3) ; size => r0 ++ lhz r3,FFI_TYPE_TYPE(r3) ; type => r3 ++ ++ /* The helper will have intercepted structure returns and inserted ++ the caller`s destination address for structs returned by ref. */ ++ ++ /* r3 contains the return type so use it to look up in a table + so we know how to deal with each type. */ + +- /* Look up the proper starting point in table +- by using return type as offset. */ +- addi r5,r1,160 /* Get pointer to results area. */ +- bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ +- mflr r4 /* Move to r4. */ +- slwi r3,r3,4 /* Now multiply return type by 16. */ +- add r3,r3,r4 /* Add contents of table to table address. */ +- mtctr r3 +- bctr /* Jump to it. */ ++ addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */ ++ bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ ++ mflr r4 /* Move to r4. */ ++ slwi r3,r3,4 /* Now multiply return type by 16. */ ++ add r3,r3,r4 /* Add contents of table to table address. */ ++ mtctr r3 ++ bctr /* Jump to it. */ + LFE1: + /* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + + .align 4 + + nop +@@ -135,17 +222,17 @@ Lget_ret_type0_addr: + Lret_type0: + b Lfinish + nop + nop + nop + + /* case FFI_TYPE_INT */ + Lret_type1: +- lwz r3,0(r5) ++ lg r3,0(r5) + b Lfinish + nop + nop + + /* case FFI_TYPE_FLOAT */ + Lret_type2: + lfs f1,0(r5) + b Lfinish +@@ -163,155 +250,322 @@ Lret_type3: + Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + + /* case FFI_TYPE_UINT8 */ + Lret_type5: ++#if defined(__ppc64__) ++ lbz r3,7(r5) ++#else + lbz r3,3(r5) ++#endif + b Lfinish + nop + nop + + /* case FFI_TYPE_SINT8 */ + Lret_type6: ++#if defined(__ppc64__) ++ lbz r3,7(r5) ++#else + lbz r3,3(r5) ++#endif + extsb r3,r3 + b Lfinish + nop + + /* case FFI_TYPE_UINT16 */ + Lret_type7: ++#if defined(__ppc64__) ++ lhz r3,6(r5) ++#else + lhz r3,2(r5) ++#endif + b Lfinish + nop + nop + + /* case FFI_TYPE_SINT16 */ + Lret_type8: ++#if defined(__ppc64__) ++ lha r3,6(r5) ++#else + lha r3,2(r5) ++#endif + b Lfinish + nop + nop + + /* case FFI_TYPE_UINT32 */ + Lret_type9: ++#if defined(__ppc64__) ++ lwz r3,4(r5) ++#else + lwz r3,0(r5) ++#endif + b Lfinish + nop + nop + + /* case FFI_TYPE_SINT32 */ + Lret_type10: ++#if defined(__ppc64__) ++ lwz r3,4(r5) ++#else + lwz r3,0(r5) ++#endif + b Lfinish + nop + nop + + /* case FFI_TYPE_UINT64 */ + Lret_type11: ++#if defined(__ppc64__) ++ lg r3,0(r5) ++ b Lfinish ++ nop ++#else + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish ++#endif + nop + + /* case FFI_TYPE_SINT64 */ + Lret_type12: ++#if defined(__ppc64__) ++ lg r3,0(r5) ++ b Lfinish ++ nop ++#else + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish ++#endif + nop + + /* case FFI_TYPE_STRUCT */ + Lret_type13: ++#if defined(__ppc64__) ++ lg r3,0(r5) ; we need at least this... ++ cmpi 0,r0,4 ++ bgt Lstructend ; not a special small case ++ b Lsmallstruct ; see if we need more. ++#else ++ cmpi 0,r0,4 ++ bgt Lfinish ; not by value ++ lg r3,0(r5) ++ b Lfinish ++#endif ++/* case FFI_TYPE_POINTER */ ++Lret_type14: ++ lg r3,0(r5) + b Lfinish + nop + nop +- nop + +-/* case FFI_TYPE_POINTER */ +-Lret_type14: +- lwz r3,0(r5) +- b Lfinish +- nop +- nop ++#if defined(__ppc64__) ++Lsmallstruct: ++ beq Lfour ; continuation of Lret13. ++ cmpi 0,r0,3 ++ beq Lfinish ; don`t adjust this - can`t be any floats here... ++ srdi r3,r3,48 ++ cmpi 0,r0,2 ++ beq Lfinish ; .. or here .. ++ srdi r3,r3,8 ++ b Lfinish ; .. or here. ++ ++Lfour: ++ lg r6,LINKAGE_SIZE(r1) ; get the result type ++ lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer ++ lg r6,0(r6) ; first element ++ lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type ++ cmpi 0,r0,2 ; FFI_TYPE_FLOAT ++ bne Lfourint ++ lfs f1,0(r5) ; just one float in the struct. ++ b Lfinish ++ ++Lfourint: ++ srdi r3,r3,32 ; four bytes. ++ b Lfinish ++ ++Lstructend: ++ lg r3,LINKAGE_SIZE(r1) ; get the result type ++ bl STRUCT_RETVALUE_P ++ cmpi 0,r3,0 ++ beq Lfinish ; nope. ++ /* Recover a pointer to the results. */ ++ addi r11,r1,(SAVE_SIZE-RESULT_BYTES) ++ lg r3,0(r11) ; we need at least this... ++ lg r4,8(r11) ++ cmpi 0,r0,16 ++ beq Lfinish ; special case 16 bytes we don't consider floats. ++ ++ /* OK, frustratingly, the process of saving the struct to mem might have ++ messed with the FPRs, so we have to re-load them :(. ++ We`ll use our FPRs space again - calling: ++ void darwin64_pass_struct_floats (ffi_type *s, char *src, ++ unsigned *nfpr, double **fprs) ++ We`ll temporarily pinch the first two slots of the param area for local ++ vars used by the routine. */ ++ xor r6,r6,r6 ++ addi r5,r1,PARENT_PARM_BASE ; some space ++ sg r6,0(r5) ; *nfpr zeroed. ++ addi r6,r5,8 ; **fprs ++ addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space ++ sg r3,0(r6) ++ mr r4,r11 ; the struct is here... ++ lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type. ++ bl PASS_STR_FLOATS ; get struct floats into FPR save space. ++ /* See if we used any floats */ ++ lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1) ++ cmpi 0,r0,0 ++ beq Lstructints ; nope. ++ /* OK load `em up... */ ++ lfd f1, (FP_SAVE_BASE )(r1) ++ lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) ++ lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) ++ lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) ++ lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) ++ lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) ++ lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) ++ lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) ++ lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) ++ lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) ++ lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) ++ lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) ++ lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) ++ ++ /* point back at our saved struct. */ ++Lstructints: ++ addi r11,r1,(SAVE_SIZE-RESULT_BYTES) ++ lg r3,0(r11) ; we end up picking the ++ lg r4,8(r11) ; first two again. ++ lg r5,16(r11) ++ lg r6,24(r11) ++ lg r7,32(r11) ++ lg r8,40(r11) ++ lg r9,48(r11) ++ lg r10,56(r11) ++#endif + + /* case done */ + Lfinish: +- addi r1,r1,176 /* Restore stack pointer. */ +- lwz r0,8(r1) /* Get return address. */ +- mtlr r0 /* Reset link register. */ ++ addi r1,r1,SAVE_SIZE /* Restore stack pointer. */ ++ lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */ ++ mtlr r0 /* Reset link register. */ + blr +- ++Lendcode: ++ .align 1 ++ + /* END(ffi_closure_ASM) */ + +-.data +-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++/* EH frame stuff. */ ++#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) ++/* 176, 400 */ ++#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90) ++#define EH_FRAME_OFFSETB MODE_CHOICE(1,3) ++ ++ .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support + EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry + LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor +- .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size +- .byte 0x90 ; FDE Encoding (indirect pcrel) ++ .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES + LECIE1: +-.globl _ffi_closure_ASM.eh ++ .globl _ffi_closure_ASM.eh + _ffi_closure_ASM.eh: + LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + + LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset +- .g_long LLFB1$non_lazy_ptr-. ; FDE initial location +- .set L$set$3,LFE1-LFB1 ++ .g_long Lstartcode-. ; FDE initial location ++ .set L$set$3,LFE1-Lstartcode + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset +- .byte 176,1 ; uleb128 176 ++ .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3 + .byte 0x4 ; DW_CFA_advance_loc4 +- .set L$set$4,LCFI0-LFB1 ++ .set L$set$4,LCFI0-Lstartcode + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + LEFDE1: +-.data +- .align LOG2_GPR_BYTES +-LDFCM0: +-.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 +- .align LOG2_GPR_BYTES +-Lffi_closure_helper_DARWIN$stub: +-#if 1 ++ .align 1 ++ ++#ifdef WANT_STUB ++ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align 5 ++L_ffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN +- mflr r0 +- bcl 20,31,LO$ffi_closure_helper_DARWIN +-LO$ffi_closure_helper_DARWIN: +- mflr r11 +- addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) +- mtlr r0 +- lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) +- mtctr r12 ++ mflr r0 ++ bcl 20,31,"L1$spb" ++"L1$spb": ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb") ++ mtlr r0 ++ lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11) ++ mtctr r12 + bctr +-.lazy_symbol_pointer ++ .lazy_symbol_pointer + L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN +- .g_long dyld_stub_binding_helper ++ .g_long dyld_stub_binding_helper ++ ++#if defined(__ppc64__) ++ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align 5 ++L_darwin64_struct_ret_by_value_p$stub: ++ .indirect_symbol _darwin64_struct_ret_by_value_p ++ mflr r0 ++ bcl 20,31,"L2$spb" ++"L2$spb": ++ mflr r11 ++ addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb") ++ mtlr r0 ++ lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")(r11) ++ mtctr r12 ++ bctr ++ .lazy_symbol_pointer ++L_darwin64_struct_ret_by_value_p$lazy_ptr: ++ .indirect_symbol _darwin64_struct_ret_by_value_p ++ .g_long dyld_stub_binding_helper ++ ++ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align 5 ++L_darwin64_pass_struct_floats$stub: ++ .indirect_symbol _darwin64_pass_struct_floats ++ mflr r0 ++ bcl 20,31,"L3$spb" ++"L3$spb": ++ mflr r11 ++ addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb") ++ mtlr r0 ++ lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11) ++ mtctr r12 ++ bctr ++ .lazy_symbol_pointer ++L_darwin64_pass_struct_floats$lazy_ptr: ++ .indirect_symbol _darwin64_pass_struct_floats ++ .g_long dyld_stub_binding_helper ++# endif + #endif +-.data +- .align LOG2_GPR_BYTES +-LLFB1$non_lazy_ptr: +- .g_long LFB1 +diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/powerpc/ffi.c +--- a/js/src/ctypes/libffi/src/powerpc/ffi.c ++++ b/js/src/ctypes/libffi/src/powerpc/ffi.c +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (C) 2011 Anthony Green ++ ffi.c - Copyright (C) 2013 IBM ++ Copyright (C) 2011 Anthony Green + Copyright (C) 2011 Kyle Moffett + Copyright (C) 2008 Red Hat, Inc + Copyright (C) 2007, 2008 Free Software Foundation, Inc + Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining +@@ -22,1784 +23,119 @@ + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +-#include +-#include ++#include "ffi.h" ++#include "ffi_common.h" ++#include "ffi_powerpc.h" + +-#include +-#include +- +- +-extern void ffi_closure_SYSV (void); +-extern void FFI_HIDDEN ffi_closure_LINUX64 (void); +- +-enum { +- /* The assembly depends on these exact flags. */ +- FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ +- FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */ +-#ifndef __NO_FPRS__ +- FLAG_RETURNS_FP = 1 << (31-29), +-#endif +- FLAG_RETURNS_64BITS = 1 << (31-28), +- +- FLAG_RETURNS_128BITS = 1 << (31-27), /* cr6 */ +- +- FLAG_ARG_NEEDS_COPY = 1 << (31- 7), +- FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by ELFv2 */ +-#ifndef __NO_FPRS__ +- FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ +-#endif +- FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), +- FLAG_RETVAL_REFERENCE = 1 << (31- 4) +-}; +- +-/* About the SYSV ABI. */ +-#define ASM_NEEDS_REGISTERS 4 +-#define NUM_GPR_ARG_REGISTERS 8 +-#ifndef __NO_FPRS__ +-# define NUM_FPR_ARG_REGISTERS 8 +-#endif +- +-/* ffi_prep_args_SYSV is called by the assembly routine once stack space +- has been allocated for the function's arguments. +- +- The stack layout we want looks like this: +- +- | Return address from ffi_call_SYSV 4bytes | higher addresses +- |--------------------------------------------| +- | Previous backchain pointer 4 | stack pointer here +- |--------------------------------------------|<+ <<< on entry to +- | Saved r28-r31 4*4 | | ffi_call_SYSV +- |--------------------------------------------| | +- | GPR registers r3-r10 8*4 | | ffi_call_SYSV +- |--------------------------------------------| | +- | FPR registers f1-f8 (optional) 8*8 | | +- |--------------------------------------------| | stack | +- | Space for copied structures | | grows | +- |--------------------------------------------| | down V +- | Parameters that didn't fit in registers | | +- |--------------------------------------------| | lower addresses +- | Space for callee's LR 4 | | +- |--------------------------------------------| | stack pointer here +- | Current backchain pointer 4 |-/ during +- |--------------------------------------------| <<< ffi_call_SYSV +- +-*/ +- +-void +-ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack) ++#if HAVE_LONG_DOUBLE_VARIANT ++/* Adjust ffi_type_longdouble. */ ++void FFI_HIDDEN ++ffi_prep_types (ffi_abi abi) + { +- const unsigned bytes = ecif->cif->bytes; +- const unsigned flags = ecif->cif->flags; +- +- typedef union { +- char *c; +- unsigned *u; +- long long *ll; +- float *f; +- double *d; +- } valp; +- +- /* 'stacktop' points at the previous backchain pointer. */ +- valp stacktop; +- +- /* 'gpr_base' points at the space for gpr3, and grows upwards as +- we use GPR registers. */ +- valp gpr_base; +- int intarg_count; +- +-#ifndef __NO_FPRS__ +- /* 'fpr_base' points at the space for fpr1, and grows upwards as +- we use FPR registers. */ +- valp fpr_base; +- int fparg_count; +-#endif +- +- /* 'copy_space' grows down as we put structures in it. It should +- stay 16-byte aligned. */ +- valp copy_space; +- +- /* 'next_arg' grows up as we put parameters in it. */ +- valp next_arg; +- +- int i; +- ffi_type **ptr; +-#ifndef __NO_FPRS__ +- double double_tmp; +-#endif +- union { +- void **v; +- char **c; +- signed char **sc; +- unsigned char **uc; +- signed short **ss; +- unsigned short **us; +- unsigned int **ui; +- long long **ll; +- float **f; +- double **d; +- } p_argv; +- size_t struct_copy_size; +- unsigned gprvalue; +- +- stacktop.c = (char *) stack + bytes; +- gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS; +- intarg_count = 0; +-#ifndef __NO_FPRS__ +- fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS; +- fparg_count = 0; +- copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); +-#else +- copy_space.c = gpr_base.c; +-#endif +- next_arg.u = stack + 2; +- +- /* Check that everything starts aligned properly. */ +- FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); +- FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0); +- FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); +- FFI_ASSERT ((bytes & 0xF) == 0); +- FFI_ASSERT (copy_space.c >= next_arg.c); +- +- /* Deal with return values that are actually pass-by-reference. */ +- if (flags & FLAG_RETVAL_REFERENCE) +- { +- *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue; +- intarg_count++; +- } +- +- /* Now for the arguments. */ +- p_argv.v = ecif->avalue; +- for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; +- i > 0; +- i--, ptr++, p_argv.v++) +- { +- unsigned short typenum = (*ptr)->type; +- +- /* We may need to handle some values depending on ABI */ +- if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT) { +- if (typenum == FFI_TYPE_FLOAT) +- typenum = FFI_TYPE_UINT32; +- if (typenum == FFI_TYPE_DOUBLE) +- typenum = FFI_TYPE_UINT64; +- if (typenum == FFI_TYPE_LONGDOUBLE) +- typenum = FFI_TYPE_UINT128; +- } else if (ecif->cif->abi != FFI_LINUX) { +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- if (typenum == FFI_TYPE_LONGDOUBLE) +- typenum = FFI_TYPE_STRUCT; +-#endif +- } +- +- /* Now test the translated value */ +- switch (typenum) { +-#ifndef __NO_FPRS__ +- case FFI_TYPE_FLOAT: +- /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */ +- double_tmp = **p_argv.f; +- if (fparg_count >= NUM_FPR_ARG_REGISTERS) +- { +- *next_arg.f = (float) double_tmp; +- next_arg.u += 1; +- intarg_count++; +- } +- else +- *fpr_base.d++ = double_tmp; +- fparg_count++; +- FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); +- break; +- +- case FFI_TYPE_DOUBLE: +- /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */ +- double_tmp = **p_argv.d; +- +- if (fparg_count >= NUM_FPR_ARG_REGISTERS) +- { +- if (intarg_count >= NUM_GPR_ARG_REGISTERS +- && intarg_count % 2 != 0) +- { +- intarg_count++; +- next_arg.u++; +- } +- *next_arg.d = double_tmp; +- next_arg.u += 2; +- } +- else +- *fpr_base.d++ = double_tmp; +- fparg_count++; +- FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); +- break; +- +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- case FFI_TYPE_LONGDOUBLE: +- double_tmp = (*p_argv.d)[0]; +- +- if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1) +- { +- if (intarg_count >= NUM_GPR_ARG_REGISTERS +- && intarg_count % 2 != 0) +- { +- intarg_count++; +- next_arg.u++; +- } +- *next_arg.d = double_tmp; +- next_arg.u += 2; +- double_tmp = (*p_argv.d)[1]; +- *next_arg.d = double_tmp; +- next_arg.u += 2; +- } +- else +- { +- *fpr_base.d++ = double_tmp; +- double_tmp = (*p_argv.d)[1]; +- *fpr_base.d++ = double_tmp; +- } +- +- fparg_count += 2; +- FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); +- break; +-#endif +-#endif /* have FPRs */ +- +- /* +- * The soft float ABI for long doubles works like this, a long double +- * is passed in four consecutive GPRs if available. A maximum of 2 +- * long doubles can be passed in gprs. If we do not have 4 GPRs +- * left, the long double is passed on the stack, 4-byte aligned. +- */ +- case FFI_TYPE_UINT128: { +- unsigned int int_tmp = (*p_argv.ui)[0]; +- unsigned int ii; +- if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3) { +- if (intarg_count < NUM_GPR_ARG_REGISTERS) +- intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count; +- *(next_arg.u++) = int_tmp; +- for (ii = 1; ii < 4; ii++) { +- int_tmp = (*p_argv.ui)[ii]; +- *(next_arg.u++) = int_tmp; +- } +- } else { +- *(gpr_base.u++) = int_tmp; +- for (ii = 1; ii < 4; ii++) { +- int_tmp = (*p_argv.ui)[ii]; +- *(gpr_base.u++) = int_tmp; +- } +- } +- intarg_count += 4; +- break; +- } +- +- case FFI_TYPE_UINT64: +- case FFI_TYPE_SINT64: +- if (intarg_count == NUM_GPR_ARG_REGISTERS-1) +- intarg_count++; +- if (intarg_count >= NUM_GPR_ARG_REGISTERS) +- { +- if (intarg_count % 2 != 0) +- { +- intarg_count++; +- next_arg.u++; +- } +- *next_arg.ll = **p_argv.ll; +- next_arg.u += 2; +- } +- else +- { +- /* whoops: abi states only certain register pairs +- * can be used for passing long long int +- * specifically (r3,r4), (r5,r6), (r7,r8), +- * (r9,r10) and if next arg is long long but +- * not correct starting register of pair then skip +- * until the proper starting register +- */ +- if (intarg_count % 2 != 0) +- { +- intarg_count ++; +- gpr_base.u++; +- } +- *gpr_base.ll++ = **p_argv.ll; +- } +- intarg_count += 2; +- break; +- +- case FFI_TYPE_STRUCT: +- struct_copy_size = ((*ptr)->size + 15) & ~0xF; +- copy_space.c -= struct_copy_size; +- memcpy (copy_space.c, *p_argv.c, (*ptr)->size); +- +- gprvalue = (unsigned long) copy_space.c; +- +- FFI_ASSERT (copy_space.c > next_arg.c); +- FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); +- goto putgpr; +- +- case FFI_TYPE_UINT8: +- gprvalue = **p_argv.uc; +- goto putgpr; +- case FFI_TYPE_SINT8: +- gprvalue = **p_argv.sc; +- goto putgpr; +- case FFI_TYPE_UINT16: +- gprvalue = **p_argv.us; +- goto putgpr; +- case FFI_TYPE_SINT16: +- gprvalue = **p_argv.ss; +- goto putgpr; +- +- case FFI_TYPE_INT: +- case FFI_TYPE_UINT32: +- case FFI_TYPE_SINT32: +- case FFI_TYPE_POINTER: +- +- gprvalue = **p_argv.ui; +- +- putgpr: +- if (intarg_count >= NUM_GPR_ARG_REGISTERS) +- *next_arg.u++ = gprvalue; +- else +- *gpr_base.u++ = gprvalue; +- intarg_count++; +- break; +- } +- } +- +- /* Check that we didn't overrun the stack... */ +- FFI_ASSERT (copy_space.c >= next_arg.c); +- FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS); +- /* The assert below is testing that the number of integer arguments agrees +- with the number found in ffi_prep_cif_machdep(). However, intarg_count +- is incremented whenever we place an FP arg on the stack, so account for +- that before our assert test. */ +-#ifndef __NO_FPRS__ +- if (fparg_count > NUM_FPR_ARG_REGISTERS) +- intarg_count -= fparg_count - NUM_FPR_ARG_REGISTERS; +- FFI_ASSERT (fpr_base.u +- <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); +-#endif +- FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +-} +- +-/* About the LINUX64 ABI. */ +-enum { +- NUM_GPR_ARG_REGISTERS64 = 8, +- NUM_FPR_ARG_REGISTERS64 = 13 +-}; +-enum { ASM_NEEDS_REGISTERS64 = 4 }; +- +-#if _CALL_ELF == 2 +-static unsigned int +-discover_homogeneous_aggregate (const ffi_type *t, unsigned int *elnum) +-{ +- switch (t->type) +- { +- case FFI_TYPE_FLOAT: +- case FFI_TYPE_DOUBLE: +- *elnum = 1; +- return (int) t->type; +- +- case FFI_TYPE_STRUCT:; +- { +- unsigned int base_elt = 0, total_elnum = 0; +- ffi_type **el = t->elements; +- while (*el) +- { +- unsigned int el_elt, el_elnum = 0; +- el_elt = discover_homogeneous_aggregate (*el, &el_elnum); +- if (el_elt == 0 +- || (base_elt && base_elt != el_elt)) +- return 0; +- base_elt = el_elt; +- total_elnum += el_elnum; +- if (total_elnum > 8) +- return 0; +- el++; +- } +- *elnum = total_elnum; +- return base_elt; +- } +- +- default: +- return 0; +- } ++# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++# ifdef POWERPC64 ++ ffi_prep_types_linux64 (abi); ++# else ++ ffi_prep_types_sysv (abi); ++# endif ++# endif + } + #endif + +- +-/* ffi_prep_args64 is called by the assembly routine once stack space +- has been allocated for the function's arguments. +- +- The stack layout we want looks like this: +- +- | Ret addr from ffi_call_LINUX64 8bytes | higher addresses +- |--------------------------------------------| +- | CR save area 8bytes | +- |--------------------------------------------| +- | Previous backchain pointer 8 | stack pointer here +- |--------------------------------------------|<+ <<< on entry to +- | Saved r28-r31 4*8 | | ffi_call_LINUX64 +- |--------------------------------------------| | +- | GPR registers r3-r10 8*8 | | +- |--------------------------------------------| | +- | FPR registers f1-f13 (optional) 13*8 | | +- |--------------------------------------------| | +- | Parameter save area | | +- |--------------------------------------------| | +- | TOC save area 8 | | +- |--------------------------------------------| | stack | +- | Linker doubleword 8 | | grows | +- |--------------------------------------------| | down V +- | Compiler doubleword 8 | | +- |--------------------------------------------| | lower addresses +- | Space for callee's LR 8 | | +- |--------------------------------------------| | +- | CR save area 8 | | +- |--------------------------------------------| | stack pointer here +- | Current backchain pointer 8 |-/ during +- |--------------------------------------------| <<< ffi_call_LINUX64 +- +-*/ +- +-void FFI_HIDDEN +-ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack) ++/* Perform machine dependent cif processing */ ++ffi_status FFI_HIDDEN ++ffi_prep_cif_machdep (ffi_cif *cif) + { +- const unsigned long bytes = ecif->cif->bytes; +- const unsigned long flags = ecif->cif->flags; +- +- typedef union { +- char *c; +- unsigned long *ul; +- float *f; +- double *d; +- size_t p; +- } valp; +- +- /* 'stacktop' points at the previous backchain pointer. */ +- valp stacktop; +- +- /* 'next_arg' points at the space for gpr3, and grows upwards as +- we use GPR registers, then continues at rest. */ +- valp gpr_base; +- valp gpr_end; +- valp rest; +- valp next_arg; +- +- /* 'fpr_base' points at the space for fpr3, and grows upwards as +- we use FPR registers. */ +- valp fpr_base; +- unsigned int fparg_count; +- +- unsigned int i, words, nargs, nfixedargs; +- ffi_type **ptr; +- double double_tmp; +- union { +- void **v; +- char **c; +- signed char **sc; +- unsigned char **uc; +- signed short **ss; +- unsigned short **us; +- signed int **si; +- unsigned int **ui; +- unsigned long **ul; +- float **f; +- double **d; +- } p_argv; +- unsigned long gprvalue; +-#ifdef __STRUCT_PARM_ALIGN__ +- unsigned long align; ++#ifdef POWERPC64 ++ return ffi_prep_cif_linux64 (cif); ++#else ++ return ffi_prep_cif_sysv (cif); + #endif +- +- stacktop.c = (char *) stack + bytes; +- gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64; +- gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64; +-#if _CALL_ELF == 2 +- rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64; +-#else +- rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; +-#endif +- fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; +- fparg_count = 0; +- next_arg.ul = gpr_base.ul; +- +- /* Check that everything starts aligned properly. */ +- FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); +- FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); +- FFI_ASSERT ((bytes & 0xF) == 0); +- +- /* Deal with return values that are actually pass-by-reference. */ +- if (flags & FLAG_RETVAL_REFERENCE) +- *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; +- +- /* Now for the arguments. */ +- p_argv.v = ecif->avalue; +- nargs = ecif->cif->nargs; +- nfixedargs = ecif->cif->nfixedargs; +- for (ptr = ecif->cif->arg_types, i = 0; +- i < nargs; +- i++, ptr++, p_argv.v++) +- { +- unsigned int elt, elnum; +- +- switch ((*ptr)->type) +- { +- case FFI_TYPE_FLOAT: +- double_tmp = **p_argv.f; +- if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) +- *fpr_base.d++ = double_tmp; +- else +- *next_arg.f = (float) double_tmp; +- if (++next_arg.ul == gpr_end.ul) +- next_arg.ul = rest.ul; +- fparg_count++; +- FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); +- break; +- +- case FFI_TYPE_DOUBLE: +- double_tmp = **p_argv.d; +- if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) +- *fpr_base.d++ = double_tmp; +- else +- *next_arg.d = double_tmp; +- if (++next_arg.ul == gpr_end.ul) +- next_arg.ul = rest.ul; +- fparg_count++; +- FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); +- break; +- +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- case FFI_TYPE_LONGDOUBLE: +- double_tmp = (*p_argv.d)[0]; +- if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) +- *fpr_base.d++ = double_tmp; +- else +- *next_arg.d = double_tmp; +- if (++next_arg.ul == gpr_end.ul) +- next_arg.ul = rest.ul; +- fparg_count++; +- double_tmp = (*p_argv.d)[1]; +- if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) +- *fpr_base.d++ = double_tmp; +- else +- *next_arg.d = double_tmp; +- if (++next_arg.ul == gpr_end.ul) +- next_arg.ul = rest.ul; +- fparg_count++; +- FFI_ASSERT (__LDBL_MANT_DIG__ == 106); +- FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); +- break; +-#endif +- +- case FFI_TYPE_STRUCT: +-#ifdef __STRUCT_PARM_ALIGN__ +- align = (*ptr)->alignment; +- if (align > __STRUCT_PARM_ALIGN__) +- align = __STRUCT_PARM_ALIGN__; +- if (align > 1) +- next_arg.p = ALIGN (next_arg.p, align); +-#endif +- elt = 0; +-#if _CALL_ELF == 2 +- elt = discover_homogeneous_aggregate (*ptr, &elnum); +-#endif +- if (elt) +- { +- union { +- void *v; +- float *f; +- double *d; +- } arg; +- +- arg.v = *p_argv.v; +- if (elt == FFI_TYPE_FLOAT) +- { +- do +- { +- double_tmp = *arg.f++; +- if (fparg_count < NUM_FPR_ARG_REGISTERS64 +- && i < nfixedargs) +- *fpr_base.d++ = double_tmp; +- else +- *next_arg.f = (float) double_tmp; +- if (++next_arg.f == gpr_end.f) +- next_arg.f = rest.f; +- fparg_count++; +- } +- while (--elnum != 0); +- if ((next_arg.p & 3) != 0) +- { +- if (++next_arg.f == gpr_end.f) +- next_arg.f = rest.f; +- } +- } +- else +- do +- { +- double_tmp = *arg.d++; +- if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) +- *fpr_base.d++ = double_tmp; +- else +- *next_arg.d = double_tmp; +- if (++next_arg.d == gpr_end.d) +- next_arg.d = rest.d; +- fparg_count++; +- } +- while (--elnum != 0); +- } +- else +- { +- words = ((*ptr)->size + 7) / 8; +- if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) +- { +- size_t first = gpr_end.c - next_arg.c; +- memcpy (next_arg.c, *p_argv.c, first); +- memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first); +- next_arg.c = rest.c + words * 8 - first; +- } +- else +- { +- char *where = next_arg.c; +- +-#ifndef __LITTLE_ENDIAN__ +- /* Structures with size less than eight bytes are passed +- left-padded. */ +- if ((*ptr)->size < 8) +- where += 8 - (*ptr)->size; +-#endif +- memcpy (where, *p_argv.c, (*ptr)->size); +- next_arg.ul += words; +- if (next_arg.ul == gpr_end.ul) +- next_arg.ul = rest.ul; +- } +- } +- break; +- +- case FFI_TYPE_UINT8: +- gprvalue = **p_argv.uc; +- goto putgpr; +- case FFI_TYPE_SINT8: +- gprvalue = **p_argv.sc; +- goto putgpr; +- case FFI_TYPE_UINT16: +- gprvalue = **p_argv.us; +- goto putgpr; +- case FFI_TYPE_SINT16: +- gprvalue = **p_argv.ss; +- goto putgpr; +- case FFI_TYPE_UINT32: +- gprvalue = **p_argv.ui; +- goto putgpr; +- case FFI_TYPE_INT: +- case FFI_TYPE_SINT32: +- gprvalue = **p_argv.si; +- goto putgpr; +- +- case FFI_TYPE_UINT64: +- case FFI_TYPE_SINT64: +- case FFI_TYPE_POINTER: +- gprvalue = **p_argv.ul; +- putgpr: +- *next_arg.ul++ = gprvalue; +- if (next_arg.ul == gpr_end.ul) +- next_arg.ul = rest.ul; +- break; +- } +- } +- +- FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS +- || (next_arg.ul >= gpr_base.ul +- && next_arg.ul <= gpr_base.ul + 4)); + } + +- +- +-/* Perform machine dependent cif processing */ +-static ffi_status +-ffi_prep_cif_machdep_core (ffi_cif *cif) +-{ +- /* All this is for the SYSV and LINUX64 ABI. */ +- ffi_type **ptr; +- unsigned bytes; +- unsigned i, fparg_count = 0, intarg_count = 0; +- unsigned flags = cif->flags; +- unsigned struct_copy_size = 0; +- unsigned type = cif->rtype->type; +- unsigned size = cif->rtype->size; +- +- /* The machine-independent calculation of cif->bytes doesn't work +- for us. Redo the calculation. */ +- if (cif->abi != FFI_LINUX64) +- { +- /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ +- bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); +- +- /* Space for the GPR registers. */ +- bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); +- } +- else +- { +- /* 64-bit ABI. */ +-#if _CALL_ELF == 2 +- /* Space for backchain, CR, LR, TOC and the asm's temp regs. */ +- bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long); +- +- /* Space for the general registers. */ +- bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long); +-#else +- /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp +- regs. */ +- bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long); +- +- /* Space for the mandatory parm save area and general registers. */ +- bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long); +-#endif +- } +- +- /* Return value handling. The rules for SYSV are as follows: +- - 32-bit (or less) integer values are returned in gpr3; +- - Structures of size <= 4 bytes also returned in gpr3; +- - 64-bit integer values and structures between 5 and 8 bytes are returned +- in gpr3 and gpr4; +- - Single/double FP values are returned in fpr1; +- - Larger structures are allocated space and a pointer is passed as +- the first argument. +- - long doubles (if not equivalent to double) are returned in +- fpr1,fpr2 for Linux and as for large structs for SysV. +- For LINUX64: +- - integer values in gpr3; +- - Structures/Unions by reference; +- - Single/double FP values in fpr1, long double in fpr1,fpr2. +- - soft-float float/doubles are treated as UINT32/UINT64 respectivley. +- - soft-float long doubles are returned in gpr3-gpr6. */ +- /* First translate for softfloat/nonlinux */ +- if (cif->abi == FFI_LINUX_SOFT_FLOAT) +- { +- if (type == FFI_TYPE_FLOAT) +- type = FFI_TYPE_UINT32; +- if (type == FFI_TYPE_DOUBLE) +- type = FFI_TYPE_UINT64; +- if (type == FFI_TYPE_LONGDOUBLE) +- type = FFI_TYPE_UINT128; +- } +- else if (cif->abi != FFI_LINUX +- && cif->abi != FFI_LINUX64) +- { +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- if (type == FFI_TYPE_LONGDOUBLE) +- type = FFI_TYPE_STRUCT; +-#endif +- } +- +- switch (type) +- { +-#ifndef __NO_FPRS__ +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- case FFI_TYPE_LONGDOUBLE: +- flags |= FLAG_RETURNS_128BITS; +- /* Fall through. */ +-#endif +- case FFI_TYPE_DOUBLE: +- flags |= FLAG_RETURNS_64BITS; +- /* Fall through. */ +- case FFI_TYPE_FLOAT: +- flags |= FLAG_RETURNS_FP; +- break; +-#endif +- +- case FFI_TYPE_UINT128: +- flags |= FLAG_RETURNS_128BITS; +- /* Fall through. */ +- case FFI_TYPE_UINT64: +- case FFI_TYPE_SINT64: +- flags |= FLAG_RETURNS_64BITS; +- break; +- +- case FFI_TYPE_STRUCT: +- /* +- * The final SYSV ABI says that structures smaller or equal 8 bytes +- * are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them +- * in memory. +- * +- * NOTE: The assembly code can safely assume that it just needs to +- * store both r3 and r4 into a 8-byte word-aligned buffer, as +- * we allocate a temporary buffer in ffi_call() if this flag is +- * set. +- */ +- if (cif->abi == FFI_SYSV && size <= 8) +- { +- flags |= FLAG_RETURNS_SMST; +- break; +- } +-#if _CALL_ELF == 2 +- if (cif->abi == FFI_LINUX64) +- { +- unsigned int elt, elnum; +- elt = discover_homogeneous_aggregate (cif->rtype, &elnum); +- if (elt) +- { +- if (elt == FFI_TYPE_DOUBLE) +- flags |= FLAG_RETURNS_64BITS; +- flags |= FLAG_RETURNS_FP | FLAG_RETURNS_SMST; +- break; +- } +- if (size <= 16) +- { +- flags |= FLAG_RETURNS_SMST; +- break; +- } +- } +-#endif +- intarg_count++; +- flags |= FLAG_RETVAL_REFERENCE; +- /* Fall through. */ +- case FFI_TYPE_VOID: +- flags |= FLAG_RETURNS_NOTHING; +- break; +- +- default: +- /* Returns 32-bit integer, or similar. Nothing to do here. */ +- break; +- } +- +- if (cif->abi != FFI_LINUX64) +- /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the +- first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest +- goes on the stack. Structures and long doubles (if not equivalent +- to double) are passed as a pointer to a copy of the structure. +- Stuff on the stack needs to keep proper alignment. */ +- for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) +- { +- unsigned short typenum = (*ptr)->type; +- +- /* We may need to handle some values depending on ABI */ +- if (cif->abi == FFI_LINUX_SOFT_FLOAT) { +- if (typenum == FFI_TYPE_FLOAT) +- typenum = FFI_TYPE_UINT32; +- if (typenum == FFI_TYPE_DOUBLE) +- typenum = FFI_TYPE_UINT64; +- if (typenum == FFI_TYPE_LONGDOUBLE) +- typenum = FFI_TYPE_UINT128; +- } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) { +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- if (typenum == FFI_TYPE_LONGDOUBLE) +- typenum = FFI_TYPE_STRUCT; +-#endif +- } +- +- switch (typenum) { +-#ifndef __NO_FPRS__ +- case FFI_TYPE_FLOAT: +- fparg_count++; +- /* floating singles are not 8-aligned on stack */ +- break; +- +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- case FFI_TYPE_LONGDOUBLE: +- fparg_count++; +- /* Fall thru */ +-#endif +- case FFI_TYPE_DOUBLE: +- fparg_count++; +- /* If this FP arg is going on the stack, it must be +- 8-byte-aligned. */ +- if (fparg_count > NUM_FPR_ARG_REGISTERS +- && intarg_count >= NUM_GPR_ARG_REGISTERS +- && intarg_count % 2 != 0) +- intarg_count++; +- break; +-#endif +- case FFI_TYPE_UINT128: +- /* +- * A long double in FFI_LINUX_SOFT_FLOAT can use only a set +- * of four consecutive gprs. If we do not have enough, we +- * have to adjust the intarg_count value. +- */ +- if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3 +- && intarg_count < NUM_GPR_ARG_REGISTERS) +- intarg_count = NUM_GPR_ARG_REGISTERS; +- intarg_count += 4; +- break; +- +- case FFI_TYPE_UINT64: +- case FFI_TYPE_SINT64: +- /* 'long long' arguments are passed as two words, but +- either both words must fit in registers or both go +- on the stack. If they go on the stack, they must +- be 8-byte-aligned. +- +- Also, only certain register pairs can be used for +- passing long long int -- specifically (r3,r4), (r5,r6), +- (r7,r8), (r9,r10). +- */ +- if (intarg_count == NUM_GPR_ARG_REGISTERS-1 +- || intarg_count % 2 != 0) +- intarg_count++; +- intarg_count += 2; +- break; +- +- case FFI_TYPE_STRUCT: +- /* We must allocate space for a copy of these to enforce +- pass-by-value. Pad the space up to a multiple of 16 +- bytes (the maximum alignment required for anything under +- the SYSV ABI). */ +- struct_copy_size += ((*ptr)->size + 15) & ~0xF; +- /* Fall through (allocate space for the pointer). */ +- +- case FFI_TYPE_POINTER: +- case FFI_TYPE_INT: +- case FFI_TYPE_UINT32: +- case FFI_TYPE_SINT32: +- case FFI_TYPE_UINT16: +- case FFI_TYPE_SINT16: +- case FFI_TYPE_UINT8: +- case FFI_TYPE_SINT8: +- /* Everything else is passed as a 4-byte word in a GPR, either +- the object itself or a pointer to it. */ +- intarg_count++; +- break; +- default: +- FFI_ASSERT (0); +- } +- } +- else +- for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) +- { +- unsigned int elt, elnum; +-#ifdef __STRUCT_PARM_ALIGN__ +- unsigned int align; +-#endif +- +- switch ((*ptr)->type) +- { +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- case FFI_TYPE_LONGDOUBLE: +- fparg_count += 2; +- intarg_count += 2; +- if (fparg_count > NUM_FPR_ARG_REGISTERS64) +- flags |= FLAG_ARG_NEEDS_PSAVE; +- break; +-#endif +- case FFI_TYPE_FLOAT: +- case FFI_TYPE_DOUBLE: +- fparg_count++; +- intarg_count++; +- if (fparg_count > NUM_FPR_ARG_REGISTERS64) +- flags |= FLAG_ARG_NEEDS_PSAVE; +- break; +- +- case FFI_TYPE_STRUCT: +-#ifdef __STRUCT_PARM_ALIGN__ +- align = (*ptr)->alignment; +- if (align > __STRUCT_PARM_ALIGN__) +- align = __STRUCT_PARM_ALIGN__; +- align = align / 8; +- if (align > 1) +- intarg_count = ALIGN (intarg_count, align); +-#endif +- intarg_count += ((*ptr)->size + 7) / 8; +- elt = 0; +-#if _CALL_ELF == 2 +- elt = discover_homogeneous_aggregate (*ptr, &elnum); +-#endif +- if (elt) +- { +- fparg_count += elnum; +- if (fparg_count > NUM_FPR_ARG_REGISTERS64) +- flags |= FLAG_ARG_NEEDS_PSAVE; +- } +- else +- { +- if (intarg_count > NUM_GPR_ARG_REGISTERS64) +- flags |= FLAG_ARG_NEEDS_PSAVE; +- } +- break; +- +- case FFI_TYPE_POINTER: +- case FFI_TYPE_UINT64: +- case FFI_TYPE_SINT64: +- case FFI_TYPE_INT: +- case FFI_TYPE_UINT32: +- case FFI_TYPE_SINT32: +- case FFI_TYPE_UINT16: +- case FFI_TYPE_SINT16: +- case FFI_TYPE_UINT8: +- case FFI_TYPE_SINT8: +- /* Everything else is passed as a 8-byte word in a GPR, either +- the object itself or a pointer to it. */ +- intarg_count++; +- if (intarg_count > NUM_GPR_ARG_REGISTERS64) +- flags |= FLAG_ARG_NEEDS_PSAVE; +- break; +- default: +- FFI_ASSERT (0); +- } +- } +- +-#ifndef __NO_FPRS__ +- if (fparg_count != 0) +- flags |= FLAG_FP_ARGUMENTS; +-#endif +- if (intarg_count > 4) +- flags |= FLAG_4_GPR_ARGUMENTS; +- if (struct_copy_size != 0) +- flags |= FLAG_ARG_NEEDS_COPY; +- +- if (cif->abi != FFI_LINUX64) +- { +-#ifndef __NO_FPRS__ +- /* Space for the FPR registers, if needed. */ +- if (fparg_count != 0) +- bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); +-#endif +- +- /* Stack space. */ +- if (intarg_count > NUM_GPR_ARG_REGISTERS) +- bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int); +-#ifndef __NO_FPRS__ +- if (fparg_count > NUM_FPR_ARG_REGISTERS) +- bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double); +-#endif +- } +- else +- { +-#ifndef __NO_FPRS__ +- /* Space for the FPR registers, if needed. */ +- if (fparg_count != 0) +- bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); +-#endif +- +- /* Stack space. */ +-#if _CALL_ELF == 2 +- if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0) +- bytes += intarg_count * sizeof (long); +-#else +- if (intarg_count > NUM_GPR_ARG_REGISTERS64) +- bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); +-#endif +- } +- +- /* The stack space allocated needs to be a multiple of 16 bytes. */ +- bytes = (bytes + 15) & ~0xF; +- +- /* Add in the space for the copied structures. */ +- bytes += struct_copy_size; +- +- cif->flags = flags; +- cif->bytes = bytes; +- +- return FFI_OK; +-} +- +-ffi_status +-ffi_prep_cif_machdep (ffi_cif *cif) +-{ +- cif->nfixedargs = cif->nargs; +- return ffi_prep_cif_machdep_core (cif); +-} +- +-ffi_status ++ffi_status FFI_HIDDEN + ffi_prep_cif_machdep_var (ffi_cif *cif, +- unsigned int nfixedargs, ++ unsigned int nfixedargs MAYBE_UNUSED, + unsigned int ntotalargs MAYBE_UNUSED) + { +- cif->nfixedargs = nfixedargs; +-#if _CALL_ELF == 2 +- if (cif->abi == FFI_LINUX64) +- cif->flags |= FLAG_ARG_NEEDS_PSAVE; ++#ifdef POWERPC64 ++ return ffi_prep_cif_linux64_var (cif, nfixedargs, ntotalargs); ++#else ++ return ffi_prep_cif_sysv (cif); + #endif +- return ffi_prep_cif_machdep_core (cif); + } + +-extern void ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *, +- void (*fn)(void)); +-extern void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long, +- unsigned long, unsigned long *, +- void (*fn)(void)); +- + void + ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) + { +- /* +- * The final SYSV ABI says that structures smaller or equal 8 bytes +- * are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them +- * in memory. +- * +- * We bounce-buffer SYSV small struct return values so that sysv.S +- * can write r3 and r4 to memory without worrying about struct size. +- * +- * For ELFv2 ABI, use a bounce buffer for homogeneous structs too, +- * for similar reasons. +- */ ++ /* The final SYSV ABI says that structures smaller or equal 8 bytes ++ are returned in r3/r4. A draft ABI used by linux instead returns ++ them in memory. ++ ++ We bounce-buffer SYSV small struct return values so that sysv.S ++ can write r3 and r4 to memory without worrying about struct size. ++ ++ For ELFv2 ABI, use a bounce buffer for homogeneous structs too, ++ for similar reasons. */ + unsigned long smst_buffer[8]; + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + ecif.rvalue = rvalue; + if ((cif->flags & FLAG_RETURNS_SMST) != 0) + ecif.rvalue = smst_buffer; + /* Ensure that we have a valid struct return value. + FIXME: Isn't this just papering over a user problem? */ + else if (!rvalue && cif->rtype->type == FFI_TYPE_STRUCT) + ecif.rvalue = alloca (cif->rtype->size); + +- switch (cif->abi) +- { +-#ifndef POWERPC64 +-# ifndef __NO_FPRS__ +- case FFI_SYSV: +- case FFI_GCC_SYSV: +- case FFI_LINUX: +-# endif +- case FFI_LINUX_SOFT_FLOAT: +- ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn); +- break; ++#ifdef POWERPC64 ++ ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn); + #else +- case FFI_LINUX64: +- ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn); +- break; ++ ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn); + #endif +- default: +- FFI_ASSERT (0); +- break; +- } + + /* Check for a bounce-buffered return value */ + if (rvalue && ecif.rvalue == smst_buffer) + { + unsigned int rsize = cif->rtype->size; + #ifndef __LITTLE_ENDIAN__ + /* The SYSV ABI returns a structure of up to 4 bytes in size + left-padded in r3. */ +- if (cif->abi == FFI_SYSV && rsize <= 4) ++# ifndef POWERPC64 ++ if (rsize <= 4) + memcpy (rvalue, (char *) smst_buffer + 4 - rsize, rsize); +- /* The SYSV ABI returns a structure of up to 8 bytes in size +- left-padded in r3/r4, and the ELFv2 ABI similarly returns a +- structure of up to 8 bytes in size left-padded in r3. */ +- else if (rsize <= 8) +- memcpy (rvalue, (char *) smst_buffer + 8 - rsize, rsize); + else ++# endif ++ /* The SYSV ABI returns a structure of up to 8 bytes in size ++ left-padded in r3/r4, and the ELFv2 ABI similarly returns a ++ structure of up to 8 bytes in size left-padded in r3. */ ++ if (rsize <= 8) ++ memcpy (rvalue, (char *) smst_buffer + 8 - rsize, rsize); ++ else + #endif +- memcpy (rvalue, smst_buffer, rsize); ++ memcpy (rvalue, smst_buffer, rsize); + } + } + + +-#if !defined POWERPC64 || _CALL_ELF == 2 +-#define MIN_CACHE_LINE_SIZE 8 +- +-static void +-flush_icache (char *wraddr, char *xaddr, int size) +-{ +- int i; +- for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) +- __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" +- : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); +- __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" +- : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) +- : "memory"); +-} +-#endif +- + ffi_status + ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) + { + #ifdef POWERPC64 +-# if _CALL_ELF == 2 +- unsigned int *tramp = (unsigned int *) &closure->tramp[0]; +- +- if (cif->abi != FFI_LINUX64) +- return FFI_BAD_ABI; +- +- tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ +- tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */ +- tramp[2] = 0x7d8903a6; /* mtctr 12 */ +- tramp[3] = 0x4e800420; /* bctr */ +- /* 1: .quad function_addr */ +- /* 2: .quad context */ +- *(void **) &tramp[4] = (void *) ffi_closure_LINUX64; +- *(void **) &tramp[6] = codeloc; +- flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); +-# else +- void **tramp = (void **) &closure->tramp[0]; +- +- if (cif->abi != FFI_LINUX64) +- return FFI_BAD_ABI; +- /* Copy function address and TOC from ffi_closure_LINUX64. */ +- memcpy (tramp, (char *) ffi_closure_LINUX64, 16); +- tramp[2] = codeloc; +-# endif ++ return ffi_prep_closure_loc_linux64 (closure, cif, fun, user_data, codeloc); + #else +- unsigned int *tramp; +- +- if (! (cif->abi == FFI_GCC_SYSV +- || cif->abi == FFI_SYSV +- || cif->abi == FFI_LINUX +- || cif->abi == FFI_LINUX_SOFT_FLOAT)) +- return FFI_BAD_ABI; +- +- tramp = (unsigned int *) &closure->tramp[0]; +- tramp[0] = 0x7c0802a6; /* mflr r0 */ +- tramp[1] = 0x4800000d; /* bl 10 */ +- tramp[4] = 0x7d6802a6; /* mflr r11 */ +- tramp[5] = 0x7c0803a6; /* mtlr r0 */ +- tramp[6] = 0x800b0000; /* lwz r0,0(r11) */ +- tramp[7] = 0x816b0004; /* lwz r11,4(r11) */ +- tramp[8] = 0x7c0903a6; /* mtctr r0 */ +- tramp[9] = 0x4e800420; /* bctr */ +- *(void **) &tramp[2] = (void *) ffi_closure_SYSV; /* function */ +- *(void **) &tramp[3] = codeloc; /* context */ +- +- /* Flush the icache. */ +- flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); ++ return ffi_prep_closure_loc_sysv (closure, cif, fun, user_data, codeloc); + #endif +- +- closure->cif = cif; +- closure->fun = fun; +- closure->user_data = user_data; +- +- return FFI_OK; + } +- +-typedef union +-{ +- float f; +- double d; +-} ffi_dblfl; +- +-int ffi_closure_helper_SYSV (ffi_closure *, void *, unsigned long *, +- ffi_dblfl *, unsigned long *); +- +-/* Basically the trampoline invokes ffi_closure_SYSV, and on +- * entry, r11 holds the address of the closure. +- * After storing the registers that could possibly contain +- * parameters to be passed into the stack frame and setting +- * up space for a return value, ffi_closure_SYSV invokes the +- * following helper function to do most of the work +- */ +- +-int +-ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, +- unsigned long *pgr, ffi_dblfl *pfr, +- unsigned long *pst) +-{ +- /* rvalue is the pointer to space for return value in closure assembly */ +- /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ +- /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ +- /* pst is the pointer to outgoing parameter stack in original caller */ +- +- void ** avalue; +- ffi_type ** arg_types; +- long i, avn; +-#ifndef __NO_FPRS__ +- long nf = 0; /* number of floating registers already used */ +-#endif +- long ng = 0; /* number of general registers already used */ +- +- ffi_cif *cif = closure->cif; +- unsigned size = cif->rtype->size; +- unsigned short rtypenum = cif->rtype->type; +- +- avalue = alloca (cif->nargs * sizeof (void *)); +- +- /* First translate for softfloat/nonlinux */ +- if (cif->abi == FFI_LINUX_SOFT_FLOAT) { +- if (rtypenum == FFI_TYPE_FLOAT) +- rtypenum = FFI_TYPE_UINT32; +- if (rtypenum == FFI_TYPE_DOUBLE) +- rtypenum = FFI_TYPE_UINT64; +- if (rtypenum == FFI_TYPE_LONGDOUBLE) +- rtypenum = FFI_TYPE_UINT128; +- } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) { +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- if (rtypenum == FFI_TYPE_LONGDOUBLE) +- rtypenum = FFI_TYPE_STRUCT; +-#endif +- } +- +- +- /* Copy the caller's structure return value address so that the closure +- returns the data directly to the caller. +- For FFI_SYSV the result is passed in r3/r4 if the struct size is less +- or equal 8 bytes. */ +- if (rtypenum == FFI_TYPE_STRUCT && ((cif->abi != FFI_SYSV) || (size > 8))) { +- rvalue = (void *) *pgr; +- ng++; +- pgr++; +- } +- +- i = 0; +- avn = cif->nargs; +- arg_types = cif->arg_types; +- +- /* Grab the addresses of the arguments from the stack frame. */ +- while (i < avn) { +- unsigned short typenum = arg_types[i]->type; +- +- /* We may need to handle some values depending on ABI */ +- if (cif->abi == FFI_LINUX_SOFT_FLOAT) { +- if (typenum == FFI_TYPE_FLOAT) +- typenum = FFI_TYPE_UINT32; +- if (typenum == FFI_TYPE_DOUBLE) +- typenum = FFI_TYPE_UINT64; +- if (typenum == FFI_TYPE_LONGDOUBLE) +- typenum = FFI_TYPE_UINT128; +- } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) { +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- if (typenum == FFI_TYPE_LONGDOUBLE) +- typenum = FFI_TYPE_STRUCT; +-#endif +- } +- +- switch (typenum) { +-#ifndef __NO_FPRS__ +- case FFI_TYPE_FLOAT: +- /* unfortunately float values are stored as doubles +- * in the ffi_closure_SYSV code (since we don't check +- * the type in that routine). +- */ +- +- /* there are 8 64bit floating point registers */ +- +- if (nf < 8) +- { +- double temp = pfr->d; +- pfr->f = (float) temp; +- avalue[i] = pfr; +- nf++; +- pfr++; +- } +- else +- { +- /* FIXME? here we are really changing the values +- * stored in the original calling routines outgoing +- * parameter stack. This is probably a really +- * naughty thing to do but... +- */ +- avalue[i] = pst; +- pst += 1; +- } +- break; +- +- case FFI_TYPE_DOUBLE: +- /* On the outgoing stack all values are aligned to 8 */ +- /* there are 8 64bit floating point registers */ +- +- if (nf < 8) +- { +- avalue[i] = pfr; +- nf++; +- pfr++; +- } +- else +- { +- if (((long) pst) & 4) +- pst++; +- avalue[i] = pst; +- pst += 2; +- } +- break; +- +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- case FFI_TYPE_LONGDOUBLE: +- if (nf < 7) +- { +- avalue[i] = pfr; +- pfr += 2; +- nf += 2; +- } +- else +- { +- if (((long) pst) & 4) +- pst++; +- avalue[i] = pst; +- pst += 4; +- nf = 8; +- } +- break; +-#endif +-#endif /* have FPRS */ +- +- case FFI_TYPE_UINT128: +- /* +- * Test if for the whole long double, 4 gprs are available. +- * otherwise the stuff ends up on the stack. +- */ +- if (ng < 5) { +- avalue[i] = pgr; +- pgr += 4; +- ng += 4; +- } else { +- avalue[i] = pst; +- pst += 4; +- ng = 8+4; +- } +- break; +- +- case FFI_TYPE_SINT8: +- case FFI_TYPE_UINT8: +-#ifndef __LITTLE_ENDIAN__ +- /* there are 8 gpr registers used to pass values */ +- if (ng < 8) +- { +- avalue[i] = (char *) pgr + 3; +- ng++; +- pgr++; +- } +- else +- { +- avalue[i] = (char *) pst + 3; +- pst++; +- } +- break; +-#endif +- +- case FFI_TYPE_SINT16: +- case FFI_TYPE_UINT16: +-#ifndef __LITTLE_ENDIAN__ +- /* there are 8 gpr registers used to pass values */ +- if (ng < 8) +- { +- avalue[i] = (char *) pgr + 2; +- ng++; +- pgr++; +- } +- else +- { +- avalue[i] = (char *) pst + 2; +- pst++; +- } +- break; +-#endif +- +- case FFI_TYPE_SINT32: +- case FFI_TYPE_UINT32: +- case FFI_TYPE_POINTER: +- /* there are 8 gpr registers used to pass values */ +- if (ng < 8) +- { +- avalue[i] = pgr; +- ng++; +- pgr++; +- } +- else +- { +- avalue[i] = pst; +- pst++; +- } +- break; +- +- case FFI_TYPE_STRUCT: +- /* Structs are passed by reference. The address will appear in a +- gpr if it is one of the first 8 arguments. */ +- if (ng < 8) +- { +- avalue[i] = (void *) *pgr; +- ng++; +- pgr++; +- } +- else +- { +- avalue[i] = (void *) *pst; +- pst++; +- } +- break; +- +- case FFI_TYPE_SINT64: +- case FFI_TYPE_UINT64: +- /* passing long long ints are complex, they must +- * be passed in suitable register pairs such as +- * (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) +- * and if the entire pair aren't available then the outgoing +- * parameter stack is used for both but an alignment of 8 +- * must will be kept. So we must either look in pgr +- * or pst to find the correct address for this type +- * of parameter. +- */ +- if (ng < 7) +- { +- if (ng & 0x01) +- { +- /* skip r4, r6, r8 as starting points */ +- ng++; +- pgr++; +- } +- avalue[i] = pgr; +- ng += 2; +- pgr += 2; +- } +- else +- { +- if (((long) pst) & 4) +- pst++; +- avalue[i] = pst; +- pst += 2; +- ng = 8; +- } +- break; +- +- default: +- FFI_ASSERT (0); +- } +- +- i++; +- } +- +- +- (closure->fun) (cif, rvalue, avalue, closure->user_data); +- +- /* Tell ffi_closure_SYSV how to perform return type promotions. +- Because the FFI_SYSV ABI returns the structures <= 8 bytes in r3/r4 +- we have to tell ffi_closure_SYSV how to treat them. We combine the base +- type FFI_SYSV_TYPE_SMALL_STRUCT - 1 with the size of the struct. +- So a one byte struct gets the return type 16. Return type 1 to 15 are +- already used and we never have a struct with size zero. That is the reason +- for the subtraction of 1. See the comment in ffitarget.h about ordering. +- */ +- if (cif->abi == FFI_SYSV && rtypenum == FFI_TYPE_STRUCT && size <= 8) +- return (FFI_SYSV_TYPE_SMALL_STRUCT - 1) + size; +- return rtypenum; +-} +- +-int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *, +- unsigned long *, ffi_dblfl *); +- +-int FFI_HIDDEN +-ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue, +- unsigned long *pst, ffi_dblfl *pfr) +-{ +- /* rvalue is the pointer to space for return value in closure assembly */ +- /* pst is the pointer to parameter save area +- (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ +- /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ +- +- void **avalue; +- ffi_type **arg_types; +- unsigned long i, avn, nfixedargs; +- ffi_cif *cif; +- ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; +-#ifdef __STRUCT_PARM_ALIGN__ +- unsigned long align; +-#endif +- +- cif = closure->cif; +- avalue = alloca (cif->nargs * sizeof (void *)); +- +- /* Copy the caller's structure return value address so that the +- closure returns the data directly to the caller. */ +- if (cif->rtype->type == FFI_TYPE_STRUCT +- && (cif->flags & FLAG_RETURNS_SMST) == 0) +- { +- rvalue = (void *) *pst; +- pst++; +- } +- +- i = 0; +- avn = cif->nargs; +- nfixedargs = cif->nfixedargs; +- arg_types = cif->arg_types; +- +- /* Grab the addresses of the arguments from the stack frame. */ +- while (i < avn) +- { +- unsigned int elt, elnum; +- +- switch (arg_types[i]->type) +- { +- case FFI_TYPE_SINT8: +- case FFI_TYPE_UINT8: +-#ifndef __LITTLE_ENDIAN__ +- avalue[i] = (char *) pst + 7; +- pst++; +- break; +-#endif +- +- case FFI_TYPE_SINT16: +- case FFI_TYPE_UINT16: +-#ifndef __LITTLE_ENDIAN__ +- avalue[i] = (char *) pst + 6; +- pst++; +- break; +-#endif +- +- case FFI_TYPE_SINT32: +- case FFI_TYPE_UINT32: +-#ifndef __LITTLE_ENDIAN__ +- avalue[i] = (char *) pst + 4; +- pst++; +- break; +-#endif +- +- case FFI_TYPE_SINT64: +- case FFI_TYPE_UINT64: +- case FFI_TYPE_POINTER: +- avalue[i] = pst; +- pst++; +- break; +- +- case FFI_TYPE_STRUCT: +-#ifdef __STRUCT_PARM_ALIGN__ +- align = arg_types[i]->alignment; +- if (align > __STRUCT_PARM_ALIGN__) +- align = __STRUCT_PARM_ALIGN__; +- if (align > 1) +- pst = (unsigned long *) ALIGN ((size_t) pst, align); +-#endif +- elt = 0; +-#if _CALL_ELF == 2 +- elt = discover_homogeneous_aggregate (arg_types[i], &elnum); +-#endif +- if (elt) +- { +- union { +- void *v; +- unsigned long *ul; +- float *f; +- double *d; +- size_t p; +- } to, from; +- +- /* Repackage the aggregate from its parts. The +- aggregate size is not greater than the space taken by +- the registers so store back to the register/parameter +- save arrays. */ +- if (pfr + elnum <= end_pfr) +- to.v = pfr; +- else +- to.v = pst; +- +- avalue[i] = to.v; +- from.ul = pst; +- if (elt == FFI_TYPE_FLOAT) +- { +- do +- { +- if (pfr < end_pfr && i < nfixedargs) +- { +- *to.f = (float) pfr->d; +- pfr++; +- } +- else +- *to.f = *from.f; +- to.f++; +- from.f++; +- } +- while (--elnum != 0); +- } +- else +- { +- do +- { +- if (pfr < end_pfr && i < nfixedargs) +- { +- *to.d = pfr->d; +- pfr++; +- } +- else +- *to.d = *from.d; +- to.d++; +- from.d++; +- } +- while (--elnum != 0); +- } +- } +- else +- { +-#ifndef __LITTLE_ENDIAN__ +- /* Structures with size less than eight bytes are passed +- left-padded. */ +- if (arg_types[i]->size < 8) +- avalue[i] = (char *) pst + 8 - arg_types[i]->size; +- else +-#endif +- avalue[i] = pst; +- } +- pst += (arg_types[i]->size + 7) / 8; +- break; +- +- case FFI_TYPE_FLOAT: +- /* unfortunately float values are stored as doubles +- * in the ffi_closure_LINUX64 code (since we don't check +- * the type in that routine). +- */ +- +- /* there are 13 64bit floating point registers */ +- +- if (pfr < end_pfr && i < nfixedargs) +- { +- double temp = pfr->d; +- pfr->f = (float) temp; +- avalue[i] = pfr; +- pfr++; +- } +- else +- avalue[i] = pst; +- pst++; +- break; +- +- case FFI_TYPE_DOUBLE: +- /* On the outgoing stack all values are aligned to 8 */ +- /* there are 13 64bit floating point registers */ +- +- if (pfr < end_pfr && i < nfixedargs) +- { +- avalue[i] = pfr; +- pfr++; +- } +- else +- avalue[i] = pst; +- pst++; +- break; +- +-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- case FFI_TYPE_LONGDOUBLE: +- if (pfr + 1 < end_pfr && i + 1 < nfixedargs) +- { +- avalue[i] = pfr; +- pfr += 2; +- } +- else +- { +- if (pfr < end_pfr && i < nfixedargs) +- { +- /* Passed partly in f13 and partly on the stack. +- Move it all to the stack. */ +- *pst = *(unsigned long *) pfr; +- pfr++; +- } +- avalue[i] = pst; +- } +- pst += 2; +- break; +-#endif +- +- default: +- FFI_ASSERT (0); +- } +- +- i++; +- } +- +- +- (closure->fun) (cif, rvalue, avalue, closure->user_data); +- +- /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ +- if ((cif->flags & FLAG_RETURNS_SMST) != 0) +- { +- if ((cif->flags & FLAG_RETURNS_FP) == 0) +- return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1; +- else if ((cif->flags & FLAG_RETURNS_64BITS) != 0) +- return FFI_V2_TYPE_DOUBLE_HOMOG; +- else +- return FFI_V2_TYPE_FLOAT_HOMOG; +- } +- return cif->rtype->type; +-} +diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c +--- a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c ++++ b/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c +@@ -1,14 +1,14 @@ + /* ----------------------------------------------------------------------- + ffi_darwin.c + + Copyright (C) 1998 Geoffrey Keating + Copyright (C) 2001 John Hornkvist +- Copyright (C) 2002, 2006, 2007, 2009 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. + + FFI support for Darwin and AIX. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -30,87 +30,112 @@ + #include + #include + + #include + + extern void ffi_closure_ASM (void); + + enum { +- /* The assembly depends on these exact flags. */ +- FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */ +- FLAG_RETURNS_FP = 1 << (31-29), +- FLAG_RETURNS_64BITS = 1 << (31-28), +- FLAG_RETURNS_128BITS = 1 << (31-31), ++ /* The assembly depends on these exact flags. ++ For Darwin64 (when FLAG_RETURNS_STRUCT is set): ++ FLAG_RETURNS_FP indicates that the structure embeds FP data. ++ FLAG_RETURNS_128BITS signals a special struct size that is not ++ expanded for float content. */ ++ FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */ ++ FLAG_RETURNS_NOTHING = 1 << (31-30), ++ FLAG_RETURNS_FP = 1 << (31-29), ++ FLAG_RETURNS_64BITS = 1 << (31-28), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */ + + FLAG_ARG_NEEDS_COPY = 1 << (31- 7), + FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ + FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), + FLAG_RETVAL_REFERENCE = 1 << (31- 4) + }; + + /* About the DARWIN ABI. */ + enum { + NUM_GPR_ARG_REGISTERS = 8, +- NUM_FPR_ARG_REGISTERS = 13 ++ NUM_FPR_ARG_REGISTERS = 13, ++ LINKAGE_AREA_GPRS = 6 + }; +-enum { ASM_NEEDS_REGISTERS = 4 }; ++ ++enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */ + + /* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. ++ ++ m32/m64 + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| +- | Previous backchain pointer 4 | stack pointer here ++ | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|<+ <<< on entry to +- | Saved r28-r31 4*4 | | ffi_call_DARWIN ++ | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN + |--------------------------------------------| | +- | Parameters (at least 8*4=32) | | ++ | When we have any FP activity... the | | ++ | FPRs occupy NUM_FPR_ARG_REGISTERS slots | | ++ | here fp13 .. fp1 from high to low addr. | | ++ ~ ~ ~ ++ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | +- | Space for GPR2 4 | | ++ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | stack | +- | Reserved 2*4 | | grows | ++ | Reserved 2*4/8 | | grows | + |--------------------------------------------| | down V +- | Space for callee's LR 4 | | ++ | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses +- | Saved CR 4 | | ++ | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | stack pointer here +- | Current backchain pointer 4 |-/ during ++ | Current backchain pointer 4/8 |-/ during + |--------------------------------------------| <<< ffi_call_DARWIN + + */ + ++#if defined(POWERPC_DARWIN64) ++static void ++darwin64_pass_struct_by_value ++ (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **); ++#endif ++ ++/* This depends on GPR_SIZE = sizeof (unsigned long) */ ++ + void + ffi_prep_args (extended_cif *ecif, unsigned long *const stack) + { + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + const unsigned nargs = ecif->cif->nargs; ++#if !defined(POWERPC_DARWIN64) + const ffi_abi abi = ecif->cif->abi; ++#endif + + /* 'stacktop' points at the previous backchain pointer. */ + unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long)); + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; +- int fparg_count = 0; +- ++ int gp_count = 0, fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ +- unsigned long *next_arg = stack + 6; /* 6 reserved positions. */ ++ unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */ + + int i; + double double_tmp; + void **p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; ++#if !defined(POWERPC_DARWIN64) + char *dest_cpy; ++#endif + unsigned size_al = 0; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0); + FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0); + FFI_ASSERT((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. +@@ -125,78 +150,95 @@ ffi_prep_args (extended_cif *ecif, unsig + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are skipped. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float *) *p_argv; +- if (fparg_count >= NUM_FPR_ARG_REGISTERS) +- *(double *)next_arg = double_tmp; +- else ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; ++#if defined(POWERPC_DARWIN) ++ *(float *)next_arg = *(float *) *p_argv; ++#else ++ *(double *)next_arg = double_tmp; ++#endif + next_arg++; ++ gp_count++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double *) *p_argv; +- if (fparg_count >= NUM_FPR_ARG_REGISTERS) +- *(double *)next_arg = double_tmp; +- else ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; ++ *(double *)next_arg = double_tmp; + #ifdef POWERPC64 + next_arg++; ++ gp_count++; + #else + next_arg += 2; ++ gp_count += 2; + #endif + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +-#ifdef POWERPC64 ++# if defined(POWERPC64) && !defined(POWERPC_DARWIN64) ++ /* ??? This will exceed the regs count when the value starts at fp13 ++ and it will not put the extra bit on the stack. */ + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double *) fpr_base++ = *(long double *) *p_argv; + else + *(long double *) next_arg = *(long double *) *p_argv; + next_arg += 2; + fparg_count += 2; +-#else ++# else + double_tmp = ((double *) *p_argv)[0]; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; +- else +- *(double *) next_arg = double_tmp; ++ *(double *) next_arg = double_tmp; ++# if defined(POWERPC_DARWIN64) ++ next_arg++; ++ gp_count++; ++# else + next_arg += 2; ++ gp_count += 2; ++# endif + fparg_count++; +- + double_tmp = ((double *) *p_argv)[1]; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; +- else +- *(double *) next_arg = double_tmp; ++ *(double *) next_arg = double_tmp; ++# if defined(POWERPC_DARWIN64) ++ next_arg++; ++ gp_count++; ++# else + next_arg += 2; ++ gp_count += 2; ++# endif + fparg_count++; +-#endif ++# endif + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + #endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + #ifdef POWERPC64 + gprvalue = *(long long *) *p_argv; + goto putgpr; + #else + *(long long *) next_arg = *(long long *) *p_argv; + next_arg += 2; ++ gp_count += 2; + #endif + break; + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long *) *p_argv; + goto putgpr; + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char *) *p_argv; + goto putgpr; +@@ -206,101 +248,373 @@ ffi_prep_args (extended_cif *ecif, unsig + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short *) *p_argv; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = *(signed short *) *p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: +-#ifdef POWERPC64 +- dest_cpy = (char *) next_arg; + size_al = (*ptr)->size; +- if ((*ptr)->elements[0]->type == 3) +- size_al = ALIGN((*ptr)->size, 8); +- if (size_al < 3 && abi == FFI_DARWIN) +- dest_cpy += 4 - size_al; +- +- memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); +- next_arg += (size_al + 7) / 8; ++#if defined(POWERPC_DARWIN64) ++ next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment); ++ darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, ++ (unsigned) size_al, ++ (unsigned int *) &fparg_count, ++ &fpr_base, &next_arg); + #else + dest_cpy = (char *) next_arg; + ++ /* If the first member of the struct is a double, then include enough ++ padding in the struct size to align it to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++# if defined(POWERPC64) ++ FFI_ASSERT (abi != FFI_DARWIN); ++ memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); ++ next_arg += (size_al + 7) / 8; ++# else + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ +- size_al = (*ptr)->size; +- /* If the first member of the struct is a double, then align +- the struct to double-word. */ +- if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) +- size_al = ALIGN((*ptr)->size, 8); + if (size_al < 3 && abi == FFI_DARWIN) + dest_cpy += 4 - size_al; + + memcpy((char *) dest_cpy, (char *) *p_argv, size_al); + next_arg += (size_al + 3) / 4; ++# endif + #endif + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + gprvalue = *(signed int *) *p_argv; + goto putgpr; + + case FFI_TYPE_UINT32: + gprvalue = *(unsigned int *) *p_argv; + putgpr: + *next_arg++ = gprvalue; ++ gp_count++; + break; + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ +- //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); +- //FFI_ASSERT((unsigned *)fpr_base +- // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); +- //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++ /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ FFI_ASSERT((unsigned *)fpr_base ++ <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); */ + } + ++#if defined(POWERPC_DARWIN64) ++ ++/* See if we can put some of the struct into fprs. ++ This should not be called for structures of size 16 bytes, since these are not ++ broken out this way. */ ++static void ++darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr) ++{ ++ int i; ++ ++ FFI_ASSERT (s->type == FFI_TYPE_STRUCT) ++ ++ for (i = 0; s->elements[i] != NULL; i++) ++ { ++ ffi_type *p = s->elements[i]; ++ switch (p->type) ++ { ++ case FFI_TYPE_STRUCT: ++ darwin64_scan_struct_for_floats (p, nfpr); ++ break; ++ case FFI_TYPE_LONGDOUBLE: ++ (*nfpr) += 2; ++ break; ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_FLOAT: ++ (*nfpr) += 1; ++ break; ++ default: ++ break; ++ } ++ } ++} ++ ++static int ++darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr) ++{ ++ unsigned struct_offset=0, i; ++ ++ for (i = 0; s->elements[i] != NULL; i++) ++ { ++ char *item_base; ++ ffi_type *p = s->elements[i]; ++ /* Find the start of this item (0 for the first one). */ ++ if (i > 0) ++ struct_offset = ALIGN(struct_offset, p->alignment); ++ ++ item_base = src + struct_offset; ++ ++ switch (p->type) ++ { ++ case FFI_TYPE_STRUCT: ++ if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr)) ++ return 1; ++ break; ++ case FFI_TYPE_LONGDOUBLE: ++ if (*nfpr >= NUM_FPR_ARG_REGISTERS) ++ return 1; ++ (*nfpr) += 1; ++ item_base += 8; ++ /* FALL THROUGH */ ++ case FFI_TYPE_DOUBLE: ++ if (*nfpr >= NUM_FPR_ARG_REGISTERS) ++ return 1; ++ (*nfpr) += 1; ++ break; ++ case FFI_TYPE_FLOAT: ++ if (*nfpr >= NUM_FPR_ARG_REGISTERS) ++ return 1; ++ (*nfpr) += 1; ++ break; ++ default: ++ /* If we try and place any item, that is non-float, once we've ++ exceeded the 8 GPR mark, then we can't fit the struct. */ ++ if ((unsigned long)item_base >= 8*8) ++ return 1; ++ break; ++ } ++ /* now count the size of what we just used. */ ++ struct_offset += p->size; ++ } ++ return 0; ++} ++ ++/* Can this struct be returned by value? */ ++int ++darwin64_struct_ret_by_value_p (ffi_type *s) ++{ ++ unsigned nfp = 0; ++ ++ FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT); ++ ++ /* The largest structure we can return is 8long + 13 doubles. */ ++ if (s->size > 168) ++ return 0; ++ ++ /* We can't pass more than 13 floats. */ ++ darwin64_scan_struct_for_floats (s, &nfp); ++ if (nfp > 13) ++ return 0; ++ ++ /* If there are not too many floats, and the struct is ++ small enough to accommodate in the GPRs, then it must be OK. */ ++ if (s->size <= 64) ++ return 1; ++ ++ /* Well, we have to look harder. */ ++ nfp = 0; ++ if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp)) ++ return 0; ++ ++ return 1; ++} ++ ++void ++darwin64_pass_struct_floats (ffi_type *s, char *src, ++ unsigned *nfpr, double **fprs) ++{ ++ int i; ++ double *fpr_base = *fprs; ++ unsigned struct_offset = 0; ++ ++ /* We don't assume anything about the alignment of the source. */ ++ for (i = 0; s->elements[i] != NULL; i++) ++ { ++ char *item_base; ++ ffi_type *p = s->elements[i]; ++ /* Find the start of this item (0 for the first one). */ ++ if (i > 0) ++ struct_offset = ALIGN(struct_offset, p->alignment); ++ item_base = src + struct_offset; ++ ++ switch (p->type) ++ { ++ case FFI_TYPE_STRUCT: ++ darwin64_pass_struct_floats (p, item_base, nfpr, ++ &fpr_base); ++ break; ++ case FFI_TYPE_LONGDOUBLE: ++ if (*nfpr < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = *(double *)item_base; ++ (*nfpr) += 1; ++ item_base += 8; ++ /* FALL THROUGH */ ++ case FFI_TYPE_DOUBLE: ++ if (*nfpr < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = *(double *)item_base; ++ (*nfpr) += 1; ++ break; ++ case FFI_TYPE_FLOAT: ++ if (*nfpr < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = (double) *(float *)item_base; ++ (*nfpr) += 1; ++ break; ++ default: ++ break; ++ } ++ /* now count the size of what we just used. */ ++ struct_offset += p->size; ++ } ++ /* Update the scores. */ ++ *fprs = fpr_base; ++} ++ ++/* Darwin64 special rules. ++ Break out a struct into params and float registers. */ ++static void ++darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size, ++ unsigned *nfpr, double **fprs, unsigned long **arg) ++{ ++ unsigned long *next_arg = *arg; ++ char *dest_cpy = (char *)next_arg; ++ ++ FFI_ASSERT (s->type == FFI_TYPE_STRUCT) ++ ++ if (!size) ++ return; ++ ++ /* First... special cases. */ ++ if (size < 3 ++ || (size == 4 ++ && s->elements[0] ++ && s->elements[0]->type != FFI_TYPE_FLOAT)) ++ { ++ /* Must be at least one GPR, padding is unspecified in value, ++ let's make it zero. */ ++ *next_arg = 0UL; ++ dest_cpy += 8 - size; ++ memcpy ((char *) dest_cpy, src, size); ++ next_arg++; ++ } ++ else if (size == 16) ++ { ++ memcpy ((char *) dest_cpy, src, size); ++ next_arg += 2; ++ } ++ else ++ { ++ /* now the general case, we consider embedded floats. */ ++ memcpy ((char *) dest_cpy, src, size); ++ darwin64_pass_struct_floats (s, src, nfpr, fprs); ++ next_arg += (size+7)/8; ++ } ++ ++ *arg = next_arg; ++} ++ ++double * ++darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf) ++{ ++ int i; ++ unsigned struct_offset = 0; ++ ++ /* We don't assume anything about the alignment of the source. */ ++ for (i = 0; s->elements[i] != NULL; i++) ++ { ++ char *item_base; ++ ffi_type *p = s->elements[i]; ++ /* Find the start of this item (0 for the first one). */ ++ if (i > 0) ++ struct_offset = ALIGN(struct_offset, p->alignment); ++ item_base = dest + struct_offset; ++ ++ switch (p->type) ++ { ++ case FFI_TYPE_STRUCT: ++ fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf); ++ break; ++ case FFI_TYPE_LONGDOUBLE: ++ if (*nf < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double *)item_base = *fprs++ ; ++ (*nf) += 1; ++ } ++ item_base += 8; ++ /* FALL THROUGH */ ++ case FFI_TYPE_DOUBLE: ++ if (*nf < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double *)item_base = *fprs++ ; ++ (*nf) += 1; ++ } ++ break; ++ case FFI_TYPE_FLOAT: ++ if (*nf < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float *)item_base = (float) *fprs++ ; ++ (*nf) += 1; ++ } ++ break; ++ default: ++ break; ++ } ++ /* now count the size of what we just used. */ ++ struct_offset += p->size; ++ } ++ return fprs; ++} ++ ++#endif ++ + /* Adjust the size of S to be correct for Darwin. +- On Darwin, the first field of a structure has natural alignment. */ ++ On Darwin m32, the first field of a structure has natural alignment. ++ On Darwin m64, all fields have natural alignment. */ + + static void + darwin_adjust_aggregate_sizes (ffi_type *s) + { + int i; + + if (s->type != FFI_TYPE_STRUCT) + return; + + s->size = 0; + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p; + int align; + + p = s->elements[i]; +- darwin_adjust_aggregate_sizes (p); +- if (i == 0 +- && (p->type == FFI_TYPE_UINT64 +- || p->type == FFI_TYPE_SINT64 +- || p->type == FFI_TYPE_DOUBLE +- || p->alignment == 8)) +- align = 8; ++ if (p->type == FFI_TYPE_STRUCT) ++ darwin_adjust_aggregate_sizes (p); ++#if defined(POWERPC_DARWIN64) ++ /* Natural alignment for all items. */ ++ align = p->alignment; ++#else ++ /* Natural alignment for the first item... */ ++ if (i == 0) ++ align = p->alignment; + else if (p->alignment == 16 || p->alignment < 4) ++ /* .. subsequent items with vector or align < 4 have natural align. */ + align = p->alignment; + else ++ /* .. or align is 4. */ + align = 4; ++#endif ++ /* Pad, if necessary, before adding the current item. */ + s->size = ALIGN(s->size, align) + p->size; + } + + s->size = ALIGN(s->size, s->alignment); + ++ /* This should not be necessary on m64, but harmless. */ + if (s->elements[0]->type == FFI_TYPE_UINT64 + || s->elements[0]->type == FFI_TYPE_SINT64 + || s->elements[0]->type == FFI_TYPE_DOUBLE + || s->elements[0]->alignment == 8) + s->alignment = s->alignment > 8 ? s->alignment : 8; + /* Do not add additional tail padding. */ + } + +@@ -342,17 +656,17 @@ aix_adjust_aggregate_sizes (ffi_type *s) + /* Perform machine dependent cif processing. */ + ffi_status + ffi_prep_cif_machdep (ffi_cif *cif) + { + /* All this is for the DARWIN ABI. */ + unsigned i; + ffi_type **ptr; + unsigned bytes; +- int fparg_count = 0, intarg_count = 0; ++ unsigned fparg_count = 0, intarg_count = 0; + unsigned flags = 0; + unsigned size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + All the calculation of structure sizes will also be wrong. + Redo the calculation for DARWIN. */ + + if (cif->abi == FFI_DARWIN) +@@ -367,26 +681,35 @@ ffi_prep_cif_machdep (ffi_cif *cif) + aix_adjust_aggregate_sizes (cif->rtype); + for (i = 0; i < cif->nargs; i++) + aix_adjust_aggregate_sizes (cif->arg_types[i]); + } + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + +- bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long); + +- /* Return value handling. The rules are as follows: ++ /* Return value handling. ++ The rules m32 are as follows: + - 32-bit (or less) integer values are returned in gpr3; +- - Structures of size <= 4 bytes also returned in gpr3; +- - 64-bit integer values and structures between 5 and 8 bytes are returned +- in gpr3 and gpr4; ++ - structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values [??? and structures between 5 and 8 bytes] are ++ returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; ++ m64: ++ - 64-bit or smaller integral values are returned in GPR3 ++ - Single/double FP values are returned in fpr1; ++ - Long double FP values are returned in fpr1 and fpr2; ++ m64 Structures: ++ - If the structure could be accommodated in registers were it to be the ++ first argument to a routine, then it is returned in those registers. ++ m32/m64 structures otherwise: + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { + + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; +@@ -405,124 +728,193 @@ ffi_prep_cif_machdep (ffi_cif *cif) + case FFI_TYPE_SINT64: + #ifdef POWERPC64 + case FFI_TYPE_POINTER: + #endif + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: ++#if defined(POWERPC_DARWIN64) ++ { ++ /* Can we fit the struct into regs? */ ++ if (darwin64_struct_ret_by_value_p (cif->rtype)) ++ { ++ unsigned nfpr = 0; ++ flags |= FLAG_RETURNS_STRUCT; ++ if (cif->rtype->size != 16) ++ darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ; ++ else ++ flags |= FLAG_RETURNS_128BITS; ++ /* Will be 0 for 16byte struct. */ ++ if (nfpr) ++ flags |= FLAG_RETURNS_FP; ++ } ++ else /* By ref. */ ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ } ++#elif defined(DARWIN_PPC) ++ if (cif->rtype->size <= 4) ++ flags |= FLAG_RETURNS_STRUCT; ++ else /* else by reference. */ ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++#else /* assume we pass by ref. */ + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; ++#endif + break; + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest +- goes on the stack. Structures are passed as a pointer to a copy of +- the structure. Stuff on the stack needs to keep proper alignment. */ ++ goes on the stack. ++ ??? Structures are passed as a pointer to a copy of the structure. ++ Stuff on the stack needs to keep proper alignment. ++ For m64 the count is effectively of half-GPRs. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { ++ unsigned align_words; + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; ++#if !defined(POWERPC_DARWIN64) + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS +- && intarg_count%2 != 0) ++ && (intarg_count & 0x01) != 0) + intarg_count++; ++#endif + break; + + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +- + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be +- 8-byte-aligned. */ +- if (fparg_count > NUM_FPR_ARG_REGISTERS +- && intarg_count%2 != 0) +- intarg_count++; +- intarg_count +=2; ++ 16-byte-aligned. */ ++ if (fparg_count >= NUM_FPR_ARG_REGISTERS) ++#if defined (POWERPC64) ++ intarg_count = ALIGN(intarg_count, 2); ++#else ++ intarg_count = ALIGN(intarg_count, 4); ++#endif + break; + #endif + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: ++#if defined(POWERPC64) ++ intarg_count++; ++#else + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS-1 +- || (intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count%2 != 0)) ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && (intarg_count & 0x01) != 0)) + intarg_count++; + intarg_count += 2; ++#endif + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; ++#if defined(POWERPC_DARWIN64) ++ align_words = (*ptr)->alignment >> 3; ++ if (align_words) ++ intarg_count = ALIGN(intarg_count, align_words); ++ /* Base size of the struct. */ ++ intarg_count += (size_al + 7) / 8; ++ /* If 16 bytes then don't worry about floats. */ ++ if (size_al != 16) ++ /* Scan through for floats to be placed in regs. */ ++ darwin64_scan_struct_for_floats (*ptr, &fparg_count) ; ++#else ++ align_words = (*ptr)->alignment >> 2; ++ if (align_words) ++ intarg_count = ALIGN(intarg_count, align_words); + /* If the first member of the struct is a double, then align +- the struct to double-word. */ ++ the struct to double-word. + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) +- size_al = ALIGN((*ptr)->size, 8); +-#ifdef POWERPC64 ++ size_al = ALIGN((*ptr)->size, 8); */ ++# ifdef POWERPC64 + intarg_count += (size_al + 7) / 8; +-#else ++# else + intarg_count += (size_al + 3) / 4; ++# endif + #endif + break; + + default: + /* Everything else is passed as a 4-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + if (fparg_count != 0) + flags |= FLAG_FP_ARGUMENTS; + ++#if defined(POWERPC_DARWIN64) ++ /* Space to image the FPR registers, if needed - which includes when they might be ++ used in a struct return. */ ++ if (fparg_count != 0 ++ || ((flags & FLAG_RETURNS_STRUCT) ++ && (flags & FLAG_RETURNS_FP))) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#endif + + /* Stack space. */ + #ifdef POWERPC64 + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); + #else + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); + #endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16 bytes. */ +- bytes = (bytes + 15) & ~0xF; ++ bytes = ALIGN(bytes, 16) ; + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; + } + + extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, + void (*fn)(void), void (*fn2)(void)); ++ + extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *, +- void (*fn)(void), void (*fn2)(void)); ++ void (*fn)(void), void (*fn2)(void), ffi_type*); + + void + ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) + { + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; +@@ -541,17 +933,17 @@ ffi_call (ffi_cif *cif, void (*fn)(void) + switch (cif->abi) + { + case FFI_AIX: + ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, + FFI_FN(ffi_prep_args)); + break; + case FFI_DARWIN: + ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, +- FFI_FN(ffi_prep_args)); ++ FFI_FN(ffi_prep_args), cif->rtype); + break; + default: + FFI_ASSERT(0); + break; + } + } + + static void flush_icache(char *); +@@ -561,123 +953,127 @@ static void flush_range(char *, int); + points to one of these. */ + + typedef struct aix_fd_struct { + void *code_pointer; + void *toc; + } aix_fd; + + /* here I'd like to add the stack frame layout we use in darwin_closure.S +- and aix_clsoure.S ++ and aix_closure.S + +- SP previous -> +---------------------------------------+ <--- child frame +- | back chain to caller 4 | +- +---------------------------------------+ 4 +- | saved CR 4 | +- +---------------------------------------+ 8 +- | saved LR 4 | +- +---------------------------------------+ 12 +- | reserved for compilers 4 | +- +---------------------------------------+ 16 +- | reserved for binders 4 | +- +---------------------------------------+ 20 +- | saved TOC pointer 4 | +- +---------------------------------------+ 24 +- | always reserved 8*4=32 (previous GPRs)| +- | according to the linkage convention | +- | from AIX | +- +---------------------------------------+ 56 +- | our FPR area 13*8=104 | +- | f1 | +- | . | +- | f13 | +- +---------------------------------------+ 160 +- | result area 8 | +- +---------------------------------------+ 168 +- | alignement to the next multiple of 16 | +-SP current --> +---------------------------------------+ 176 <- parent frame +- | back chain to caller 4 | +- +---------------------------------------+ 180 +- | saved CR 4 | +- +---------------------------------------+ 184 +- | saved LR 4 | +- +---------------------------------------+ 188 +- | reserved for compilers 4 | +- +---------------------------------------+ 192 +- | reserved for binders 4 | +- +---------------------------------------+ 196 +- | saved TOC pointer 4 | +- +---------------------------------------+ 200 +- | always reserved 8*4=32 we store our | +- | GPRs here | +- | r3 | +- | . | +- | r10 | +- +---------------------------------------+ 232 +- | overflow part | +- +---------------------------------------+ xxx +- | ???? | +- +---------------------------------------+ xxx ++ m32/m64 ++ ++ The stack layout looks like this: ++ ++ | Additional params... | | Higher address ++ ~ ~ ~ ++ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS ++ |--------------------------------------------| | ++ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | ++ |--------------------------------------------| | ++ | Reserved 2*4/8 | | ++ |--------------------------------------------| | ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | ++ | Saved CR [low word for m64] 4/8 | | ++ |--------------------------------------------| | ++ | Current backchain pointer 4/8 |-/ Parent's frame. ++ |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM ++ | Result Bytes 16 | | ++ |--------------------------------------------| | ++ ~ padding to 16-byte alignment ~ ~ ++ |--------------------------------------------| | ++ | NUM_FPR_ARG_REGISTERS slots | | ++ | here fp13 .. fp1 13*8 | | ++ |--------------------------------------------| | ++ | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS ++ |--------------------------------------------| | ++ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved [compiler,binder] 2*4/8 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR [low word for m64] 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 |-/ during ++ |--------------------------------------------| <<< ffi_closure_ASM. + + */ ++ + ffi_status + ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) + { + unsigned int *tramp; + struct ffi_aix_trampoline_struct *tramp_aix; + aix_fd *fd; + + switch (cif->abi) + { +- case FFI_DARWIN: ++ case FFI_DARWIN: + +- FFI_ASSERT (cif->abi == FFI_DARWIN); ++ FFI_ASSERT (cif->abi == FFI_DARWIN); + +- tramp = (unsigned int *) &closure->tramp[0]; +- tramp[0] = 0x7c0802a6; /* mflr r0 */ +- tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */ +- tramp[4] = 0x7d6802a6; /* mflr r11 */ +- tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */ +- tramp[6] = 0x7c0803a6; /* mtlr r0 */ +- tramp[7] = 0x7d8903a6; /* mtctr r12 */ +- tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */ +- tramp[9] = 0x4e800420; /* bctr */ +- tramp[2] = (unsigned long) ffi_closure_ASM; /* function */ +- tramp[3] = (unsigned long) codeloc; /* context */ ++ tramp = (unsigned int *) &closure->tramp[0]; ++#if defined(POWERPC_DARWIN64) ++ tramp[0] = 0x7c0802a6; /* mflr r0 */ ++ tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */ ++ /* We put the addresses here. */ ++ tramp[6] = 0x7d6802a6; /*L1: mflr r11 */ ++ tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */ ++ tramp[8] = 0x7c0803a6; /* mtlr r0 */ ++ tramp[9] = 0x7d8903a6; /* mtctr r12 */ ++ tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */ ++ tramp[11] = 0x4e800420; /* bctr */ + +- closure->cif = cif; +- closure->fun = fun; +- closure->user_data = user_data; ++ *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */ ++ *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */ ++#else ++ tramp[0] = 0x7c0802a6; /* mflr r0 */ ++ tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */ ++ tramp[4] = 0x7d6802a6; /* mflr r11 */ ++ tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */ ++ tramp[6] = 0x7c0803a6; /* mtlr r0 */ ++ tramp[7] = 0x7d8903a6; /* mtctr r12 */ ++ tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */ ++ tramp[9] = 0x4e800420; /* bctr */ ++ tramp[2] = (unsigned long) ffi_closure_ASM; /* function */ ++ tramp[3] = (unsigned long) codeloc; /* context */ ++#endif ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; + +- /* Flush the icache. Only necessary on Darwin. */ +- flush_range(codeloc, FFI_TRAMPOLINE_SIZE); ++ /* Flush the icache. Only necessary on Darwin. */ ++ flush_range(codeloc, FFI_TRAMPOLINE_SIZE); + +- break; ++ break; + + case FFI_AIX: + + tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); + fd = (aix_fd *)(void *)ffi_closure_ASM; + + FFI_ASSERT (cif->abi == FFI_AIX); + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = codeloc; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; ++ break; + + default: +- +- FFI_ASSERT(0); ++ return FFI_BAD_ABI; + break; + } + return FFI_OK; + } + + static void + flush_icache(char *addr) + { +@@ -703,28 +1099,28 @@ flush_range(char * addr1, int size) + } + + typedef union + { + float f; + double d; + } ffi_dblfl; + +-int ++ffi_type * + ffi_closure_helper_DARWIN (ffi_closure *, void *, + unsigned long *, ffi_dblfl *); + + /* Basically the trampoline invokes ffi_closure_ASM, and on + entry, r11 holds the address of the closure. + After storing the registers that could possibly contain + parameters to be passed into the stack frame and setting + up space for a return value, ffi_closure_ASM invokes the + following helper function to do most of the work. */ + +-int ++ffi_type * + ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, + unsigned long *pgr, ffi_dblfl *pfr) + { + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + + typedef double ldbits[2]; +@@ -736,97 +1132,132 @@ ffi_closure_helper_DARWIN (ffi_closure * + }; + + void ** avalue; + ffi_type ** arg_types; + long i, avn; + ffi_cif * cif; + ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; + unsigned size_al; ++#if defined(POWERPC_DARWIN64) ++ unsigned fpsused = 0; ++#endif + + cif = closure->cif; + avalue = alloca (cif->nargs * sizeof(void *)); + +- /* Copy the caller's structure return value address so that the closure +- returns the data directly to the caller. */ + if (cif->rtype->type == FFI_TYPE_STRUCT) + { ++#if defined(POWERPC_DARWIN64) ++ if (!darwin64_struct_ret_by_value_p (cif->rtype)) ++ { ++ /* Won't fit into the regs - return by ref. */ ++ rvalue = (void *) *pgr; ++ pgr++; ++ } ++#elif defined(DARWIN_PPC) ++ if (cif->rtype->size > 4) ++ { ++ rvalue = (void *) *pgr; ++ pgr++; ++ } ++#else /* assume we return by ref. */ + rvalue = (void *) *pgr; + pgr++; ++#endif + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: +-#ifdef POWERPC64 ++#if defined(POWERPC64) + avalue[i] = (char *) pgr + 7; + #else + avalue[i] = (char *) pgr + 3; + #endif + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: +-#ifdef POWERPC64 ++#if defined(POWERPC64) + avalue[i] = (char *) pgr + 6; + #else + avalue[i] = (char *) pgr + 2; + #endif + pgr++; + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: +-#ifdef POWERPC64 ++#if defined(POWERPC64) + avalue[i] = (char *) pgr + 4; + #else + case FFI_TYPE_POINTER: + avalue[i] = pgr; + #endif + pgr++; + break; + + case FFI_TYPE_STRUCT: +-#ifdef POWERPC64 + size_al = arg_types[i]->size; +- if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) +- size_al = ALIGN (arg_types[i]->size, 8); +- if (size_al < 3 && cif->abi == FFI_DARWIN) +- avalue[i] = (char *) pgr + 8 - size_al; +- else +- avalue[i] = pgr; ++#if defined(POWERPC_DARWIN64) ++ pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment); ++ if (size_al < 3 || size_al == 4) ++ { ++ avalue[i] = ((char *)pgr)+8-size_al; ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT ++ && fpsused < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float *)pgr = (float) *(double *)pfr; ++ pfr++; ++ fpsused++; ++ } ++ } ++ else ++ { ++ if (size_al != 16) ++ pfr = (ffi_dblfl *) ++ darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr, ++ (double *)pfr, &fpsused); ++ avalue[i] = pgr; ++ } + pgr += (size_al + 7) / 8; + #else +- /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, +- SI 4 bytes) are aligned as if they were those modes. */ +- size_al = arg_types[i]->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); ++# if defined(POWERPC64) ++ FFI_ASSERT (cif->abi != FFI_DARWIN); ++ avalue[i] = pgr; ++ pgr += (size_al + 7) / 8; ++# else ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ + if (size_al < 3 && cif->abi == FFI_DARWIN) + avalue[i] = (char*) pgr + 4 - size_al; + else + avalue[i] = pgr; + pgr += (size_al + 3) / 4; ++# endif + #endif + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: +-#ifdef POWERPC64 ++#if defined(POWERPC64) + case FFI_TYPE_POINTER: + avalue[i] = pgr; + pgr++; + break; + #else + /* Long long ints are passed in two gpr's. */ + avalue[i] = pgr; + pgr += 2; +@@ -919,10 +1350,10 @@ ffi_closure_helper_DARWIN (ffi_closure * + FFI_ASSERT(0); + } + i++; + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ +- return cif->rtype->type; ++ return cif->rtype; + } +diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_linux64.c b/js/src/ctypes/libffi/src/powerpc/ffi_linux64.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/powerpc/ffi_linux64.c +@@ -0,0 +1,943 @@ ++/* ----------------------------------------------------------------------- ++ ffi_linux64.c - Copyright (C) 2013 IBM ++ Copyright (C) 2011 Anthony Green ++ Copyright (C) 2011 Kyle Moffett ++ Copyright (C) 2008 Red Hat, Inc ++ Copyright (C) 2007, 2008 Free Software Foundation, Inc ++ Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include "ffi.h" ++ ++#ifdef POWERPC64 ++#include "ffi_common.h" ++#include "ffi_powerpc.h" ++ ++ ++/* About the LINUX64 ABI. */ ++enum { ++ NUM_GPR_ARG_REGISTERS64 = 8, ++ NUM_FPR_ARG_REGISTERS64 = 13 ++}; ++enum { ASM_NEEDS_REGISTERS64 = 4 }; ++ ++ ++#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++/* Adjust size of ffi_type_longdouble. */ ++void FFI_HIDDEN ++ffi_prep_types_linux64 (ffi_abi abi) ++{ ++ if ((abi & (FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128)) == FFI_LINUX) ++ { ++ ffi_type_longdouble.size = 8; ++ ffi_type_longdouble.alignment = 8; ++ } ++ else ++ { ++ ffi_type_longdouble.size = 16; ++ ffi_type_longdouble.alignment = 16; ++ } ++} ++#endif ++ ++ ++#if _CALL_ELF == 2 ++static unsigned int ++discover_homogeneous_aggregate (const ffi_type *t, unsigned int *elnum) ++{ ++ switch (t->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ *elnum = 1; ++ return (int) t->type; ++ ++ case FFI_TYPE_STRUCT:; ++ { ++ unsigned int base_elt = 0, total_elnum = 0; ++ ffi_type **el = t->elements; ++ while (*el) ++ { ++ unsigned int el_elt, el_elnum = 0; ++ el_elt = discover_homogeneous_aggregate (*el, &el_elnum); ++ if (el_elt == 0 ++ || (base_elt && base_elt != el_elt)) ++ return 0; ++ base_elt = el_elt; ++ total_elnum += el_elnum; ++ if (total_elnum > 8) ++ return 0; ++ el++; ++ } ++ *elnum = total_elnum; ++ return base_elt; ++ } ++ ++ default: ++ return 0; ++ } ++} ++#endif ++ ++ ++/* Perform machine dependent cif processing */ ++static ffi_status ++ffi_prep_cif_linux64_core (ffi_cif *cif) ++{ ++ ffi_type **ptr; ++ unsigned bytes; ++ unsigned i, fparg_count = 0, intarg_count = 0; ++ unsigned flags = cif->flags; ++#if _CALL_ELF == 2 ++ unsigned int elt, elnum; ++#endif ++ ++#if FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE ++ /* If compiled without long double support.. */ ++ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) ++ return FFI_BAD_ABI; ++#endif ++ ++ /* The machine-independent calculation of cif->bytes doesn't work ++ for us. Redo the calculation. */ ++#if _CALL_ELF == 2 ++ /* Space for backchain, CR, LR, TOC and the asm's temp regs. */ ++ bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long); ++ ++ /* Space for the general registers. */ ++ bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long); ++#else ++ /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp ++ regs. */ ++ bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long); ++ ++ /* Space for the mandatory parm save area and general registers. */ ++ bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long); ++#endif ++ ++ /* Return value handling. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) ++ flags |= FLAG_RETURNS_128BITS; ++ /* Fall through. */ ++#endif ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++ case FFI_TYPE_UINT128: ++ flags |= FLAG_RETURNS_128BITS; ++ /* Fall through. */ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++#if _CALL_ELF == 2 ++ elt = discover_homogeneous_aggregate (cif->rtype, &elnum); ++ if (elt) ++ { ++ if (elt == FFI_TYPE_DOUBLE) ++ flags |= FLAG_RETURNS_64BITS; ++ flags |= FLAG_RETURNS_FP | FLAG_RETURNS_SMST; ++ break; ++ } ++ if (cif->rtype->size <= 16) ++ { ++ flags |= FLAG_RETURNS_SMST; ++ break; ++ } ++#endif ++ intarg_count++; ++ flags |= FLAG_RETVAL_REFERENCE; ++ /* Fall through. */ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ unsigned int align; ++ ++ switch ((*ptr)->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) ++ { ++ fparg_count++; ++ intarg_count++; ++ } ++ /* Fall through. */ ++#endif ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_FLOAT: ++ fparg_count++; ++ intarg_count++; ++ if (fparg_count > NUM_FPR_ARG_REGISTERS64) ++ flags |= FLAG_ARG_NEEDS_PSAVE; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) ++ { ++ align = (*ptr)->alignment; ++ if (align > 16) ++ align = 16; ++ align = align / 8; ++ if (align > 1) ++ intarg_count = ALIGN (intarg_count, align); ++ } ++ intarg_count += ((*ptr)->size + 7) / 8; ++#if _CALL_ELF == 2 ++ elt = discover_homogeneous_aggregate (*ptr, &elnum); ++ if (elt) ++ { ++ fparg_count += elnum; ++ if (fparg_count > NUM_FPR_ARG_REGISTERS64) ++ flags |= FLAG_ARG_NEEDS_PSAVE; ++ } ++ else ++#endif ++ { ++ if (intarg_count > NUM_GPR_ARG_REGISTERS64) ++ flags |= FLAG_ARG_NEEDS_PSAVE; ++ } ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ /* Everything else is passed as a 8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ if (intarg_count > NUM_GPR_ARG_REGISTERS64) ++ flags |= FLAG_ARG_NEEDS_PSAVE; ++ break; ++ default: ++ FFI_ASSERT (0); ++ } ++ } ++ ++ if (fparg_count != 0) ++ flags |= FLAG_FP_ARGUMENTS; ++ if (intarg_count > 4) ++ flags |= FLAG_4_GPR_ARGUMENTS; ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); ++ ++ /* Stack space. */ ++#if _CALL_ELF == 2 ++ if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0) ++ bytes += intarg_count * sizeof (long); ++#else ++ if (intarg_count > NUM_GPR_ARG_REGISTERS64) ++ bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); ++#endif ++ ++ /* The stack space allocated needs to be a multiple of 16 bytes. */ ++ bytes = (bytes + 15) & ~0xF; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++ffi_status FFI_HIDDEN ++ffi_prep_cif_linux64 (ffi_cif *cif) ++{ ++ if ((cif->abi & FFI_LINUX) != 0) ++ cif->nfixedargs = cif->nargs; ++#if _CALL_ELF != 2 ++ else if (cif->abi == FFI_COMPAT_LINUX64) ++ { ++ /* This call is from old code. Don't touch cif->nfixedargs ++ since old code will be using a smaller cif. */ ++ cif->flags |= FLAG_COMPAT; ++ /* Translate to new abi value. */ ++ cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; ++ } ++#endif ++ else ++ return FFI_BAD_ABI; ++ return ffi_prep_cif_linux64_core (cif); ++} ++ ++ffi_status FFI_HIDDEN ++ffi_prep_cif_linux64_var (ffi_cif *cif, ++ unsigned int nfixedargs, ++ unsigned int ntotalargs MAYBE_UNUSED) ++{ ++ if ((cif->abi & FFI_LINUX) != 0) ++ cif->nfixedargs = nfixedargs; ++#if _CALL_ELF != 2 ++ else if (cif->abi == FFI_COMPAT_LINUX64) ++ { ++ /* This call is from old code. Don't touch cif->nfixedargs ++ since old code will be using a smaller cif. */ ++ cif->flags |= FLAG_COMPAT; ++ /* Translate to new abi value. */ ++ cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; ++ } ++#endif ++ else ++ return FFI_BAD_ABI; ++#if _CALL_ELF == 2 ++ cif->flags |= FLAG_ARG_NEEDS_PSAVE; ++#endif ++ return ffi_prep_cif_linux64_core (cif); ++} ++ ++ ++/* ffi_prep_args64 is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Ret addr from ffi_call_LINUX64 8bytes | higher addresses ++ |--------------------------------------------| ++ | CR save area 8bytes | ++ |--------------------------------------------| ++ | Previous backchain pointer 8 | stack pointer here ++ |--------------------------------------------|<+ <<< on entry to ++ | Saved r28-r31 4*8 | | ffi_call_LINUX64 ++ |--------------------------------------------| | ++ | GPR registers r3-r10 8*8 | | ++ |--------------------------------------------| | ++ | FPR registers f1-f13 (optional) 13*8 | | ++ |--------------------------------------------| | ++ | Parameter save area | | ++ |--------------------------------------------| | ++ | TOC save area 8 | | ++ |--------------------------------------------| | stack | ++ | Linker doubleword 8 | | grows | ++ |--------------------------------------------| | down V ++ | Compiler doubleword 8 | | ++ |--------------------------------------------| | lower addresses ++ | Space for callee's LR 8 | | ++ |--------------------------------------------| | ++ | CR save area 8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 8 |-/ during ++ |--------------------------------------------| <<< ffi_call_LINUX64 ++ ++*/ ++ ++void FFI_HIDDEN ++ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack) ++{ ++ const unsigned long bytes = ecif->cif->bytes; ++ const unsigned long flags = ecif->cif->flags; ++ ++ typedef union ++ { ++ char *c; ++ unsigned long *ul; ++ float *f; ++ double *d; ++ size_t p; ++ } valp; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++ valp stacktop; ++ ++ /* 'next_arg' points at the space for gpr3, and grows upwards as ++ we use GPR registers, then continues at rest. */ ++ valp gpr_base; ++ valp gpr_end; ++ valp rest; ++ valp next_arg; ++ ++ /* 'fpr_base' points at the space for fpr3, and grows upwards as ++ we use FPR registers. */ ++ valp fpr_base; ++ unsigned int fparg_count; ++ ++ unsigned int i, words, nargs, nfixedargs; ++ ffi_type **ptr; ++ double double_tmp; ++ union ++ { ++ void **v; ++ char **c; ++ signed char **sc; ++ unsigned char **uc; ++ signed short **ss; ++ unsigned short **us; ++ signed int **si; ++ unsigned int **ui; ++ unsigned long **ul; ++ float **f; ++ double **d; ++ } p_argv; ++ unsigned long gprvalue; ++ unsigned long align; ++ ++ stacktop.c = (char *) stack + bytes; ++ gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64; ++ gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64; ++#if _CALL_ELF == 2 ++ rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64; ++#else ++ rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; ++#endif ++ fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; ++ fparg_count = 0; ++ next_arg.ul = gpr_base.ul; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); ++ FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); ++ FFI_ASSERT ((bytes & 0xF) == 0); ++ ++ /* Deal with return values that are actually pass-by-reference. */ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ p_argv.v = ecif->avalue; ++ nargs = ecif->cif->nargs; ++#if _CALL_ELF != 2 ++ nfixedargs = (unsigned) -1; ++ if ((flags & FLAG_COMPAT) == 0) ++#endif ++ nfixedargs = ecif->cif->nfixedargs; ++ for (ptr = ecif->cif->arg_types, i = 0; ++ i < nargs; ++ i++, ptr++, p_argv.v++) ++ { ++#if _CALL_ELF == 2 ++ unsigned int elt, elnum; ++#endif ++ ++ switch ((*ptr)->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) ++ { ++ double_tmp = (*p_argv.d)[0]; ++ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) ++ { ++ *fpr_base.d++ = double_tmp; ++# if _CALL_ELF != 2 ++ if ((flags & FLAG_COMPAT) != 0) ++ *next_arg.d = double_tmp; ++# endif ++ } ++ else ++ *next_arg.d = double_tmp; ++ if (++next_arg.ul == gpr_end.ul) ++ next_arg.ul = rest.ul; ++ fparg_count++; ++ double_tmp = (*p_argv.d)[1]; ++ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) ++ { ++ *fpr_base.d++ = double_tmp; ++# if _CALL_ELF != 2 ++ if ((flags & FLAG_COMPAT) != 0) ++ *next_arg.d = double_tmp; ++# endif ++ } ++ else ++ *next_arg.d = double_tmp; ++ if (++next_arg.ul == gpr_end.ul) ++ next_arg.ul = rest.ul; ++ fparg_count++; ++ FFI_ASSERT (__LDBL_MANT_DIG__ == 106); ++ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); ++ break; ++ } ++ /* Fall through. */ ++#endif ++ case FFI_TYPE_DOUBLE: ++ double_tmp = **p_argv.d; ++ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) ++ { ++ *fpr_base.d++ = double_tmp; ++#if _CALL_ELF != 2 ++ if ((flags & FLAG_COMPAT) != 0) ++ *next_arg.d = double_tmp; ++#endif ++ } ++ else ++ *next_arg.d = double_tmp; ++ if (++next_arg.ul == gpr_end.ul) ++ next_arg.ul = rest.ul; ++ fparg_count++; ++ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ double_tmp = **p_argv.f; ++ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) ++ { ++ *fpr_base.d++ = double_tmp; ++#if _CALL_ELF != 2 ++ if ((flags & FLAG_COMPAT) != 0) ++ *next_arg.f = (float) double_tmp; ++#endif ++ } ++ else ++ *next_arg.f = (float) double_tmp; ++ if (++next_arg.ul == gpr_end.ul) ++ next_arg.ul = rest.ul; ++ fparg_count++; ++ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if ((ecif->cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) ++ { ++ align = (*ptr)->alignment; ++ if (align > 16) ++ align = 16; ++ if (align > 1) ++ next_arg.p = ALIGN (next_arg.p, align); ++ } ++#if _CALL_ELF == 2 ++ elt = discover_homogeneous_aggregate (*ptr, &elnum); ++ if (elt) ++ { ++ union { ++ void *v; ++ float *f; ++ double *d; ++ } arg; ++ ++ arg.v = *p_argv.v; ++ if (elt == FFI_TYPE_FLOAT) ++ { ++ do ++ { ++ double_tmp = *arg.f++; ++ if (fparg_count < NUM_FPR_ARG_REGISTERS64 ++ && i < nfixedargs) ++ *fpr_base.d++ = double_tmp; ++ else ++ *next_arg.f = (float) double_tmp; ++ if (++next_arg.f == gpr_end.f) ++ next_arg.f = rest.f; ++ fparg_count++; ++ } ++ while (--elnum != 0); ++ if ((next_arg.p & 3) != 0) ++ { ++ if (++next_arg.f == gpr_end.f) ++ next_arg.f = rest.f; ++ } ++ } ++ else ++ do ++ { ++ double_tmp = *arg.d++; ++ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) ++ *fpr_base.d++ = double_tmp; ++ else ++ *next_arg.d = double_tmp; ++ if (++next_arg.d == gpr_end.d) ++ next_arg.d = rest.d; ++ fparg_count++; ++ } ++ while (--elnum != 0); ++ } ++ else ++#endif ++ { ++ words = ((*ptr)->size + 7) / 8; ++ if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) ++ { ++ size_t first = gpr_end.c - next_arg.c; ++ memcpy (next_arg.c, *p_argv.c, first); ++ memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first); ++ next_arg.c = rest.c + words * 8 - first; ++ } ++ else ++ { ++ char *where = next_arg.c; ++ ++#ifndef __LITTLE_ENDIAN__ ++ /* Structures with size less than eight bytes are passed ++ left-padded. */ ++ if ((*ptr)->size < 8) ++ where += 8 - (*ptr)->size; ++#endif ++ memcpy (where, *p_argv.c, (*ptr)->size); ++ next_arg.ul += words; ++ if (next_arg.ul == gpr_end.ul) ++ next_arg.ul = rest.ul; ++ } ++ } ++ break; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = **p_argv.uc; ++ goto putgpr; ++ case FFI_TYPE_SINT8: ++ gprvalue = **p_argv.sc; ++ goto putgpr; ++ case FFI_TYPE_UINT16: ++ gprvalue = **p_argv.us; ++ goto putgpr; ++ case FFI_TYPE_SINT16: ++ gprvalue = **p_argv.ss; ++ goto putgpr; ++ case FFI_TYPE_UINT32: ++ gprvalue = **p_argv.ui; ++ goto putgpr; ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ gprvalue = **p_argv.si; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++ gprvalue = **p_argv.ul; ++ putgpr: ++ *next_arg.ul++ = gprvalue; ++ if (next_arg.ul == gpr_end.ul) ++ next_arg.ul = rest.ul; ++ break; ++ } ++ } ++ ++ FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS ++ || (next_arg.ul >= gpr_base.ul ++ && next_arg.ul <= gpr_base.ul + 4)); ++} ++ ++ ++#if _CALL_ELF == 2 ++#define MIN_CACHE_LINE_SIZE 8 ++ ++static void ++flush_icache (char *wraddr, char *xaddr, int size) ++{ ++ int i; ++ for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) ++ __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" ++ : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); ++ __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" ++ : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) ++ : "memory"); ++} ++#endif ++ ++ffi_status ++ffi_prep_closure_loc_linux64 (ffi_closure *closure, ++ ffi_cif *cif, ++ void (*fun) (ffi_cif *, void *, void **, void *), ++ void *user_data, ++ void *codeloc) ++{ ++#if _CALL_ELF == 2 ++ unsigned int *tramp = (unsigned int *) &closure->tramp[0]; ++ ++ if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) ++ return FFI_BAD_ABI; ++ ++ tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ ++ tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */ ++ tramp[2] = 0x7d8903a6; /* mtctr 12 */ ++ tramp[3] = 0x4e800420; /* bctr */ ++ /* 1: .quad function_addr */ ++ /* 2: .quad context */ ++ *(void **) &tramp[4] = (void *) ffi_closure_LINUX64; ++ *(void **) &tramp[6] = codeloc; ++ flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); ++#else ++ void **tramp = (void **) &closure->tramp[0]; ++ ++ if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) ++ return FFI_BAD_ABI; ++ ++ /* Copy function address and TOC from ffi_closure_LINUX64. */ ++ memcpy (tramp, (char *) ffi_closure_LINUX64, 16); ++ tramp[2] = tramp[1]; ++ tramp[1] = codeloc; ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++ ++int FFI_HIDDEN ++ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue, ++ unsigned long *pst, ffi_dblfl *pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly */ ++ /* pst is the pointer to parameter save area ++ (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ ++ /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ ++ ++ void **avalue; ++ ffi_type **arg_types; ++ unsigned long i, avn, nfixedargs; ++ ffi_cif *cif; ++ ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; ++ unsigned long align; ++ ++ cif = closure->cif; ++ avalue = alloca (cif->nargs * sizeof (void *)); ++ ++ /* Copy the caller's structure return value address so that the ++ closure returns the data directly to the caller. */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & FLAG_RETURNS_SMST) == 0) ++ { ++ rvalue = (void *) *pst; ++ pst++; ++ } ++ ++ i = 0; ++ avn = cif->nargs; ++#if _CALL_ELF != 2 ++ nfixedargs = (unsigned) -1; ++ if ((cif->flags & FLAG_COMPAT) == 0) ++#endif ++ nfixedargs = cif->nfixedargs; ++ arg_types = cif->arg_types; ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ while (i < avn) ++ { ++ unsigned int elt, elnum; ++ ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++#ifndef __LITTLE_ENDIAN__ ++ avalue[i] = (char *) pst + 7; ++ pst++; ++ break; ++#endif ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++#ifndef __LITTLE_ENDIAN__ ++ avalue[i] = (char *) pst + 6; ++ pst++; ++ break; ++#endif ++ ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++#ifndef __LITTLE_ENDIAN__ ++ avalue[i] = (char *) pst + 4; ++ pst++; ++ break; ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_POINTER: ++ avalue[i] = pst; ++ pst++; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) ++ { ++ align = arg_types[i]->alignment; ++ if (align > 16) ++ align = 16; ++ if (align > 1) ++ pst = (unsigned long *) ALIGN ((size_t) pst, align); ++ } ++ elt = 0; ++#if _CALL_ELF == 2 ++ elt = discover_homogeneous_aggregate (arg_types[i], &elnum); ++#endif ++ if (elt) ++ { ++ union { ++ void *v; ++ unsigned long *ul; ++ float *f; ++ double *d; ++ size_t p; ++ } to, from; ++ ++ /* Repackage the aggregate from its parts. The ++ aggregate size is not greater than the space taken by ++ the registers so store back to the register/parameter ++ save arrays. */ ++ if (pfr + elnum <= end_pfr) ++ to.v = pfr; ++ else ++ to.v = pst; ++ ++ avalue[i] = to.v; ++ from.ul = pst; ++ if (elt == FFI_TYPE_FLOAT) ++ { ++ do ++ { ++ if (pfr < end_pfr && i < nfixedargs) ++ { ++ *to.f = (float) pfr->d; ++ pfr++; ++ } ++ else ++ *to.f = *from.f; ++ to.f++; ++ from.f++; ++ } ++ while (--elnum != 0); ++ } ++ else ++ { ++ do ++ { ++ if (pfr < end_pfr && i < nfixedargs) ++ { ++ *to.d = pfr->d; ++ pfr++; ++ } ++ else ++ *to.d = *from.d; ++ to.d++; ++ from.d++; ++ } ++ while (--elnum != 0); ++ } ++ } ++ else ++ { ++#ifndef __LITTLE_ENDIAN__ ++ /* Structures with size less than eight bytes are passed ++ left-padded. */ ++ if (arg_types[i]->size < 8) ++ avalue[i] = (char *) pst + 8 - arg_types[i]->size; ++ else ++#endif ++ avalue[i] = pst; ++ } ++ pst += (arg_types[i]->size + 7) / 8; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) ++ { ++ if (pfr + 1 < end_pfr && i + 1 < nfixedargs) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ else ++ { ++ if (pfr < end_pfr && i < nfixedargs) ++ { ++ /* Passed partly in f13 and partly on the stack. ++ Move it all to the stack. */ ++ *pst = *(unsigned long *) pfr; ++ pfr++; ++ } ++ avalue[i] = pst; ++ } ++ pst += 2; ++ break; ++ } ++ /* Fall through. */ ++#endif ++ case FFI_TYPE_DOUBLE: ++ /* On the outgoing stack all values are aligned to 8 */ ++ /* there are 13 64bit floating point registers */ ++ ++ if (pfr < end_pfr && i < nfixedargs) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pst; ++ pst++; ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (pfr < end_pfr && i < nfixedargs) ++ { ++ /* Float values are stored as doubles in the ++ ffi_closure_LINUX64 code. Fix them here. */ ++ pfr->f = (float) pfr->d; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pst; ++ pst++; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ } ++ ++ i++; ++ } ++ ++ ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ ++ if ((cif->flags & FLAG_RETURNS_SMST) != 0) ++ { ++ if ((cif->flags & FLAG_RETURNS_FP) == 0) ++ return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1; ++ else if ((cif->flags & FLAG_RETURNS_64BITS) != 0) ++ return FFI_V2_TYPE_DOUBLE_HOMOG; ++ else ++ return FFI_V2_TYPE_FLOAT_HOMOG; ++ } ++ return cif->rtype->type; ++} ++#endif +diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_powerpc.h b/js/src/ctypes/libffi/src/powerpc/ffi_powerpc.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/powerpc/ffi_powerpc.h +@@ -0,0 +1,77 @@ ++/* ----------------------------------------------------------------------- ++ ffi_powerpc.h - Copyright (C) 2013 IBM ++ Copyright (C) 2011 Anthony Green ++ Copyright (C) 2011 Kyle Moffett ++ Copyright (C) 2008 Red Hat, Inc ++ Copyright (C) 2007, 2008 Free Software Foundation, Inc ++ Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++enum { ++ /* The assembly depends on these exact flags. */ ++ /* These go in cr7 */ ++ FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ ++ FLAG_RETURNS_NOTHING = 1 << (31-30), ++ FLAG_RETURNS_FP = 1 << (31-29), ++ FLAG_RETURNS_64BITS = 1 << (31-28), ++ ++ /* This goes in cr6 */ ++ FLAG_RETURNS_128BITS = 1 << (31-27), ++ ++ FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */ ++ ++ /* These go in cr1 */ ++ FLAG_ARG_NEEDS_COPY = 1 << (31- 7), /* Used by sysv code */ ++ FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */ ++ FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ ++ FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31- 4) ++}; ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++void FFI_HIDDEN ffi_closure_SYSV (void); ++void FFI_HIDDEN ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *, ++ void (*)(void)); ++ ++void FFI_HIDDEN ffi_prep_types_sysv (ffi_abi); ++ffi_status FFI_HIDDEN ffi_prep_cif_sysv (ffi_cif *); ++int FFI_HIDDEN ffi_closure_helper_SYSV (ffi_closure *, void *, unsigned long *, ++ ffi_dblfl *, unsigned long *); ++ ++void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long, unsigned long, ++ unsigned long *, void (*)(void)); ++void FFI_HIDDEN ffi_closure_LINUX64 (void); ++ ++void FFI_HIDDEN ffi_prep_types_linux64 (ffi_abi); ++ffi_status FFI_HIDDEN ffi_prep_cif_linux64 (ffi_cif *); ++ffi_status FFI_HIDDEN ffi_prep_cif_linux64_var (ffi_cif *, unsigned int, ++ unsigned int); ++void FFI_HIDDEN ffi_prep_args64 (extended_cif *, unsigned long *const); ++int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *, ++ unsigned long *, ffi_dblfl *); +diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_sysv.c b/js/src/ctypes/libffi/src/powerpc/ffi_sysv.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/powerpc/ffi_sysv.c +@@ -0,0 +1,931 @@ ++/* ----------------------------------------------------------------------- ++ ffi_sysv.c - Copyright (C) 2013 IBM ++ Copyright (C) 2011 Anthony Green ++ Copyright (C) 2011 Kyle Moffett ++ Copyright (C) 2008 Red Hat, Inc ++ Copyright (C) 2007, 2008 Free Software Foundation, Inc ++ Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include "ffi.h" ++ ++#ifndef POWERPC64 ++#include "ffi_common.h" ++#include "ffi_powerpc.h" ++ ++ ++/* About the SYSV ABI. */ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 8 ++ ++ ++#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++/* Adjust size of ffi_type_longdouble. */ ++void FFI_HIDDEN ++ffi_prep_types_sysv (ffi_abi abi) ++{ ++ if ((abi & (FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128)) == FFI_SYSV) ++ { ++ ffi_type_longdouble.size = 8; ++ ffi_type_longdouble.alignment = 8; ++ } ++ else ++ { ++ ffi_type_longdouble.size = 16; ++ ffi_type_longdouble.alignment = 16; ++ } ++} ++#endif ++ ++/* Transform long double, double and float to other types as per abi. */ ++static int ++translate_float (int abi, int type) ++{ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ if (type == FFI_TYPE_LONGDOUBLE ++ && (abi & FFI_SYSV_LONG_DOUBLE_128) == 0) ++ type = FFI_TYPE_DOUBLE; ++#endif ++ if ((abi & FFI_SYSV_SOFT_FLOAT) != 0) ++ { ++ if (type == FFI_TYPE_FLOAT) ++ type = FFI_TYPE_UINT32; ++ else if (type == FFI_TYPE_DOUBLE) ++ type = FFI_TYPE_UINT64; ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ else if (type == FFI_TYPE_LONGDOUBLE) ++ type = FFI_TYPE_UINT128; ++ } ++ else if ((abi & FFI_SYSV_IBM_LONG_DOUBLE) == 0) ++ { ++ if (type == FFI_TYPE_LONGDOUBLE) ++ type = FFI_TYPE_STRUCT; ++#endif ++ } ++ return type; ++} ++ ++/* Perform machine dependent cif processing */ ++static ffi_status ++ffi_prep_cif_sysv_core (ffi_cif *cif) ++{ ++ ffi_type **ptr; ++ unsigned bytes; ++ unsigned i, fparg_count = 0, intarg_count = 0; ++ unsigned flags = cif->flags; ++ unsigned struct_copy_size = 0; ++ unsigned type = cif->rtype->type; ++ unsigned size = cif->rtype->size; ++ ++ /* The machine-independent calculation of cif->bytes doesn't work ++ for us. Redo the calculation. */ ++ ++ /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ ++ bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); ++ ++ /* Space for the GPR registers. */ ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); ++ ++ /* Return value handling. The rules for SYSV are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are returned ++ in gpr3 and gpr4; ++ - Larger structures are allocated space and a pointer is passed as ++ the first argument. ++ - Single/double FP values are returned in fpr1; ++ - long doubles (if not equivalent to double) are returned in ++ fpr1,fpr2 for Linux and as for large structs for SysV. */ ++ ++ type = translate_float (cif->abi, type); ++ ++ switch (type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ /* Fall through. */ ++#endif ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++#ifdef __NO_FPRS__ ++ return FFI_BAD_ABI; ++#endif ++ break; ++ ++ case FFI_TYPE_UINT128: ++ flags |= FLAG_RETURNS_128BITS; ++ /* Fall through. */ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ /* The final SYSV ABI says that structures smaller or equal 8 bytes ++ are returned in r3/r4. A draft ABI used by linux instead ++ returns them in memory. */ ++ if ((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) ++ { ++ flags |= FLAG_RETURNS_SMST; ++ break; ++ } ++ intarg_count++; ++ flags |= FLAG_RETVAL_REFERENCE; ++ /* Fall through. */ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures and long doubles (if not equivalent ++ to double) are passed as a pointer to a copy of the structure. ++ Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ unsigned short typenum = (*ptr)->type; ++ ++ typenum = translate_float (cif->abi, typenum); ++ ++ switch (typenum) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count++; ++ /* Fall thru */ ++#endif ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++#ifdef __NO_FPRS__ ++ return FFI_BAD_ABI; ++#endif ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ fparg_count++; ++#ifdef __NO_FPRS__ ++ return FFI_BAD_ABI; ++#endif ++ break; ++ ++ case FFI_TYPE_UINT128: ++ /* A long double in FFI_LINUX_SOFT_FLOAT can use only a set ++ of four consecutive gprs. If we do not have enough, we ++ have to adjust the intarg_count value. */ ++ if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3 ++ && intarg_count < NUM_GPR_ARG_REGISTERS) ++ intarg_count = NUM_GPR_ARG_REGISTERS; ++ intarg_count += 4; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. ++ ++ Also, only certain register pairs can be used for ++ passing long long int -- specifically (r3,r4), (r5,r6), ++ (r7,r8), (r9,r10). */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS-1 ++ || intarg_count % 2 != 0) ++ intarg_count++; ++ intarg_count += 2; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ /* We must allocate space for a copy of these to enforce ++ pass-by-value. Pad the space up to a multiple of 16 ++ bytes (the maximum alignment required for anything under ++ the SYSV ABI). */ ++ struct_copy_size += ((*ptr)->size + 15) & ~0xF; ++ /* Fall through (allocate space for the pointer). */ ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ /* Everything else is passed as a 4-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ } ++ } ++ ++ if (fparg_count != 0) ++ flags |= FLAG_FP_ARGUMENTS; ++ if (intarg_count > 4) ++ flags |= FLAG_4_GPR_ARGUMENTS; ++ if (struct_copy_size != 0) ++ flags |= FLAG_ARG_NEEDS_COPY; ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); ++ ++ /* Stack space. */ ++ if (intarg_count > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int); ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double); ++ ++ /* The stack space allocated needs to be a multiple of 16 bytes. */ ++ bytes = (bytes + 15) & ~0xF; ++ ++ /* Add in the space for the copied structures. */ ++ bytes += struct_copy_size; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++ffi_status FFI_HIDDEN ++ffi_prep_cif_sysv (ffi_cif *cif) ++{ ++ if ((cif->abi & FFI_SYSV) == 0) ++ { ++ /* This call is from old code. Translate to new ABI values. */ ++ cif->flags |= FLAG_COMPAT; ++ switch (cif->abi) ++ { ++ default: ++ return FFI_BAD_ABI; ++ ++ case FFI_COMPAT_SYSV: ++ cif->abi = FFI_SYSV | FFI_SYSV_STRUCT_RET | FFI_SYSV_LONG_DOUBLE_128; ++ break; ++ ++ case FFI_COMPAT_GCC_SYSV: ++ cif->abi = FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128; ++ break; ++ ++ case FFI_COMPAT_LINUX: ++ cif->abi = (FFI_SYSV | FFI_SYSV_IBM_LONG_DOUBLE ++ | FFI_SYSV_LONG_DOUBLE_128); ++ break; ++ ++ case FFI_COMPAT_LINUX_SOFT_FLOAT: ++ cif->abi = (FFI_SYSV | FFI_SYSV_SOFT_FLOAT | FFI_SYSV_IBM_LONG_DOUBLE ++ | FFI_SYSV_LONG_DOUBLE_128); ++ break; ++ } ++ } ++ return ffi_prep_cif_sysv_core (cif); ++} ++ ++/* ffi_prep_args_SYSV is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_SYSV 4bytes | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4 | stack pointer here ++ |--------------------------------------------|<+ <<< on entry to ++ | Saved r28-r31 4*4 | | ffi_call_SYSV ++ |--------------------------------------------| | ++ | GPR registers r3-r10 8*4 | | ffi_call_SYSV ++ |--------------------------------------------| | ++ | FPR registers f1-f8 (optional) 8*8 | | ++ |--------------------------------------------| | stack | ++ | Space for copied structures | | grows | ++ |--------------------------------------------| | down V ++ | Parameters that didn't fit in registers | | ++ |--------------------------------------------| | lower addresses ++ | Space for callee's LR 4 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4 |-/ during ++ |--------------------------------------------| <<< ffi_call_SYSV ++ ++*/ ++ ++void FFI_HIDDEN ++ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack) ++{ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ typedef union ++ { ++ char *c; ++ unsigned *u; ++ long long *ll; ++ float *f; ++ double *d; ++ } valp; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++ valp stacktop; ++ ++ /* 'gpr_base' points at the space for gpr3, and grows upwards as ++ we use GPR registers. */ ++ valp gpr_base; ++ int intarg_count; ++ ++#ifndef __NO_FPRS__ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ valp fpr_base; ++ int fparg_count; ++#endif ++ ++ /* 'copy_space' grows down as we put structures in it. It should ++ stay 16-byte aligned. */ ++ valp copy_space; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ valp next_arg; ++ ++ int i; ++ ffi_type **ptr; ++#ifndef __NO_FPRS__ ++ double double_tmp; ++#endif ++ union ++ { ++ void **v; ++ char **c; ++ signed char **sc; ++ unsigned char **uc; ++ signed short **ss; ++ unsigned short **us; ++ unsigned int **ui; ++ long long **ll; ++ float **f; ++ double **d; ++ } p_argv; ++ size_t struct_copy_size; ++ unsigned gprvalue; ++ ++ stacktop.c = (char *) stack + bytes; ++ gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS; ++ intarg_count = 0; ++#ifndef __NO_FPRS__ ++ fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS; ++ fparg_count = 0; ++ copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); ++#else ++ copy_space.c = gpr_base.c; ++#endif ++ next_arg.u = stack + 2; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); ++ FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0); ++ FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); ++ FFI_ASSERT ((bytes & 0xF) == 0); ++ FFI_ASSERT (copy_space.c >= next_arg.c); ++ ++ /* Deal with return values that are actually pass-by-reference. */ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ { ++ *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue; ++ intarg_count++; ++ } ++ ++ /* Now for the arguments. */ ++ p_argv.v = ecif->avalue; ++ for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; ++ i > 0; ++ i--, ptr++, p_argv.v++) ++ { ++ unsigned int typenum = (*ptr)->type; ++ ++ typenum = translate_float (ecif->cif->abi, typenum); ++ ++ /* Now test the translated value */ ++ switch (typenum) ++ { ++#ifndef __NO_FPRS__ ++# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ double_tmp = (*p_argv.d)[0]; ++ ++ if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1) ++ { ++ if (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ { ++ intarg_count++; ++ next_arg.u++; ++ } ++ *next_arg.d = double_tmp; ++ next_arg.u += 2; ++ double_tmp = (*p_argv.d)[1]; ++ *next_arg.d = double_tmp; ++ next_arg.u += 2; ++ } ++ else ++ { ++ *fpr_base.d++ = double_tmp; ++ double_tmp = (*p_argv.d)[1]; ++ *fpr_base.d++ = double_tmp; ++ } ++ ++ fparg_count += 2; ++ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); ++ break; ++# endif ++ case FFI_TYPE_DOUBLE: ++ double_tmp = **p_argv.d; ++ ++ if (fparg_count >= NUM_FPR_ARG_REGISTERS) ++ { ++ if (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ { ++ intarg_count++; ++ next_arg.u++; ++ } ++ *next_arg.d = double_tmp; ++ next_arg.u += 2; ++ } ++ else ++ *fpr_base.d++ = double_tmp; ++ fparg_count++; ++ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ double_tmp = **p_argv.f; ++ if (fparg_count >= NUM_FPR_ARG_REGISTERS) ++ { ++ *next_arg.f = (float) double_tmp; ++ next_arg.u += 1; ++ intarg_count++; ++ } ++ else ++ *fpr_base.d++ = double_tmp; ++ fparg_count++; ++ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); ++ break; ++#endif /* have FPRs */ ++ ++ case FFI_TYPE_UINT128: ++ /* The soft float ABI for long doubles works like this, a long double ++ is passed in four consecutive GPRs if available. A maximum of 2 ++ long doubles can be passed in gprs. If we do not have 4 GPRs ++ left, the long double is passed on the stack, 4-byte aligned. */ ++ { ++ unsigned int int_tmp; ++ unsigned int ii; ++ if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3) ++ { ++ if (intarg_count < NUM_GPR_ARG_REGISTERS) ++ intarg_count = NUM_GPR_ARG_REGISTERS; ++ for (ii = 0; ii < 4; ii++) ++ { ++ int_tmp = (*p_argv.ui)[ii]; ++ *next_arg.u++ = int_tmp; ++ } ++ } ++ else ++ { ++ for (ii = 0; ii < 4; ii++) ++ { ++ int_tmp = (*p_argv.ui)[ii]; ++ *gpr_base.u++ = int_tmp; ++ } ++ } ++ intarg_count += 4; ++ break; ++ } ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ if (intarg_count == NUM_GPR_ARG_REGISTERS-1) ++ intarg_count++; ++ if (intarg_count >= NUM_GPR_ARG_REGISTERS) ++ { ++ if (intarg_count % 2 != 0) ++ { ++ intarg_count++; ++ next_arg.u++; ++ } ++ *next_arg.ll = **p_argv.ll; ++ next_arg.u += 2; ++ } ++ else ++ { ++ /* The abi states only certain register pairs can be ++ used for passing long long int specifically (r3,r4), ++ (r5,r6), (r7,r8), (r9,r10). If next arg is long long ++ but not correct starting register of pair then skip ++ until the proper starting register. */ ++ if (intarg_count % 2 != 0) ++ { ++ intarg_count ++; ++ gpr_base.u++; ++ } ++ *gpr_base.ll++ = **p_argv.ll; ++ } ++ intarg_count += 2; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ struct_copy_size = ((*ptr)->size + 15) & ~0xF; ++ copy_space.c -= struct_copy_size; ++ memcpy (copy_space.c, *p_argv.c, (*ptr)->size); ++ ++ gprvalue = (unsigned long) copy_space.c; ++ ++ FFI_ASSERT (copy_space.c > next_arg.c); ++ FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = **p_argv.uc; ++ goto putgpr; ++ case FFI_TYPE_SINT8: ++ gprvalue = **p_argv.sc; ++ goto putgpr; ++ case FFI_TYPE_UINT16: ++ gprvalue = **p_argv.us; ++ goto putgpr; ++ case FFI_TYPE_SINT16: ++ gprvalue = **p_argv.ss; ++ goto putgpr; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ ++ gprvalue = **p_argv.ui; ++ ++ putgpr: ++ if (intarg_count >= NUM_GPR_ARG_REGISTERS) ++ *next_arg.u++ = gprvalue; ++ else ++ *gpr_base.u++ = gprvalue; ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ FFI_ASSERT (copy_space.c >= next_arg.c); ++ FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS); ++ /* The assert below is testing that the number of integer arguments agrees ++ with the number found in ffi_prep_cif_machdep(). However, intarg_count ++ is incremented whenever we place an FP arg on the stack, so account for ++ that before our assert test. */ ++#ifndef __NO_FPRS__ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count -= fparg_count - NUM_FPR_ARG_REGISTERS; ++ FFI_ASSERT (fpr_base.u ++ <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++#endif ++ FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#define MIN_CACHE_LINE_SIZE 8 ++ ++static void ++flush_icache (char *wraddr, char *xaddr, int size) ++{ ++ int i; ++ for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) ++ __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" ++ : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); ++ __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" ++ : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) ++ : "memory"); ++} ++ ++ffi_status FFI_HIDDEN ++ffi_prep_closure_loc_sysv (ffi_closure *closure, ++ ffi_cif *cif, ++ void (*fun) (ffi_cif *, void *, void **, void *), ++ void *user_data, ++ void *codeloc) ++{ ++ unsigned int *tramp; ++ ++ if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI) ++ return FFI_BAD_ABI; ++ ++ tramp = (unsigned int *) &closure->tramp[0]; ++ tramp[0] = 0x7c0802a6; /* mflr r0 */ ++ tramp[1] = 0x4800000d; /* bl 10 */ ++ tramp[4] = 0x7d6802a6; /* mflr r11 */ ++ tramp[5] = 0x7c0803a6; /* mtlr r0 */ ++ tramp[6] = 0x800b0000; /* lwz r0,0(r11) */ ++ tramp[7] = 0x816b0004; /* lwz r11,4(r11) */ ++ tramp[8] = 0x7c0903a6; /* mtctr r0 */ ++ tramp[9] = 0x4e800420; /* bctr */ ++ *(void **) &tramp[2] = (void *) ffi_closure_SYSV; /* function */ ++ *(void **) &tramp[3] = codeloc; /* context */ ++ ++ /* Flush the icache. */ ++ flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++/* Basically the trampoline invokes ffi_closure_SYSV, and on ++ entry, r11 holds the address of the closure. ++ After storing the registers that could possibly contain ++ parameters to be passed into the stack frame and setting ++ up space for a return value, ffi_closure_SYSV invokes the ++ following helper function to do most of the work. */ ++ ++int ++ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, ++ unsigned long *pgr, ffi_dblfl *pfr, ++ unsigned long *pst) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly */ ++ /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ ++ /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ ++ /* pst is the pointer to outgoing parameter stack in original caller */ ++ ++ void ** avalue; ++ ffi_type ** arg_types; ++ long i, avn; ++#ifndef __NO_FPRS__ ++ long nf = 0; /* number of floating registers already used */ ++#endif ++ long ng = 0; /* number of general registers already used */ ++ ++ ffi_cif *cif = closure->cif; ++ unsigned size = cif->rtype->size; ++ unsigned short rtypenum = cif->rtype->type; ++ ++ avalue = alloca (cif->nargs * sizeof (void *)); ++ ++ /* First translate for softfloat/nonlinux */ ++ rtypenum = translate_float (cif->abi, rtypenum); ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. ++ For FFI_SYSV the result is passed in r3/r4 if the struct size is less ++ or equal 8 bytes. */ ++ if (rtypenum == FFI_TYPE_STRUCT ++ && !((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)) ++ { ++ rvalue = (void *) *pgr; ++ ng++; ++ pgr++; ++ } ++ ++ i = 0; ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ while (i < avn) { ++ unsigned short typenum = arg_types[i]->type; ++ ++ /* We may need to handle some values depending on ABI. */ ++ typenum = translate_float (cif->abi, typenum); ++ ++ switch (typenum) ++ { ++#ifndef __NO_FPRS__ ++ case FFI_TYPE_FLOAT: ++ /* Unfortunately float values are stored as doubles ++ in the ffi_closure_SYSV code (since we don't check ++ the type in that routine). */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ /* FIXME? here we are really changing the values ++ stored in the original calling routines outgoing ++ parameter stack. This is probably a really ++ naughty thing to do but... */ ++ double temp = pfr->d; ++ pfr->f = (float) temp; ++ avalue[i] = pfr; ++ nf++; ++ pfr++; ++ } ++ else ++ { ++ avalue[i] = pst; ++ pst += 1; ++ } ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ nf++; ++ pfr++; ++ } ++ else ++ { ++ if (((long) pst) & 4) ++ pst++; ++ avalue[i] = pst; ++ pst += 2; ++ } ++ break; ++ ++# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ nf += 2; ++ } ++ else ++ { ++ if (((long) pst) & 4) ++ pst++; ++ avalue[i] = pst; ++ pst += 4; ++ nf = 8; ++ } ++ break; ++# endif ++#endif ++ ++ case FFI_TYPE_UINT128: ++ /* Test if for the whole long double, 4 gprs are available. ++ otherwise the stuff ends up on the stack. */ ++ if (ng < NUM_GPR_ARG_REGISTERS - 3) ++ { ++ avalue[i] = pgr; ++ pgr += 4; ++ ng += 4; ++ } ++ else ++ { ++ avalue[i] = pst; ++ pst += 4; ++ ng = 8+4; ++ } ++ break; ++ ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++#ifndef __LITTLE_ENDIAN__ ++ if (ng < NUM_GPR_ARG_REGISTERS) ++ { ++ avalue[i] = (char *) pgr + 3; ++ ng++; ++ pgr++; ++ } ++ else ++ { ++ avalue[i] = (char *) pst + 3; ++ pst++; ++ } ++ break; ++#endif ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++#ifndef __LITTLE_ENDIAN__ ++ if (ng < NUM_GPR_ARG_REGISTERS) ++ { ++ avalue[i] = (char *) pgr + 2; ++ ng++; ++ pgr++; ++ } ++ else ++ { ++ avalue[i] = (char *) pst + 2; ++ pst++; ++ } ++ break; ++#endif ++ ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_POINTER: ++ if (ng < NUM_GPR_ARG_REGISTERS) ++ { ++ avalue[i] = pgr; ++ ng++; ++ pgr++; ++ } ++ else ++ { ++ avalue[i] = pst; ++ pst++; ++ } ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ /* Structs are passed by reference. The address will appear in a ++ gpr if it is one of the first 8 arguments. */ ++ if (ng < NUM_GPR_ARG_REGISTERS) ++ { ++ avalue[i] = (void *) *pgr; ++ ng++; ++ pgr++; ++ } ++ else ++ { ++ avalue[i] = (void *) *pst; ++ pst++; ++ } ++ break; ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Passing long long ints are complex, they must ++ be passed in suitable register pairs such as ++ (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) ++ and if the entire pair aren't available then the outgoing ++ parameter stack is used for both but an alignment of 8 ++ must will be kept. So we must either look in pgr ++ or pst to find the correct address for this type ++ of parameter. */ ++ if (ng < NUM_GPR_ARG_REGISTERS - 1) ++ { ++ if (ng & 1) ++ { ++ /* skip r4, r6, r8 as starting points */ ++ ng++; ++ pgr++; ++ } ++ avalue[i] = pgr; ++ ng += 2; ++ pgr += 2; ++ } ++ else ++ { ++ if (((long) pst) & 4) ++ pst++; ++ avalue[i] = pst; ++ pst += 2; ++ ng = NUM_GPR_ARG_REGISTERS; ++ } ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ } ++ ++ i++; ++ } ++ ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_SYSV how to perform return type promotions. ++ Because the FFI_SYSV ABI returns the structures <= 8 bytes in ++ r3/r4 we have to tell ffi_closure_SYSV how to treat them. We ++ combine the base type FFI_SYSV_TYPE_SMALL_STRUCT with the size of ++ the struct less one. We never have a struct with size zero. ++ See the comment in ffitarget.h about ordering. */ ++ if (rtypenum == FFI_TYPE_STRUCT ++ && (cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) ++ return FFI_SYSV_TYPE_SMALL_STRUCT - 1 + size; ++ return rtypenum; ++} ++#endif +diff --git a/js/src/ctypes/libffi/src/powerpc/ffitarget.h b/js/src/ctypes/libffi/src/powerpc/ffitarget.h +--- a/js/src/ctypes/libffi/src/powerpc/ffitarget.h ++++ b/js/src/ctypes/libffi/src/powerpc/ffitarget.h +@@ -35,72 +35,106 @@ + #endif + + /* ---- System specific configurations ----------------------------------- */ + + #if defined (POWERPC) && defined (__powerpc64__) /* linux64 */ + #ifndef POWERPC64 + #define POWERPC64 + #endif +-#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin */ ++#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */ + #ifndef POWERPC64 + #define POWERPC64 + #endif ++#ifndef POWERPC_DARWIN64 ++#define POWERPC_DARWIN64 ++#endif + #elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ + #ifndef POWERPC64 + #define POWERPC64 + #endif + #endif + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +-#ifdef POWERPC +- FFI_SYSV, +- FFI_GCC_SYSV, +- FFI_LINUX64, +- FFI_LINUX, +- FFI_LINUX_SOFT_FLOAT, +-# if defined(POWERPC64) +- FFI_DEFAULT_ABI = FFI_LINUX64, +-# elif defined(__NO_FPRS__) +- FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, +-# elif (__LDBL_MANT_DIG__ == 106) +- FFI_DEFAULT_ABI = FFI_LINUX, ++#if defined (POWERPC_AIX) ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++ FFI_LAST_ABI ++ ++#elif defined (POWERPC_DARWIN) ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++ FFI_LAST_ABI ++ ++#else ++ /* The FFI_COMPAT values are used by old code. Since libffi may be ++ a shared library we have to support old values for backwards ++ compatibility. */ ++ FFI_COMPAT_SYSV, ++ FFI_COMPAT_GCC_SYSV, ++ FFI_COMPAT_LINUX64, ++ FFI_COMPAT_LINUX, ++ FFI_COMPAT_LINUX_SOFT_FLOAT, ++ ++# if defined (POWERPC64) ++ /* This bit, always set in new code, must not be set in any of the ++ old FFI_COMPAT values that might be used for 64-bit linux. We ++ only need worry about FFI_COMPAT_LINUX64, but to be safe avoid ++ all old values. */ ++ FFI_LINUX = 8, ++ /* This and following bits can reuse FFI_COMPAT values. */ ++ FFI_LINUX_STRUCT_ALIGN = 1, ++ FFI_LINUX_LONG_DOUBLE_128 = 2, ++ FFI_DEFAULT_ABI = (FFI_LINUX ++# ifdef __STRUCT_PARM_ALIGN__ ++ | FFI_LINUX_STRUCT_ALIGN ++# endif ++# ifdef __LONG_DOUBLE_128__ ++ | FFI_LINUX_LONG_DOUBLE_128 ++# endif ++ ), ++ FFI_LAST_ABI = 12 ++ + # else +- FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++ /* This bit, always set in new code, must not be set in any of the ++ old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */ ++ FFI_SYSV = 8, ++ /* This and following bits can reuse FFI_COMPAT values. */ ++ FFI_SYSV_SOFT_FLOAT = 1, ++ FFI_SYSV_STRUCT_RET = 2, ++ FFI_SYSV_IBM_LONG_DOUBLE = 4, ++ FFI_SYSV_LONG_DOUBLE_128 = 16, ++ ++ FFI_DEFAULT_ABI = (FFI_SYSV ++# ifdef __NO_FPRS__ ++ | FFI_SYSV_SOFT_FLOAT ++# endif ++# if (defined (__SVR4_STRUCT_RETURN) \ ++ || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN)) ++ | FFI_SYSV_STRUCT_RET ++# endif ++# if __LDBL_MANT_DIG__ == 106 ++ | FFI_SYSV_IBM_LONG_DOUBLE ++# endif ++# ifdef __LONG_DOUBLE_128__ ++ | FFI_SYSV_LONG_DOUBLE_128 ++# endif ++ ), ++ FFI_LAST_ABI = 32 + # endif + #endif + +-#ifdef POWERPC_AIX +- FFI_AIX, +- FFI_DARWIN, +- FFI_DEFAULT_ABI = FFI_AIX, +-#endif +- +-#ifdef POWERPC_DARWIN +- FFI_AIX, +- FFI_DARWIN, +- FFI_DEFAULT_ABI = FFI_DARWIN, +-#endif +- +-#ifdef POWERPC_FREEBSD +- FFI_SYSV, +- FFI_GCC_SYSV, +- FFI_LINUX64, +- FFI_LINUX, +- FFI_LINUX_SOFT_FLOAT, +- FFI_DEFAULT_ABI = FFI_SYSV, +-#endif +- +- FFI_LAST_ABI + } ffi_abi; + #endif + + /* ---- Definitions for closures ----------------------------------------- */ + + #define FFI_CLOSURES 1 + #define FFI_NATIVE_RAW_API 0 + #if defined (POWERPC) || defined (POWERPC_FREEBSD) +@@ -109,31 +143,33 @@ typedef enum ffi_abi { + #endif + + /* For additional types like the below, take care about the order in + ppc_closures.S. They must follow after the FFI_TYPE_LAST. */ + + /* Needed for soft-float long-double-128 support. */ + #define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1) + +-/* Needed for FFI_SYSV small structure returns. +- We use two flag bits, (FLAG_SYSV_SMST_R3, FLAG_SYSV_SMST_R4) which are +- defined in ffi.c, to determine the exact return type and its size. */ ++/* Needed for FFI_SYSV small structure returns. */ + #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2) + + /* Used by ELFv2 for homogenous structure returns. */ + #define FFI_V2_TYPE_FLOAT_HOMOG (FFI_TYPE_LAST + 1) + #define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_TYPE_LAST + 2) + #define FFI_V2_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 3) + + #if _CALL_ELF == 2 + # define FFI_TRAMPOLINE_SIZE 32 + #else + # if defined(POWERPC64) || defined(POWERPC_AIX) +-# define FFI_TRAMPOLINE_SIZE 24 ++# if defined(POWERPC_DARWIN64) ++# define FFI_TRAMPOLINE_SIZE 48 ++# else ++# define FFI_TRAMPOLINE_SIZE 24 ++# endif + # else /* POWERPC || POWERPC_AIX */ + # define FFI_TRAMPOLINE_SIZE 40 + # endif + #endif + + #ifndef LIBFFI_ASM + #if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) + struct ffi_aix_trampoline_struct { +diff --git a/js/src/ctypes/libffi/src/powerpc/linux64.S b/js/src/ctypes/libffi/src/powerpc/linux64.S +--- a/js/src/ctypes/libffi/src/powerpc/linux64.S ++++ b/js/src/ctypes/libffi/src/powerpc/linux64.S +@@ -24,17 +24,17 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + #define LIBFFI_ASM + #include + #include + +-#ifdef __powerpc64__ ++#ifdef POWERPC64 + .hidden ffi_call_LINUX64 + .globl ffi_call_LINUX64 + # if _CALL_ELF == 2 + .text + ffi_call_LINUX64: + addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha + addi %r2, %r2, .TOC.-ffi_call_LINUX64@l + .localentry ffi_call_LINUX64, . - ffi_call_LINUX64 +diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/libffi/src/powerpc/linux64_closure.S +--- a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S ++++ b/js/src/ctypes/libffi/src/powerpc/linux64_closure.S +@@ -25,17 +25,17 @@ + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + #define LIBFFI_ASM + #include + #include + + .file "linux64_closure.S" + +-#ifdef __powerpc64__ ++#ifdef POWERPC64 + FFI_HIDDEN (ffi_closure_LINUX64) + .globl ffi_closure_LINUX64 + # if _CALL_ELF == 2 + .text + ffi_closure_LINUX64: + addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha + addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l + .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64 +@@ -95,16 +95,20 @@ ffi_closure_LINUX64: + std %r7, 32(%r12) + std %r8, 40(%r12) + std %r9, 48(%r12) + std %r10, 56(%r12) + + # load up the pointer to the parm save area + mr %r5, %r12 + # else ++ # copy r2 to r11 and load TOC into r2 ++ mr %r11, %r2 ++ ld %r2, 16(%r11) ++ + mflr %r0 + # Save general regs into parm save area + # This is the parameter save area set up by our caller. + std %r3, PARMSAVE+0(%r1) + std %r4, PARMSAVE+8(%r1) + std %r5, PARMSAVE+16(%r1) + std %r6, PARMSAVE+24(%r1) + std %r7, PARMSAVE+32(%r1) +diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libffi/src/powerpc/ppc_closure.S +--- a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S ++++ b/js/src/ctypes/libffi/src/powerpc/ppc_closure.S +@@ -26,17 +26,17 @@ + ----------------------------------------------------------------------- */ + #define LIBFFI_ASM + #include + #include + #include + + .file "ppc_closure.S" + +-#ifndef __powerpc64__ ++#ifndef POWERPC64 + + ENTRY(ffi_closure_SYSV) + .LFB1: + stwu %r1,-144(%r1) + .LCFI0: + mflr %r0 + .LCFI1: + stw %r0,148(%r1) +@@ -322,17 +322,17 @@ ENTRY(ffi_closure_SYSV) + blr + #endif + + .Luint128: + lwz %r6,112+12(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr +- ++ + END(ffi_closure_SYSV) + + .section ".eh_frame",EH_FRAME_FLAGS,@progbits + .Lframe1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry + .LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version +@@ -373,13 +373,12 @@ END(ffi_closure_SYSV) + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI1-.LCFI0 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x41 + .sleb128 -1 + .align 2 + .LEFDE1: + +-#endif +- + #if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits + #endif ++#endif +diff --git a/js/src/ctypes/libffi/src/powerpc/sysv.S b/js/src/ctypes/libffi/src/powerpc/sysv.S +--- a/js/src/ctypes/libffi/src/powerpc/sysv.S ++++ b/js/src/ctypes/libffi/src/powerpc/sysv.S +@@ -25,17 +25,17 @@ + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + #define LIBFFI_ASM + #include + #include + #include + +-#ifndef __powerpc64__ ++#ifndef POWERPC64 + .globl ffi_prep_args_SYSV + ENTRY(ffi_call_SYSV) + .LFB1: + /* Save the old stack pointer as AP. */ + mr %r8,%r1 + + .LCFI0: + /* Allocate the stack space we need. */ +@@ -208,13 +208,13 @@ END(ffi_call_SYSV) + .byte 0x9c /* DW_CFA_offset, column 0x1c */ + .uleb128 0x4 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI6-.LCFI5 + .byte 0xd /* DW_CFA_def_cfa_register */ + .uleb128 0x1c + .align 2 + .LEFDE1: +-#endif + + #if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits + #endif ++#endif +diff --git a/js/src/ctypes/libffi/src/prep_cif.c b/js/src/ctypes/libffi/src/prep_cif.c +--- a/js/src/ctypes/libffi/src/prep_cif.c ++++ b/js/src/ctypes/libffi/src/prep_cif.c +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- prep_cif.c - Copyright (c) 1996, 1998, 2007 Red Hat, Inc. ++ prep_cif.c - Copyright (c) 2011, 2012 Anthony Green ++ Copyright (c) 1996, 1998, 2007 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: +@@ -32,27 +33,31 @@ + + /* Perform machine independent initialization of aggregate type + specifications. */ + + static ffi_status initialize_aggregate(ffi_type *arg) + { + ffi_type **ptr; + +- FFI_ASSERT(arg != NULL); ++ if (UNLIKELY(arg == NULL || arg->elements == NULL)) ++ return FFI_BAD_TYPEDEF; + +- FFI_ASSERT(arg->elements != NULL); +- FFI_ASSERT(arg->size == 0); +- FFI_ASSERT(arg->alignment == 0); ++ arg->size = 0; ++ arg->alignment = 0; + + ptr = &(arg->elements[0]); + ++ if (UNLIKELY(ptr == 0)) ++ return FFI_BAD_TYPEDEF; ++ + while ((*ptr) != NULL) + { +- if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ if (UNLIKELY(((*ptr)->size == 0) ++ && (initialize_aggregate((*ptr)) != FFI_OK))) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + +@@ -66,61 +71,95 @@ static ffi_status initialize_aggregate(f + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN (arg->size, arg->alignment); + ++ /* On some targets, the ABI defines that structures have an additional ++ alignment beyond the "natural" one based on their elements. */ ++#ifdef FFI_AGGREGATE_ALIGNMENT ++ if (FFI_AGGREGATE_ALIGNMENT > arg->alignment) ++ arg->alignment = FFI_AGGREGATE_ALIGNMENT; ++#endif ++ + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + else + return FFI_OK; + } + + #ifndef __CRIS__ + /* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + + /* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +-ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, +- ffi_type *rtype, ffi_type **atypes) ++/* For non variadic functions isvariadic should be 0 and ++ nfixedargs==ntotalargs. ++ ++ For variadic calls, isvariadic should be 1 and nfixedargs ++ and ntotalargs set as appropriate. nfixedargs must always be >=1 */ ++ ++ ++ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, ++ unsigned int isvariadic, ++ unsigned int nfixedargs, ++ unsigned int ntotalargs, ++ ffi_type *rtype, ffi_type **atypes) + { + unsigned bytes = 0; + unsigned int i; + ffi_type **ptr; + + FFI_ASSERT(cif != NULL); +- FFI_ASSERT(abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); ++ FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); ++ FFI_ASSERT(nfixedargs <= ntotalargs); ++ ++ if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) ++ return FFI_BAD_ABI; + + cif->abi = abi; + cif->arg_types = atypes; +- cif->nargs = nargs; ++ cif->nargs = ntotalargs; + cif->rtype = rtype; + + cif->flags = 0; + ++#if HAVE_LONG_DOUBLE_VARIANT ++ ffi_prep_types (abi); ++#endif ++ + /* Initialize the return type if necessary */ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */ + #if !defined M68K && !defined X86_ANY && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT + #ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) + #endif ++#ifdef TILE ++ && (cif->rtype->size > 10 * FFI_SIZEOF_ARG) ++#endif ++#ifdef XTENSA ++ && (cif->rtype->size > 16) ++#endif ++#ifdef NIOS2 ++ && (cif->rtype->size > 8) ++#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); + #endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + + /* Initialize any uninitialized aggregate type definitions */ +@@ -138,30 +177,65 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ff + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else + #endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) +- bytes = ALIGN(bytes, (*ptr)->alignment); ++ bytes = (unsigned)ALIGN(bytes, (*ptr)->alignment); ++ ++#ifdef TILE ++ if (bytes < 10 * FFI_SIZEOF_ARG && ++ bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG) ++ { ++ /* An argument is never split between the 10 parameter ++ registers and the stack. */ ++ bytes = 10 * FFI_SIZEOF_ARG; ++ } ++#endif ++#ifdef XTENSA ++ if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4) ++ bytes = 6*4; ++#endif + + bytes += STACK_ARG_SIZE((*ptr)->size); + } + #endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ ++#ifdef FFI_TARGET_SPECIFIC_VARIADIC ++ if (isvariadic) ++ return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs); ++#endif ++ + return ffi_prep_cif_machdep(cif); + } + #endif /* not __CRIS__ */ + ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes) ++{ ++ return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes); ++} ++ ++ffi_status ffi_prep_cif_var(ffi_cif *cif, ++ ffi_abi abi, ++ unsigned int nfixedargs, ++ unsigned int ntotalargs, ++ ffi_type *rtype, ++ ffi_type **atypes) ++{ ++ return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes); ++} ++ + #if FFI_CLOSURES + + ffi_status + ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) + { +diff --git a/js/src/ctypes/libffi/src/s390/ffi.c b/js/src/ctypes/libffi/src/s390/ffi.c +--- a/js/src/ctypes/libffi/src/s390/ffi.c ++++ b/js/src/ctypes/libffi/src/s390/ffi.c +@@ -745,17 +745,18 @@ ffi_closure_helper_SYSV (ffi_closure *cl + + ffi_status + ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) + { +- FFI_ASSERT (cif->abi == FFI_SYSV); ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; + + #ifndef __s390x__ + *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ + *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */ + *(short *)&closure->tramp [4] = 0x1006; + *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */ + *(long *)&closure->tramp [8] = (long)codeloc; + *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV; +diff --git a/js/src/ctypes/libffi/src/s390/ffitarget.h b/js/src/ctypes/libffi/src/s390/ffitarget.h +--- a/js/src/ctypes/libffi/src/s390/ffitarget.h ++++ b/js/src/ctypes/libffi/src/s390/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for S390. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + #if defined (__s390x__) + #ifndef S390X + #define S390X + #endif + #endif + + /* ---- System specific configurations ----------------------------------- */ + +diff --git a/js/src/ctypes/libffi/src/sh/ffi.c b/js/src/ctypes/libffi/src/sh/ffi.c +--- a/js/src/ctypes/libffi/src/sh/ffi.c ++++ b/js/src/ctypes/libffi/src/sh/ffi.c +@@ -1,10 +1,10 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Kaz Kojima ++ ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima + Copyright (c) 2008 Red Hat, Inc. + + SuperH Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, +@@ -36,17 +36,17 @@ + #endif + + #if defined(__HITACHI__) + #define STRUCT_VALUE_ADDRESS_WITH_ARG 1 + #else + #define STRUCT_VALUE_ADDRESS_WITH_ARG 0 + #endif + +-/* If the structure has essentialy an unique element, return its type. */ ++/* If the structure has essentially an unique element, return its type. */ + static int + simple_type (ffi_type *arg) + { + if (arg->type != FFI_TYPE_STRUCT) + return arg->type; + else if (arg->elements[1]) + return FFI_TYPE_STRUCT; + +@@ -458,17 +458,18 @@ ffi_prep_closure_loc (ffi_closure* closu + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) + { + unsigned int *tramp; + unsigned int insn; + +- FFI_ASSERT (cif->abi == FFI_GCC_SYSV); ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; + + tramp = (unsigned int *) &closure->tramp[0]; + /* Set T bit if the function returns a struct pointed with R2. */ + insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT + ? 0x0018 /* sett */ + : 0x0008 /* clrt */); + + #ifdef __LITTLE_ENDIAN__ +diff --git a/js/src/ctypes/libffi/src/sh/ffitarget.h b/js/src/ctypes/libffi/src/sh/ffitarget.h +--- a/js/src/ctypes/libffi/src/sh/ffitarget.h ++++ b/js/src/ctypes/libffi/src/sh/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SuperH. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + /* ---- Generic type definitions ----------------------------------------- */ + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, +diff --git a/js/src/ctypes/libffi/src/sh64/ffi.c b/js/src/ctypes/libffi/src/sh64/ffi.c +--- a/js/src/ctypes/libffi/src/sh64/ffi.c ++++ b/js/src/ctypes/libffi/src/sh64/ffi.c +@@ -1,10 +1,10 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 2003, 2004, 2006, 2007 Kaz Kojima ++ ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima + Copyright (c) 2008 Anthony Green + + SuperH SHmedia Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, +@@ -297,17 +297,18 @@ ffi_status + ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) + { + unsigned int *tramp; + +- FFI_ASSERT (cif->abi == FFI_GCC_SYSV); ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; + + tramp = (unsigned int *) &closure->tramp[0]; + /* Since ffi_closure is an aligned object, the ffi trampoline is + called as an SHcompact code. Sigh. + SHcompact part: + mova @(1,pc),r0; add #1,r0; jmp @r0; nop; + SHmedia part: + movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0 +diff --git a/js/src/ctypes/libffi/src/sh64/ffitarget.h b/js/src/ctypes/libffi/src/sh64/ffitarget.h +--- a/js/src/ctypes/libffi/src/sh64/ffitarget.h ++++ b/js/src/ctypes/libffi/src/sh64/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SuperH - SHmedia. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + /* ---- Generic type definitions ----------------------------------------- */ + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, +diff --git a/js/src/ctypes/libffi/src/sparc/ffi.c b/js/src/ctypes/libffi/src/sparc/ffi.c +--- a/js/src/ctypes/libffi/src/sparc/ffi.c ++++ b/js/src/ctypes/libffi/src/sparc/ffi.c +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 1996, 2003, 2004, 2007, 2008 Red Hat, Inc. ++ ffi.c - Copyright (c) 2011, 2013 Anthony Green ++ Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. + + SPARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -370,16 +371,20 @@ int ffi_v9_layout_struct(ffi_type *arg, + #ifdef SPARC64 + extern int ffi_call_v9(void *, extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)(void)); + #else + extern int ffi_call_v8(void *, extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)(void)); + #endif + ++#ifndef __GNUC__ ++void ffi_flush_icache (void *, size_t); ++#endif ++ + void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) + { + extended_cif ecif; + void *rval = rvalue; + + ecif.cif = cif; + ecif.avalue = avalue; + +@@ -401,18 +406,64 @@ void ffi_call(ffi_cif *cif, void (*fn)(v + + switch (cif->abi) + { + case FFI_V8: + #ifdef SPARC64 + /* We don't yet support calling 32bit code from 64bit */ + FFI_ASSERT(0); + #else +- ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, +- cif->flags, rvalue, fn); ++ if (rvalue && (cif->rtype->type == FFI_TYPE_STRUCT ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ || cif->flags == FFI_TYPE_LONGDOUBLE ++#endif ++ )) ++ { ++ /* For v8, we need an "unimp" with size of returning struct */ ++ /* behind "call", so we alloc some executable space for it. */ ++ /* l7 is used, we need to make sure v8.S doesn't use %l7. */ ++ unsigned int *call_struct = NULL; ++ ffi_closure_alloc(32, (void **)&call_struct); ++ if (call_struct) ++ { ++ unsigned long f = (unsigned long)fn; ++ call_struct[0] = 0xae10001f; /* mov %i7, %l7 */ ++ call_struct[1] = 0xbe10000f; /* mov %o7, %i7 */ ++ call_struct[2] = 0x03000000 | f >> 10; /* sethi %hi(fn), %g1 */ ++ call_struct[3] = 0x9fc06000 | (f & 0x3ff); /* jmp %g1+%lo(fn), %o7 */ ++ call_struct[4] = 0x01000000; /* nop */ ++ if (cif->rtype->size < 0x7f) ++ call_struct[5] = cif->rtype->size; /* unimp */ ++ else ++ call_struct[5] = 0x01000000; /* nop */ ++ call_struct[6] = 0x81c7e008; /* ret */ ++ call_struct[7] = 0xbe100017; /* mov %l7, %i7 */ ++#ifdef __GNUC__ ++ asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : : ++ "r" (call_struct) : "memory"); ++ /* SPARC v8 requires 5 instructions for flush to be visible */ ++ asm volatile ("nop; nop; nop; nop; nop"); ++#else ++ ffi_flush_icache (call_struct, 32); ++#endif ++ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, ++ cif->flags, rvalue, call_struct); ++ ffi_closure_free(call_struct); ++ } ++ else ++ { ++ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, ++ cif->flags, rvalue, fn); ++ } ++ } ++ else ++ { ++ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, ++ cif->flags, rvalue, fn); ++ } + #endif + break; + case FFI_V9: + #ifdef SPARC64 + ffi_call_v9(ffi_prep_args_v9, &ecif, cif->bytes, + cif->flags, rval, fn); + if (rvalue && rval && cif->rtype->type == FFI_TYPE_STRUCT) + ffi_v9_layout_struct(cif->rtype, 0, (char *)rvalue, (char *)rval, ((char *)rval)+32); +@@ -420,17 +471,16 @@ void ffi_call(ffi_cif *cif, void (*fn)(v + /* And vice versa */ + FFI_ASSERT(0); + #endif + break; + default: + FFI_ASSERT(0); + break; + } +- + } + + + #ifdef SPARC64 + extern void ffi_closure_v9(void); + #else + extern void ffi_closure_v8(void); + #endif +@@ -442,44 +492,50 @@ ffi_prep_closure_loc (ffi_closure* closu + void *user_data, + void *codeloc) + { + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + unsigned long fn; + #ifdef SPARC64 + /* Trampoline address is equal to the closure address. We take advantage + of that to reduce the trampoline size by 8 bytes. */ +- FFI_ASSERT (cif->abi == FFI_V9); ++ if (cif->abi != FFI_V9) ++ return FFI_BAD_ABI; + fn = (unsigned long) ffi_closure_v9; + tramp[0] = 0x83414000; /* rd %pc, %g1 */ + tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ + tramp[2] = 0x81c14000; /* jmp %g5 */ + tramp[3] = 0x01000000; /* nop */ + *((unsigned long *) &tramp[4]) = fn; + #else + unsigned long ctx = (unsigned long) codeloc; +- FFI_ASSERT (cif->abi == FFI_V8); ++ if (cif->abi != FFI_V8) ++ return FFI_BAD_ABI; + fn = (unsigned long) ffi_closure_v8; + tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ + tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ + tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ + tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ + #endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + +- /* Flush the Icache. FIXME: alignment isn't certain, assume 8 bytes */ ++ /* Flush the Icache. closure is 8 bytes aligned. */ ++#ifdef __GNUC__ + #ifdef SPARC64 +- asm volatile ("flush %0" : : "r" (closure) : "memory"); +- asm volatile ("flush %0" : : "r" (((char *) closure) + 8) : "memory"); ++ asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory"); + #else +- asm volatile ("iflush %0" : : "r" (closure) : "memory"); +- asm volatile ("iflush %0" : : "r" (((char *) closure) + 8) : "memory"); ++ asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory"); ++ /* SPARC v8 requires 5 instructions for flush to be visible */ ++ asm volatile ("nop; nop; nop; nop; nop"); ++#endif ++#else ++ ffi_flush_icache (closure, 16); + #endif + + return FFI_OK; + } + + int + ffi_closure_sparc_inner_v8(ffi_closure *closure, + void *rvalue, unsigned long *gpr, unsigned long *scratch) +diff --git a/js/src/ctypes/libffi/src/sparc/ffitarget.h b/js/src/ctypes/libffi/src/sparc/ffitarget.h +--- a/js/src/ctypes/libffi/src/sparc/ffitarget.h ++++ b/js/src/ctypes/libffi/src/sparc/ffitarget.h +@@ -1,10 +1,11 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SPARC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -22,16 +23,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + /* ---- System specific configurations ----------------------------------- */ + + #if defined(__arch64__) || defined(__sparcv9) + #ifndef SPARC64 + #define SPARC64 + #endif + #endif + +diff --git a/js/src/ctypes/libffi/src/sparc/v8.S b/js/src/ctypes/libffi/src/sparc/v8.S +--- a/js/src/ctypes/libffi/src/sparc/v8.S ++++ b/js/src/ctypes/libffi/src/sparc/v8.S +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- v8.S - Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. ++ v8.S - Copyright (c) 2013 The Written Word, Inc. ++ Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. + + SPARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -26,21 +27,49 @@ + + #define LIBFFI_ASM + #include + #include + + #define STACKFRAME 96 /* Minimum stack framesize for SPARC */ + #define ARGS (64+4) /* Offset of register area in frame */ + +-.text ++#ifndef __GNUC__ ++ .text ++ .align 8 ++.globl ffi_flush_icache ++.globl _ffi_flush_icache ++ ++ffi_flush_icache: ++_ffi_flush_icache: ++ add %o0, %o1, %o2 ++#ifdef SPARC64 ++1: flush %o0 ++#else ++1: iflush %o0 ++#endif ++ add %o0, 8, %o0 ++ cmp %o0, %o2 ++ blt 1b ++ nop ++ nop ++ nop ++ nop ++ nop ++ retl ++ nop ++.ffi_flush_icache_end: ++ .size ffi_flush_icache,.ffi_flush_icache_end-ffi_flush_icache ++#endif ++ ++ .text + .align 8 + .globl ffi_call_v8 + .globl _ffi_call_v8 +- ++ + ffi_call_v8: + _ffi_call_v8: + .LLFB1: + save %sp, -STACKFRAME, %sp + .LLCFI0: + + sub %sp, %i2, %sp ! alloca() space in stack for frame to set up + add %sp, STACKFRAME, %l0 ! %l0 has start of +@@ -208,16 +237,20 @@ ffi_closure_v8: + + cmp %o0, FFI_TYPE_STRUCT + be done2 + + cmp %o0, FFI_TYPE_SINT64 + be,a done1 + ldd [%fp-8], %i0 + ++ cmp %o0, FFI_TYPE_UINT64 ++ be,a done1 ++ ldd [%fp-8], %i0 ++ + ld [%fp-8], %i0 + done1: + jmp %i7+8 + restore + done2: + ! Skip 'unimp'. + jmp %i7+12 + restore +diff --git a/js/src/ctypes/libffi/src/sparc/v9.S b/js/src/ctypes/libffi/src/sparc/v9.S +--- a/js/src/ctypes/libffi/src/sparc/v9.S ++++ b/js/src/ctypes/libffi/src/sparc/v9.S +@@ -27,17 +27,17 @@ + #define LIBFFI_ASM + #include + #include + + #ifdef SPARC64 + /* Only compile this in for 64bit builds, because otherwise the object file + will have inproper architecture due to used instructions. */ + +-#define STACKFRAME 128 /* Minimum stack framesize for SPARC */ ++#define STACKFRAME 176 /* Minimum stack framesize for SPARC 64-bit */ + #define STACK_BIAS 2047 + #define ARGS (128) /* Offset of register area in frame */ + + .text + .align 8 + .globl ffi_call_v9 + .globl _ffi_call_v9 + +diff --git a/js/src/ctypes/libffi/src/tile/ffi.c b/js/src/ctypes/libffi/src/tile/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/tile/ffi.c +@@ -0,0 +1,355 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2012 Tilera Corp. ++ ++ TILE Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++/* The first 10 registers are used to pass arguments and return values. */ ++#define NUM_ARG_REGS 10 ++ ++/* Performs a raw function call with the given NUM_ARG_REGS register arguments ++ and the specified additional stack arguments (if any). */ ++extern void ffi_call_tile(ffi_sarg reg_args[NUM_ARG_REGS], ++ const ffi_sarg *stack_args, ++ size_t stack_args_bytes, ++ void (*fnaddr)(void)) ++ FFI_HIDDEN; ++ ++/* This handles the raw call from the closure stub, cleaning up the ++ parameters and delegating to ffi_closure_tile_inner. */ ++extern void ffi_closure_tile(void) FFI_HIDDEN; ++ ++ ++ffi_status ++ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* We always allocate room for all registers. Even if we don't ++ use them as parameters, they get returned in the same array ++ as struct return values so we need to make room. */ ++ if (cif->bytes < NUM_ARG_REGS * FFI_SIZEOF_ARG) ++ cif->bytes = NUM_ARG_REGS * FFI_SIZEOF_ARG; ++ ++ if (cif->rtype->size > NUM_ARG_REGS * FFI_SIZEOF_ARG) ++ cif->flags = FFI_TYPE_STRUCT; ++ else ++ cif->flags = FFI_TYPE_INT; ++ ++ /* Nothing to do. */ ++ return FFI_OK; ++} ++ ++ ++static long ++assign_to_ffi_arg(ffi_sarg *out, void *in, const ffi_type *type, ++ int write_to_reg) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_SINT8: ++ *out = *(SINT8 *)in; ++ return 1; ++ ++ case FFI_TYPE_UINT8: ++ *out = *(UINT8 *)in; ++ return 1; ++ ++ case FFI_TYPE_SINT16: ++ *out = *(SINT16 *)in; ++ return 1; ++ ++ case FFI_TYPE_UINT16: ++ *out = *(UINT16 *)in; ++ return 1; ++ ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++#ifndef __LP64__ ++ case FFI_TYPE_POINTER: ++#endif ++ /* Note that even unsigned 32-bit quantities are sign extended ++ on tilegx when stored in a register. */ ++ *out = *(SINT32 *)in; ++ return 1; ++ ++ case FFI_TYPE_FLOAT: ++#ifdef __tilegx__ ++ if (write_to_reg) ++ { ++ /* Properly sign extend the value. */ ++ union { float f; SINT32 s32; } val; ++ val.f = *(float *)in; ++ *out = val.s32; ++ } ++ else ++#endif ++ { ++ *(float *)out = *(float *)in; ++ } ++ return 1; ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_DOUBLE: ++#ifdef __LP64__ ++ case FFI_TYPE_POINTER: ++#endif ++ *(UINT64 *)out = *(UINT64 *)in; ++ return sizeof(UINT64) / FFI_SIZEOF_ARG; ++ ++ case FFI_TYPE_STRUCT: ++ memcpy(out, in, type->size); ++ return (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; ++ ++ case FFI_TYPE_VOID: ++ /* Must be a return type. Nothing to do. */ ++ return 0; ++ ++ default: ++ FFI_ASSERT(0); ++ return -1; ++ } ++} ++ ++ ++void ++ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) ++{ ++ ffi_sarg * const arg_mem = alloca(cif->bytes); ++ ffi_sarg * const reg_args = arg_mem; ++ ffi_sarg * const stack_args = ®_args[NUM_ARG_REGS]; ++ ffi_sarg *argp = arg_mem; ++ ffi_type ** const arg_types = cif->arg_types; ++ const long num_args = cif->nargs; ++ long i; ++ ++ if (cif->flags == FFI_TYPE_STRUCT) ++ { ++ /* Pass a hidden pointer to the return value. We make sure there ++ is scratch space for the callee to store the return value even if ++ our caller doesn't care about it. */ ++ *argp++ = (intptr_t)(rvalue ? rvalue : alloca(cif->rtype->size)); ++ ++ /* No more work needed to return anything. */ ++ rvalue = NULL; ++ } ++ ++ for (i = 0; i < num_args; i++) ++ { ++ ffi_type *type = arg_types[i]; ++ void * const arg_in = avalue[i]; ++ ptrdiff_t arg_word = argp - arg_mem; ++ ++#ifndef __tilegx__ ++ /* Doubleword-aligned values are always in an even-number register ++ pair, or doubleword-aligned stack slot if out of registers. */ ++ long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); ++ argp += align; ++ arg_word += align; ++#endif ++ ++ if (type->type == FFI_TYPE_STRUCT) ++ { ++ const size_t arg_size_in_words = ++ (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; ++ ++ if (arg_word < NUM_ARG_REGS && ++ arg_word + arg_size_in_words > NUM_ARG_REGS) ++ { ++ /* Args are not allowed to span registers and the stack. */ ++ argp = stack_args; ++ } ++ ++ memcpy(argp, arg_in, type->size); ++ argp += arg_size_in_words; ++ } ++ else ++ { ++ argp += assign_to_ffi_arg(argp, arg_in, arg_types[i], 1); ++ } ++ } ++ ++ /* Actually do the call. */ ++ ffi_call_tile(reg_args, stack_args, ++ cif->bytes - (NUM_ARG_REGS * FFI_SIZEOF_ARG), fn); ++ ++ if (rvalue != NULL) ++ assign_to_ffi_arg(rvalue, reg_args, cif->rtype, 0); ++} ++ ++ ++/* Template code for closure. */ ++extern const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN; ++ ++ ++ffi_status ++ffi_prep_closure_loc (ffi_closure *closure, ++ ffi_cif *cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void *user_data, ++ void *codeloc) ++{ ++#ifdef __tilegx__ ++ /* TILE-Gx */ ++ SINT64 c; ++ SINT64 h; ++ int s; ++ UINT64 *out; ++ ++ if (cif->abi != FFI_UNIX) ++ return FFI_BAD_ABI; ++ ++ out = (UINT64 *)closure->tramp; ++ ++ c = (intptr_t)closure; ++ h = (intptr_t)ffi_closure_tile; ++ s = 0; ++ ++ /* Find the smallest shift count that doesn't lose information ++ (i.e. no need to explicitly insert high bits of the address that ++ are just the sign extension of the low bits). */ ++ while ((c >> s) != (SINT16)(c >> s) || (h >> s) != (SINT16)(h >> s)) ++ s += 16; ++ ++#define OPS(a, b, shift) \ ++ (create_Imm16_X0((a) >> (shift)) | create_Imm16_X1((b) >> (shift))) ++ ++ /* Emit the moveli. */ ++ *out++ = ffi_template_tramp_tile[0] | OPS(c, h, s); ++ for (s -= 16; s >= 0; s -= 16) ++ *out++ = ffi_template_tramp_tile[1] | OPS(c, h, s); ++ ++#undef OPS ++ ++ *out++ = ffi_template_tramp_tile[2]; ++ ++#else ++ /* TILEPro */ ++ UINT64 *out; ++ intptr_t delta; ++ ++ if (cif->abi != FFI_UNIX) ++ return FFI_BAD_ABI; ++ ++ out = (UINT64 *)closure->tramp; ++ delta = (intptr_t)ffi_closure_tile - (intptr_t)codeloc; ++ ++ *out++ = ffi_template_tramp_tile[0] | create_JOffLong_X1(delta >> 3); ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ invalidate_icache(closure->tramp, (char *)out - closure->tramp, ++ getpagesize()); ++ ++ return FFI_OK; ++} ++ ++ ++/* This is called by the assembly wrapper for closures. This does ++ all of the work. On entry reg_args[0] holds the values the registers ++ had when the closure was invoked. On return reg_args[1] holds the register ++ values to be returned to the caller (many of which may be garbage). */ ++void FFI_HIDDEN ++ffi_closure_tile_inner(ffi_closure *closure, ++ ffi_sarg reg_args[2][NUM_ARG_REGS], ++ ffi_sarg *stack_args) ++{ ++ ffi_cif * const cif = closure->cif; ++ void ** const avalue = alloca(cif->nargs * sizeof(void *)); ++ void *rvalue; ++ ffi_type ** const arg_types = cif->arg_types; ++ ffi_sarg * const reg_args_in = reg_args[0]; ++ ffi_sarg * const reg_args_out = reg_args[1]; ++ ffi_sarg * argp; ++ long i, arg_word, nargs = cif->nargs; ++ /* Use a union to guarantee proper alignment for double. */ ++ union { ffi_sarg arg[NUM_ARG_REGS]; double d; UINT64 u64; } closure_ret; ++ ++ /* Start out reading register arguments. */ ++ argp = reg_args_in; ++ ++ /* Copy the caller's structure return address to that the closure ++ returns the data directly to the caller. */ ++ if (cif->flags == FFI_TYPE_STRUCT) ++ { ++ /* Return by reference via hidden pointer. */ ++ rvalue = (void *)(intptr_t)*argp++; ++ arg_word = 1; ++ } ++ else ++ { ++ /* Return the value in registers. */ ++ rvalue = &closure_ret; ++ arg_word = 0; ++ } ++ ++ /* Grab the addresses of the arguments. */ ++ for (i = 0; i < nargs; i++) ++ { ++ ffi_type * const type = arg_types[i]; ++ const size_t arg_size_in_words = ++ (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; ++ ++#ifndef __tilegx__ ++ /* Doubleword-aligned values are always in an even-number register ++ pair, or doubleword-aligned stack slot if out of registers. */ ++ long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); ++ argp += align; ++ arg_word += align; ++#endif ++ ++ if (arg_word == NUM_ARG_REGS || ++ (arg_word < NUM_ARG_REGS && ++ arg_word + arg_size_in_words > NUM_ARG_REGS)) ++ { ++ /* Switch to reading arguments from the stack. */ ++ argp = stack_args; ++ arg_word = NUM_ARG_REGS; ++ } ++ ++ avalue[i] = argp; ++ argp += arg_size_in_words; ++ arg_word += arg_size_in_words; ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun(cif, rvalue, avalue, closure->user_data); ++ ++ if (cif->flags != FFI_TYPE_STRUCT) ++ { ++ /* Canonicalize for register representation. */ ++ assign_to_ffi_arg(reg_args_out, &closure_ret, cif->rtype, 1); ++ } ++} +diff --git a/js/src/ctypes/libffi/src/tile/ffitarget.h b/js/src/ctypes/libffi/src/tile/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/tile/ffitarget.h +@@ -0,0 +1,65 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ffitarget.h - Copyright (c) 2012 Tilera Corp. ++ Target configuration macros for TILE. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++#include ++ ++typedef uint_reg_t ffi_arg; ++typedef int_reg_t ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_UNIX, ++ FFI_LAST_ABI, ++ FFI_DEFAULT_ABI = FFI_UNIX ++} ffi_abi; ++#endif ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++#define FFI_CLOSURES 1 ++ ++#ifdef __tilegx__ ++/* We always pass 8-byte values, even in -m32 mode. */ ++# define FFI_SIZEOF_ARG 8 ++# ifdef __LP64__ ++# define FFI_TRAMPOLINE_SIZE (8 * 5) /* 5 bundles */ ++# else ++# define FFI_TRAMPOLINE_SIZE (8 * 3) /* 3 bundles */ ++# endif ++#else ++# define FFI_SIZEOF_ARG 4 ++# define FFI_TRAMPOLINE_SIZE 8 /* 1 bundle */ ++#endif ++#define FFI_NATIVE_RAW_API 0 ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/tile/tile.S b/js/src/ctypes/libffi/src/tile/tile.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/tile/tile.S +@@ -0,0 +1,360 @@ ++/* ----------------------------------------------------------------------- ++ tile.S - Copyright (c) 2011 Tilera Corp. ++ ++ Tilera TILEPro and TILE-Gx Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++/* Number of bytes in a register. */ ++#define REG_SIZE FFI_SIZEOF_ARG ++ ++/* Number of bytes in stack linkage area for backtracing. ++ ++ A note about the ABI: on entry to a procedure, sp points to a stack ++ slot where it must spill the return address if it's not a leaf. ++ REG_SIZE bytes beyond that is a slot owned by the caller which ++ contains the sp value that the caller had when it was originally ++ entered (i.e. the caller's frame pointer). */ ++#define LINKAGE_SIZE (2 * REG_SIZE) ++ ++/* The first 10 registers are used to pass arguments and return values. */ ++#define NUM_ARG_REGS 10 ++ ++#ifdef __tilegx__ ++#define SW st ++#define LW ld ++#define BGZT bgtzt ++#else ++#define SW sw ++#define LW lw ++#define BGZT bgzt ++#endif ++ ++ ++/* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS], ++ const int_reg_t *stack_args, ++ unsigned long stack_args_bytes, ++ void (*fnaddr)(void)); ++ ++ On entry, REG_ARGS contain the outgoing register values, ++ and STACK_ARGS contains STACK_ARG_BYTES of additional values ++ to be passed on the stack. If STACK_ARG_BYTES is zero, then ++ STACK_ARGS is ignored. ++ ++ When the invoked function returns, the values of r0-r9 are ++ blindly stored back into REG_ARGS for the caller to examine. */ ++ ++ .section .text.ffi_call_tile, "ax", @progbits ++ .align 8 ++ .globl ffi_call_tile ++ FFI_HIDDEN(ffi_call_tile) ++ffi_call_tile: ++ ++/* Incoming arguments. */ ++#define REG_ARGS r0 ++#define INCOMING_STACK_ARGS r1 ++#define STACK_ARG_BYTES r2 ++#define ORIG_FNADDR r3 ++ ++/* Temporary values. */ ++#define FRAME_SIZE r10 ++#define TMP r11 ++#define TMP2 r12 ++#define OUTGOING_STACK_ARGS r13 ++#define REG_ADDR_PTR r14 ++#define RETURN_REG_ADDR r15 ++#define FNADDR r16 ++ ++ .cfi_startproc ++ { ++ /* Save return address. */ ++ SW sp, lr ++ .cfi_offset lr, 0 ++ /* Prepare to spill incoming r52. */ ++ addi TMP, sp, -REG_SIZE ++ /* Increase frame size to have room to spill r52 and REG_ARGS. ++ The +7 is to round up mod 8. */ ++ addi FRAME_SIZE, STACK_ARG_BYTES, \ ++ REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7 ++ } ++ { ++ /* Round stack frame size to a multiple of 8 to satisfy ABI. */ ++ andi FRAME_SIZE, FRAME_SIZE, -8 ++ /* Compute where to spill REG_ARGS value. */ ++ addi TMP2, sp, -(REG_SIZE * 2) ++ } ++ { ++ /* Spill incoming r52. */ ++ SW TMP, r52 ++ .cfi_offset r52, -REG_SIZE ++ /* Set up our frame pointer. */ ++ move r52, sp ++ .cfi_def_cfa_register r52 ++ /* Push stack frame. */ ++ sub sp, sp, FRAME_SIZE ++ } ++ { ++ /* Prepare to set up stack linkage. */ ++ addi TMP, sp, REG_SIZE ++ /* Prepare to memcpy stack args. */ ++ addi OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE ++ /* Save REG_ARGS which we will need after we call the subroutine. */ ++ SW TMP2, REG_ARGS ++ } ++ { ++ /* Set up linkage info to hold incoming stack pointer. */ ++ SW TMP, r52 ++ } ++ { ++ /* Skip stack args memcpy if we don't have any stack args (common). */ ++ blezt STACK_ARG_BYTES, .Ldone_stack_args_memcpy ++ } ++ ++.Lmemcpy_stack_args: ++ { ++ /* Load incoming argument from stack_args. */ ++ LW TMP, INCOMING_STACK_ARGS ++ addi INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE ++ } ++ { ++ /* Store stack argument into outgoing stack argument area. */ ++ SW OUTGOING_STACK_ARGS, TMP ++ addi OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE ++ addi STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE ++ } ++ { ++ BGZT STACK_ARG_BYTES, .Lmemcpy_stack_args ++ } ++.Ldone_stack_args_memcpy: ++ ++ { ++ /* Copy aside ORIG_FNADDR so we can overwrite its register. */ ++ move FNADDR, ORIG_FNADDR ++ /* Prepare to load argument registers. */ ++ addi REG_ADDR_PTR, r0, REG_SIZE ++ /* Load outgoing r0. */ ++ LW r0, r0 ++ } ++ ++ /* Load up argument registers from the REG_ARGS array. */ ++#define LOAD_REG(REG, PTR) \ ++ { \ ++ LW REG, PTR ; \ ++ addi PTR, PTR, REG_SIZE \ ++ } ++ ++ LOAD_REG(r1, REG_ADDR_PTR) ++ LOAD_REG(r2, REG_ADDR_PTR) ++ LOAD_REG(r3, REG_ADDR_PTR) ++ LOAD_REG(r4, REG_ADDR_PTR) ++ LOAD_REG(r5, REG_ADDR_PTR) ++ LOAD_REG(r6, REG_ADDR_PTR) ++ LOAD_REG(r7, REG_ADDR_PTR) ++ LOAD_REG(r8, REG_ADDR_PTR) ++ LOAD_REG(r9, REG_ADDR_PTR) ++ ++ { ++ /* Call the subroutine. */ ++ jalr FNADDR ++ } ++ ++ { ++ /* Restore original lr. */ ++ LW lr, r52 ++ /* Prepare to recover ARGS, which we spilled earlier. */ ++ addi TMP, r52, -(2 * REG_SIZE) ++ } ++ { ++ /* Restore ARGS, so we can fill it in with the return regs r0-r9. */ ++ LW RETURN_REG_ADDR, TMP ++ /* Prepare to restore original r52. */ ++ addi TMP, r52, -REG_SIZE ++ } ++ ++ { ++ /* Pop stack frame. */ ++ move sp, r52 ++ /* Restore original r52. */ ++ LW r52, TMP ++ } ++ ++#define STORE_REG(REG, PTR) \ ++ { \ ++ SW PTR, REG ; \ ++ addi PTR, PTR, REG_SIZE \ ++ } ++ ++ /* Return all register values by reference. */ ++ STORE_REG(r0, RETURN_REG_ADDR) ++ STORE_REG(r1, RETURN_REG_ADDR) ++ STORE_REG(r2, RETURN_REG_ADDR) ++ STORE_REG(r3, RETURN_REG_ADDR) ++ STORE_REG(r4, RETURN_REG_ADDR) ++ STORE_REG(r5, RETURN_REG_ADDR) ++ STORE_REG(r6, RETURN_REG_ADDR) ++ STORE_REG(r7, RETURN_REG_ADDR) ++ STORE_REG(r8, RETURN_REG_ADDR) ++ STORE_REG(r9, RETURN_REG_ADDR) ++ ++ { ++ jrp lr ++ } ++ ++ .cfi_endproc ++ .size ffi_call_tile, .-ffi_call_tile ++ ++/* ffi_closure_tile(...) ++ ++ On entry, lr points to the closure plus 8 bytes, and r10 ++ contains the actual return address. ++ ++ This function simply dumps all register parameters into a stack array ++ and passes the closure, the registers array, and the stack arguments ++ to C code that does all of the actual closure processing. */ ++ ++ .section .text.ffi_closure_tile, "ax", @progbits ++ .align 8 ++ .globl ffi_closure_tile ++ FFI_HIDDEN(ffi_closure_tile) ++ ++ .cfi_startproc ++/* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */ ++#define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8) ++ffi_closure_tile: ++ { ++#ifdef __tilegx__ ++ st sp, lr ++ .cfi_offset lr, 0 ++#else ++ /* Save return address (in r10 due to closure stub wrapper). */ ++ SW sp, r10 ++ .cfi_return_column r10 ++ .cfi_offset r10, 0 ++#endif ++ /* Compute address for stack frame linkage. */ ++ addli r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) ++ } ++ { ++ /* Save incoming stack pointer in linkage area. */ ++ SW r10, sp ++ .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) ++ /* Push a new stack frame. */ ++ addli sp, sp, -CLOSURE_FRAME_SIZE ++ .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE ++ } ++ ++ { ++ /* Create pointer to where to start spilling registers. */ ++ addi r10, sp, LINKAGE_SIZE ++ } ++ ++ /* Spill all the incoming registers. */ ++ STORE_REG(r0, r10) ++ STORE_REG(r1, r10) ++ STORE_REG(r2, r10) ++ STORE_REG(r3, r10) ++ STORE_REG(r4, r10) ++ STORE_REG(r5, r10) ++ STORE_REG(r6, r10) ++ STORE_REG(r7, r10) ++ STORE_REG(r8, r10) ++ { ++ /* Save r9. */ ++ SW r10, r9 ++#ifdef __tilegx__ ++ /* Pointer to closure is passed in r11. */ ++ move r0, r11 ++#else ++ /* Compute pointer to the closure object. Because the closure ++ starts with a "jal ffi_closure_tile", we can just take the ++ value of lr (a phony return address pointing into the closure) ++ and subtract 8. */ ++ addi r0, lr, -8 ++#endif ++ /* Compute a pointer to the register arguments we just spilled. */ ++ addi r1, sp, LINKAGE_SIZE ++ } ++ { ++ /* Compute a pointer to the extra stack arguments (if any). */ ++ addli r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE ++ /* Call C code to deal with all of the grotty details. */ ++ jal ffi_closure_tile_inner ++ } ++ { ++ addli r10, sp, CLOSURE_FRAME_SIZE ++ } ++ { ++ /* Restore the return address. */ ++ LW lr, r10 ++ /* Compute pointer to registers array. */ ++ addli r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE) ++ } ++ /* Return all the register values, which C code may have set. */ ++ LOAD_REG(r0, r10) ++ LOAD_REG(r1, r10) ++ LOAD_REG(r2, r10) ++ LOAD_REG(r3, r10) ++ LOAD_REG(r4, r10) ++ LOAD_REG(r5, r10) ++ LOAD_REG(r6, r10) ++ LOAD_REG(r7, r10) ++ LOAD_REG(r8, r10) ++ LOAD_REG(r9, r10) ++ { ++ /* Pop the frame. */ ++ addli sp, sp, CLOSURE_FRAME_SIZE ++ jrp lr ++ } ++ ++ .cfi_endproc ++ .size ffi_closure_tile, . - ffi_closure_tile ++ ++ ++/* What follows are code template instructions that get copied to the ++ closure trampoline by ffi_prep_closure_loc. The zeroed operands ++ get replaced by their proper values at runtime. */ ++ ++ .section .text.ffi_template_tramp_tile, "ax", @progbits ++ .align 8 ++ .globl ffi_template_tramp_tile ++ FFI_HIDDEN(ffi_template_tramp_tile) ++ffi_template_tramp_tile: ++#ifdef __tilegx__ ++ { ++ moveli r11, 0 /* backpatched to address of containing closure. */ ++ moveli r10, 0 /* backpatched to ffi_closure_tile. */ ++ } ++ /* Note: the following bundle gets generated multiple times ++ depending on the pointer value (esp. useful for -m32 mode). */ ++ { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 } ++ { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 } ++#else ++ /* 'jal .' yields a PC-relative offset of zero so we can OR in the ++ right offset at runtime. */ ++ { move r10, lr ; jal . /* ffi_closure_tile */ } ++#endif ++ ++ .size ffi_template_tramp_tile, . - ffi_template_tramp_tile +diff --git a/js/src/ctypes/libffi/src/types.c b/js/src/ctypes/libffi/src/types.c +--- a/js/src/ctypes/libffi/src/types.c ++++ b/js/src/ctypes/libffi/src/types.c +@@ -39,16 +39,27 @@ struct struct_align_##name { \ + type x; \ + }; \ + const ffi_type ffi_type_##name = { \ + sizeof(type), \ + offsetof(struct struct_align_##name, x), \ + id, NULL \ + } + ++#define FFI_NONCONST_TYPEDEF(name, type, id) \ ++struct struct_align_##name { \ ++ char c; \ ++ type x; \ ++}; \ ++ffi_type ffi_type_##name = { \ ++ sizeof(type), \ ++ offsetof(struct struct_align_##name, x), \ ++ id, NULL \ ++} ++ + /* Size and alignment are fake here. They must not be 0. */ + const ffi_type ffi_type_void = { + 1, 1, FFI_TYPE_VOID, NULL + }; + + FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8); + FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8); + FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16); +@@ -68,10 +79,14 @@ FFI_TYPEDEF(double, double, FFI_TYPE_DOU + maintain binary compatibility, as -mlong-double-128 can be used + at any time. */ + /* Validate the hard-coded number below. */ + # if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4 + # error FFI_TYPE_LONGDOUBLE out of date + # endif + const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL }; + #elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++# if HAVE_LONG_DOUBLE_VARIANT ++FFI_NONCONST_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE); ++# else + FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE); ++# endif + #endif +diff --git a/js/src/ctypes/libffi/src/vax/elfbsd.S b/js/src/ctypes/libffi/src/vax/elfbsd.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/vax/elfbsd.S +@@ -0,0 +1,195 @@ ++/* ++ * Copyright (c) 2013 Miodrag Vallat. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * ``Software''), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/* ++ * vax Foreign Function Interface ++ */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .text ++ ++/* ++ * void * %r0 ++ * ffi_call_elfbsd(extended_cif *ecif, 4(%ap) ++ * unsigned bytes, 8(%ap) ++ * unsigned flags, 12(%ap) ++ * void *rvalue, 16(%ap) ++ * void (*fn)()); 20(%ap) ++ */ ++ .globl ffi_call_elfbsd ++ .type ffi_call_elfbsd,@function ++ .align 2 ++ffi_call_elfbsd: ++ .word 0x00c # save R2 and R3 ++ ++ # Allocate stack space for the args ++ subl2 8(%ap), %sp ++ ++ # Call ffi_prep_args ++ pushl %sp ++ pushl 4(%ap) ++ calls $2, ffi_prep_args ++ ++ # Get function pointer ++ movl 20(%ap), %r1 ++ ++ # Build a CALLS frame ++ ashl $-2, 8(%ap), %r0 ++ pushl %r0 # argument stack usage ++ movl %sp, %r0 # future %ap ++ # saved registers ++ bbc $11, 0(%r1), 1f ++ pushl %r11 ++1: bbc $10, 0(%r1), 1f ++ pushl %r10 ++1: bbc $9, 0(%r1), 1f ++ pushl %r9 ++1: bbc $8, 0(%r1), 1f ++ pushl %r8 ++1: bbc $7, 0(%r1), 1f ++ pushl %r7 ++1: bbc $6, 0(%r1), 1f ++ pushl %r6 ++1: bbc $5, 0(%r1), 1f ++ pushl %r5 ++1: bbc $4, 0(%r1), 1f ++ pushl %r4 ++1: bbc $3, 0(%r1), 1f ++ pushl %r3 ++1: bbc $2, 0(%r1), 1f ++ pushl %r2 ++1: ++ pushal 9f ++ pushl %fp ++ pushl %ap ++ movl 16(%ap), %r3 # struct return address, if needed ++ movl %r0, %ap ++ movzwl 4(%fp), %r0 # previous PSW, without the saved registers mask ++ bisl2 $0x20000000, %r0 # calls frame ++ movzwl 0(%r1), %r2 ++ bicw2 $0xf003, %r2 # only keep R11-R2 ++ ashl $16, %r2, %r2 ++ bisl2 %r2, %r0 # saved register mask of the called function ++ pushl %r0 ++ pushl $0 ++ movl %sp, %fp ++ ++ # Invoke the function ++ pushal 2(%r1) # skip procedure entry mask ++ movl %r3, %r1 ++ bicpsw $0x000f ++ rsb ++ ++9: ++ # Copy return value if necessary ++ tstl 16(%ap) ++ jeql 9f ++ movl 16(%ap), %r2 ++ ++ bbc $0, 12(%ap), 1f # CIF_FLAGS_CHAR ++ movb %r0, 0(%r2) ++ brb 9f ++1: ++ bbc $1, 12(%ap), 1f # CIF_FLAGS_SHORT ++ movw %r0, 0(%r2) ++ brb 9f ++1: ++ bbc $2, 12(%ap), 1f # CIF_FLAGS_INT ++ movl %r0, 0(%r2) ++ brb 9f ++1: ++ bbc $3, 12(%ap), 1f # CIF_FLAGS_DINT ++ movq %r0, 0(%r2) ++ brb 9f ++1: ++ movl %r1, %r0 # might have been a struct ++ #brb 9f ++ ++9: ++ ret ++ ++/* ++ * ffi_closure_elfbsd(void); ++ * invoked with %r0: ffi_closure *closure ++ */ ++ .globl ffi_closure_elfbsd ++ .type ffi_closure_elfbsd, @function ++ .align 2 ++ffi_closure_elfbsd: ++ .word 0 ++ ++ # Allocate room on stack for return value ++ subl2 $8, %sp ++ ++ # Invoke the closure function ++ pushal 4(%ap) # calling stack ++ pushal 4(%sp) # return value ++ pushl %r0 # closure ++ calls $3, ffi_closure_elfbsd_inner ++ ++ # Copy return value if necessary ++ bitb $1, %r0 # CIF_FLAGS_CHAR ++ beql 1f ++ movb 0(%sp), %r0 ++ brb 9f ++1: ++ bitb $2, %r0 # CIF_FLAGS_SHORT ++ beql 1f ++ movw 0(%sp), %r0 ++ brb 9f ++1: ++ bitb $4, %r0 # CIF_FLAGS_INT ++ beql 1f ++ movl 0(%sp), %r0 ++ brb 9f ++1: ++ bitb $8, %r0 # CIF_FLAGS_DINT ++ beql 1f ++ movq 0(%sp), %r0 ++ #brb 9f ++1: ++ ++9: ++ ret ++ ++/* ++ * ffi_closure_struct_elfbsd(void); ++ * invoked with %r0: ffi_closure *closure ++ * %r1: struct return address ++ */ ++ .globl ffi_closure_struct_elfbsd ++ .type ffi_closure_struct_elfbsd, @function ++ .align 2 ++ffi_closure_struct_elfbsd: ++ .word 0 ++ ++ # Invoke the closure function ++ pushal 4(%ap) # calling stack ++ pushl %r1 # return value ++ pushl %r0 # closure ++ calls $3, ffi_closure_elfbsd_inner ++ ++ ret +diff --git a/js/src/ctypes/libffi/src/vax/ffi.c b/js/src/ctypes/libffi/src/vax/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/vax/ffi.c +@@ -0,0 +1,276 @@ ++/* ++ * Copyright (c) 2013 Miodrag Vallat. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * ``Software''), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/* ++ * vax Foreign Function Interface ++ * ++ * This file attempts to provide all the FFI entry points which can reliably ++ * be implemented in C. ++ */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define CIF_FLAGS_CHAR 1 /* for struct only */ ++#define CIF_FLAGS_SHORT 2 /* for struct only */ ++#define CIF_FLAGS_INT 4 ++#define CIF_FLAGS_DINT 8 ++ ++/* ++ * Foreign Function Interface API ++ */ ++ ++void ffi_call_elfbsd (extended_cif *, unsigned, unsigned, void *, ++ void (*) ()); ++void *ffi_prep_args (extended_cif *ecif, void *stack); ++ ++void * ++ffi_prep_args (extended_cif *ecif, void *stack) ++{ ++ unsigned int i; ++ void **p_argv; ++ char *argp; ++ ffi_type **p_arg; ++ void *struct_value_ptr; ++ ++ argp = stack; ++ ++ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT ++ && !ecif->cif->flags) ++ struct_value_ptr = ecif->rvalue; ++ else ++ struct_value_ptr = NULL; ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof (int)) ++ { ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ memcpy (argp, *p_argv, z); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ } ++ z = sizeof (int); ++ } ++ else ++ { ++ memcpy (argp, *p_argv, z); ++ ++ /* Align if necessary. */ ++ if ((sizeof(int) - 1) & z) ++ z = ALIGN(z, sizeof(int)); ++ } ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return struct_value_ptr; ++} ++ ++ffi_status ++ffi_prep_cif_machdep (ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++ cif->flags = 0; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && ++ cif->rtype->elements[1]) ++ { ++ cif->flags = 0; ++ break; ++ } ++ ++ if (cif->rtype->size == sizeof (char)) ++ cif->flags = CIF_FLAGS_CHAR; ++ else if (cif->rtype->size == sizeof (short)) ++ cif->flags = CIF_FLAGS_SHORT; ++ else if (cif->rtype->size == sizeof (int)) ++ cif->flags = CIF_FLAGS_INT; ++ else if (cif->rtype->size == 2 * sizeof (int)) ++ cif->flags = CIF_FLAGS_DINT; ++ else ++ cif->flags = 0; ++ break; ++ ++ default: ++ if (cif->rtype->size <= sizeof (int)) ++ cif->flags = CIF_FLAGS_INT; ++ else ++ cif->flags = CIF_FLAGS_DINT; ++ break; ++ } ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. */ ++ ++ if (rvalue == NULL ++ && cif->rtype->type == FFI_TYPE_STRUCT ++ && cif->flags == 0) ++ ecif.rvalue = alloca (cif->rtype->size); ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_ELFBSD: ++ ffi_call_elfbsd (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++/* ++ * Closure API ++ */ ++ ++void ffi_closure_elfbsd (void); ++void ffi_closure_struct_elfbsd (void); ++unsigned int ffi_closure_elfbsd_inner (ffi_closure *, void *, char *); ++ ++static void ++ffi_prep_closure_elfbsd (ffi_cif *cif, void **avalue, char *stackp) ++{ ++ unsigned int i; ++ void **p_argv; ++ ffi_type **p_arg; ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ *p_argv = stackp; ++ ++ /* Align if necessary */ ++ if ((sizeof (int) - 1) & z) ++ z = ALIGN(z, sizeof (int)); ++ ++ p_argv++; ++ stackp += z; ++ } ++} ++ ++unsigned int ++ffi_closure_elfbsd_inner (ffi_closure *closure, void *resp, char *stack) ++{ ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void **) alloca (cif->nargs * sizeof (void *)); ++ ++ ffi_prep_closure_elfbsd (cif, arg_area, stack); ++ ++ (closure->fun) (cif, resp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++ffi_status ++ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, ++ void (*fun)(ffi_cif *, void *, void **, void *), ++ void *user_data, void *codeloc) ++{ ++ char *tramp = (char *) codeloc; ++ void *fn; ++ ++ FFI_ASSERT (cif->abi == FFI_ELFBSD); ++ ++ /* entry mask */ ++ *(unsigned short *)(tramp + 0) = 0x0000; ++ /* movl #closure, r0 */ ++ tramp[2] = 0xd0; ++ tramp[3] = 0x8f; ++ *(unsigned int *)(tramp + 4) = (unsigned int) closure; ++ tramp[8] = 0x50; ++ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++ && !cif->flags) ++ fn = &ffi_closure_struct_elfbsd; ++ else ++ fn = &ffi_closure_elfbsd; ++ ++ /* jmpl #fn */ ++ tramp[9] = 0x17; ++ tramp[10] = 0xef; ++ *(unsigned int *)(tramp + 11) = (unsigned int)fn + 2 - ++ (unsigned int)tramp - 9 - 6; ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} +diff --git a/js/src/ctypes/libffi/src/vax/ffitarget.h b/js/src/ctypes/libffi/src/vax/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/vax/ffitarget.h +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (c) 2013 Miodrag Vallat. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * ``Software''), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/* ++ * vax Foreign Function Interface ++ */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_ELFBSD, ++ FFI_DEFAULT_ABI = FFI_ELFBSD, ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++#endif ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 15 ++#define FFI_NATIVE_RAW_API 0 ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/x86/ffi.c b/js/src/ctypes/libffi/src/x86/ffi.c +--- a/js/src/ctypes/libffi/src/x86/ffi.c ++++ b/js/src/ctypes/libffi/src/x86/ffi.c +@@ -1,14 +1,14 @@ + /* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle +- Copyright (C) 2008 Free Software Foundation, Inc. ++ Copyright (C) 2008, 2010 Free Software Foundation, Inc. + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -34,36 +34,56 @@ + #include + #endif + + #include + #include + + #include + ++ + /* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + ++void ffi_prep_args(char *stack, extended_cif *ecif); + void ffi_prep_args(char *stack, extended_cif *ecif) + { + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; ++#ifndef X86_WIN64 ++ size_t p_stack_args[2]; ++ void *p_stack_data[2]; ++ char *argp2 = stack; ++ int stack_args_count = 0; ++ int cabi = ecif->cif->abi; ++#endif + + argp = stack; + +- if (ecif->cif->flags == FFI_TYPE_STRUCT ++ if ((ecif->cif->flags == FFI_TYPE_STRUCT ++ || ecif->cif->flags == FFI_TYPE_MS_STRUCT) + #ifdef X86_WIN64 + && (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2 + && ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8) + #endif + ) + { + *(void **) argp = ecif->rvalue; ++#ifndef X86_WIN64 ++ /* For fastcall/thiscall this is first register-passed ++ argument. */ ++ if (cabi == FFI_THISCALL || cabi == FFI_FASTCALL) ++ { ++ p_stack_args[stack_args_count] = sizeof (void*); ++ p_stack_data[stack_args_count] = argp; ++ ++stack_args_count; ++ } ++#endif + argp += sizeof(void*); + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) +@@ -129,24 +149,80 @@ void ffi_prep_args(char *stack, extended + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } ++ ++#ifndef X86_WIN64 ++ /* For thiscall/fastcall convention register-passed arguments ++ are the first two none-floating-point arguments with a size ++ smaller or equal to sizeof (void*). */ ++ if ((cabi == FFI_THISCALL && stack_args_count < 1) ++ || (cabi == FFI_FASTCALL && stack_args_count < 2)) ++ { ++ if (z <= 4 ++ && ((*p_arg)->type != FFI_TYPE_FLOAT ++ && (*p_arg)->type != FFI_TYPE_STRUCT)) ++ { ++ p_stack_args[stack_args_count] = z; ++ p_stack_data[stack_args_count] = argp; ++ ++stack_args_count; ++ } ++ } ++#endif + p_argv++; + #ifdef X86_WIN64 + argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1); + #else + argp += z; + #endif + } +- ++ ++#ifndef X86_WIN64 ++ /* We need to move the register-passed arguments for thiscall/fastcall ++ on top of stack, so that those can be moved to registers ecx/edx by ++ call-handler. */ ++ if (stack_args_count > 0) ++ { ++ size_t zz = (p_stack_args[0] + 3) & ~3; ++ char *h; ++ ++ /* Move first argument to top-stack position. */ ++ if (p_stack_data[0] != argp2) ++ { ++ h = alloca (zz + 1); ++ memcpy (h, p_stack_data[0], zz); ++ memmove (argp2 + zz, argp2, ++ (size_t) ((char *) p_stack_data[0] - (char*)argp2)); ++ memcpy (argp2, h, zz); ++ } ++ ++ argp2 += zz; ++ --stack_args_count; ++ if (zz > 4) ++ stack_args_count = 0; ++ ++ /* If we have a second argument, then move it on top ++ after the first one. */ ++ if (stack_args_count > 0 && p_stack_data[1] != argp2) ++ { ++ zz = p_stack_args[1]; ++ zz = (zz + 3) & ~3; ++ h = alloca (zz + 1); ++ h = alloca (zz + 1); ++ memcpy (h, p_stack_data[1], zz); ++ memmove (argp2 + zz, argp2, (size_t) ((char*) p_stack_data[1] - (char*)argp2)); ++ memcpy (argp2, h, zz); ++ } ++ } ++#endif + return; + } + + /* Perform machine dependent cif processing */ + ffi_status ffi_prep_cif_machdep(ffi_cif *cif) + { + unsigned int i; + ffi_type **ptr; +@@ -201,17 +277,22 @@ ffi_status ffi_prep_cif_machdep(ffi_cif + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + #endif + { +- cif->flags = FFI_TYPE_STRUCT; ++#ifdef X86_WIN32 ++ if (cif->abi == FFI_MS_CDECL) ++ cif->flags = FFI_TYPE_MS_STRUCT; ++ else ++#endif ++ cif->flags = FFI_TYPE_STRUCT; + /* allocate space for return value pointer */ + cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG); + } + break; + + default: + #ifdef X86_WIN64 + cif->flags = FFI_TYPE_SINT64; +@@ -223,40 +304,42 @@ ffi_status ffi_prep_cif_machdep(ffi_cif + #endif + break; + } + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + if (((*ptr)->alignment - 1) & cif->bytes) + cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment); +- cif->bytes += ALIGN((*ptr)->size, FFI_SIZEOF_ARG); ++ cif->bytes += (unsigned)ALIGN((*ptr)->size, FFI_SIZEOF_ARG); + } + + #ifdef X86_WIN64 + /* ensure space for storing four registers */ + cif->bytes += 4 * sizeof(ffi_arg); + #endif + +-#ifdef X86_DARWIN +- cif->bytes = (cif->bytes + 15) & ~0xF; ++#ifndef X86_WIN32 ++#ifndef X86_WIN64 ++ if (cif->abi != FFI_STDCALL && cif->abi != FFI_THISCALL && cif->abi != FFI_FASTCALL) ++#endif ++ cif->bytes = (cif->bytes + 15) & ~0xF; + #endif + + return FFI_OK; + } + + #ifdef X86_WIN64 + extern int + ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); +-#elif defined(X86_WIN32) ++#else + extern void + ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *, +- unsigned, unsigned, unsigned *, void (*fn)(void)); +-#else ++ unsigned, unsigned, unsigned, unsigned *, void (*fn)(void)); + extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); + #endif + + void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) + { + extended_cif ecif; + +@@ -271,68 +354,104 @@ void ffi_call(ffi_cif *cif, void (*fn)(v + && cif->flags == FFI_TYPE_STRUCT + && cif->rtype->size != 1 && cif->rtype->size != 2 + && cif->rtype->size != 4 && cif->rtype->size != 8) + { + ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF); + } + #else + if (rvalue == NULL +- && cif->flags == FFI_TYPE_STRUCT) ++ && (cif->flags == FFI_TYPE_STRUCT ++ || cif->flags == FFI_TYPE_MS_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + #endif + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + #ifdef X86_WIN64 + case FFI_WIN64: + ffi_call_win64(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; +-#elif defined(X86_WIN32) ++#else ++#ifndef X86_WIN32 + case FFI_SYSV: +- case FFI_STDCALL: +- ffi_call_win32(ffi_prep_args, &ecif, cif->bytes, cif->flags, +- ecif.rvalue, fn); ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); + break; + #else + case FFI_SYSV: +- ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, +- fn); ++ case FFI_MS_CDECL: ++#endif ++ case FFI_STDCALL: ++ ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++ case FFI_THISCALL: ++ case FFI_FASTCALL: ++ { ++ unsigned int abi = cif->abi; ++ unsigned int i, passed_regs = 0; ++ ++ if (cif->flags == FFI_TYPE_STRUCT) ++ ++passed_regs; ++ ++ for (i=0; i < cif->nargs && passed_regs < 2;i++) ++ { ++ size_t sz; ++ ++ if (cif->arg_types[i]->type == FFI_TYPE_FLOAT ++ || cif->arg_types[i]->type == FFI_TYPE_STRUCT) ++ continue; ++ sz = (cif->arg_types[i]->size + 3) & ~3; ++ if (sz == 0 || sz > 4) ++ continue; ++ ++passed_regs; ++ } ++ if (passed_regs < 2 && abi == FFI_FASTCALL) ++ abi = FFI_THISCALL; ++ if (passed_regs < 1 && abi == FFI_THISCALL) ++ abi = FFI_STDCALL; ++ ffi_call_win32(ffi_prep_args, &ecif, abi, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ } + break; + #endif + default: + FFI_ASSERT(0); + break; + } + } + + + /** private members **/ + + /* The following __attribute__((regparm(1))) decorations will have no effect +- on MSVC - standard cdecl convention applies. */ ++ on MSVC or SUNPRO_C -- standard conventions apply. */ + static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); + void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) + __attribute__ ((regparm(1))); + unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) + __attribute__ ((regparm(1))); + void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) + __attribute__ ((regparm(1))); +-#ifdef X86_WIN32 ++#ifndef X86_WIN64 ++void FFI_HIDDEN ffi_closure_raw_THISCALL (ffi_raw_closure *) ++ __attribute__ ((regparm(1))); + void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *) + __attribute__ ((regparm(1))); +-#endif +-#ifdef X86_WIN64 ++void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *) ++ __attribute__ ((regparm(1))); ++#else + void FFI_HIDDEN ffi_closure_win64 (ffi_closure *); + #endif + + /* This function is jumped to by the trampoline */ + + #ifdef X86_WIN64 + void * FFI_HIDDEN + ffi_closure_win64_inner (ffi_closure *closure, void *args) { +@@ -402,17 +521,18 @@ ffi_prep_incoming_args_SYSV(char *stack, + if (cif->rtype->size > sizeof(ffi_arg) + || (cif->flags == FFI_TYPE_STRUCT + && (cif->rtype->size != 1 && cif->rtype->size != 2 + && cif->rtype->size != 4 && cif->rtype->size != 8))) { + *rvalue = *(void **) argp; + argp += sizeof(void *); + } + #else +- if ( cif->flags == FFI_TYPE_STRUCT ) { ++ if ( cif->flags == FFI_TYPE_STRUCT ++ || cif->flags == FFI_TYPE_MS_STRUCT ) { + *rvalue = *(void **) argp; + argp += sizeof(void *); + } + #endif + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) +@@ -480,16 +600,43 @@ ffi_prep_incoming_args_SYSV(char *stack, + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned int __dis = __fun - (__ctx + 10); \ + *(unsigned char*) &__tramp[0] = 0xb8; \ + *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ + *(unsigned char *) &__tramp[5] = 0xe9; \ + *(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ + } + ++#define FFI_INIT_TRAMPOLINE_THISCALL(TRAMP,FUN,CTX,SIZE) \ ++{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++ unsigned int __fun = (unsigned int)(FUN); \ ++ unsigned int __ctx = (unsigned int)(CTX); \ ++ unsigned int __dis = __fun - (__ctx + 49); \ ++ unsigned short __size = (unsigned short)(SIZE); \ ++ *(unsigned int *) &__tramp[0] = 0x8324048b; /* mov (%esp), %eax */ \ ++ *(unsigned int *) &__tramp[4] = 0x4c890cec; /* sub $12, %esp */ \ ++ *(unsigned int *) &__tramp[8] = 0x04890424; /* mov %ecx, 4(%esp) */ \ ++ *(unsigned char*) &__tramp[12] = 0x24; /* mov %eax, (%esp) */ \ ++ *(unsigned char*) &__tramp[13] = 0xb8; \ ++ *(unsigned int *) &__tramp[14] = __size; /* mov __size, %eax */ \ ++ *(unsigned int *) &__tramp[18] = 0x08244c8d; /* lea 8(%esp), %ecx */ \ ++ *(unsigned int *) &__tramp[22] = 0x4802e8c1; /* shr $2, %eax ; dec %eax */ \ ++ *(unsigned short*) &__tramp[26] = 0x0b74; /* jz 1f */ \ ++ *(unsigned int *) &__tramp[28] = 0x8908518b; /* 2b: mov 8(%ecx), %edx */ \ ++ *(unsigned int *) &__tramp[32] = 0x04c18311; /* mov %edx, (%ecx) ; add $4, %ecx */ \ ++ *(unsigned char*) &__tramp[36] = 0x48; /* dec %eax */ \ ++ *(unsigned short*) &__tramp[37] = 0xf575; /* jnz 2b ; 1f: */ \ ++ *(unsigned char*) &__tramp[39] = 0xb8; \ ++ *(unsigned int*) &__tramp[40] = __ctx; /* movl __ctx, %eax */ \ ++ *(unsigned char *) &__tramp[44] = 0xe8; \ ++ *(unsigned int*) &__tramp[45] = __dis; /* call __fun */ \ ++ *(unsigned char*) &__tramp[49] = 0xc2; /* ret */ \ ++ *(unsigned short*) &__tramp[50] = (__size + 8); /* ret (__size + 8) */ \ ++ } ++ + #define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE) \ + { unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned int __dis = __fun - (__ctx + 10); \ + unsigned short __size = (unsigned short)(SIZE); \ + *(unsigned char*) &__tramp[0] = 0xb8; \ + *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +@@ -521,23 +668,36 @@ ffi_prep_closure_loc (ffi_closure* closu + } + #else + if (cif->abi == FFI_SYSV) + { + FFI_INIT_TRAMPOLINE (&closure->tramp[0], + &ffi_closure_SYSV, + (void*)codeloc); + } +-#ifdef X86_WIN32 ++ else if (cif->abi == FFI_THISCALL) ++ { ++ FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], ++ &ffi_closure_THISCALL, ++ (void*)codeloc, ++ cif->bytes); ++ } + else if (cif->abi == FFI_STDCALL) + { + FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0], + &ffi_closure_STDCALL, + (void*)codeloc, cif->bytes); + } ++#ifdef X86_WIN32 ++ else if (cif->abi == FFI_MS_CDECL) ++ { ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], ++ &ffi_closure_SYSV, ++ (void*)codeloc); ++ } + #endif /* X86_WIN32 */ + #endif /* !X86_WIN64 */ + else + { + return FFI_BAD_ABI; + } + + closure->cif = cif; +@@ -555,35 +715,48 @@ ffi_status + ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) + { + int i; + +- if (cif->abi != FFI_SYSV) { ++ if (cif->abi != FFI_SYSV ++#ifndef X86_WIN64 ++ && cif->abi != FFI_THISCALL ++#endif ++ ) + return FFI_BAD_ABI; +- } + + /* we currently don't support certain kinds of arguments for raw + closures. This should be implemented by a separate assembly + language routine, since it would require argument processing, + something we don't do now for performance. */ + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + +- ++#ifndef X86_WIN64 ++ if (cif->abi == FFI_SYSV) ++ { ++#endif + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); +- ++#ifndef X86_WIN64 ++ } ++ else if (cif->abi == FFI_THISCALL) ++ { ++ FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_raw_THISCALL, ++ codeloc, cif->bytes); ++ } ++#endif + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; + } + + static void +@@ -604,37 +777,70 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(vo + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + +- if ((rvalue == NULL) && +- (cif->rtype->type == FFI_TYPE_STRUCT)) ++ if (rvalue == NULL ++ && (cif->flags == FFI_TYPE_STRUCT ++ || cif->flags == FFI_TYPE_MS_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { +-#ifdef X86_WIN32 ++#ifndef X86_WIN32 + case FFI_SYSV: +- case FFI_STDCALL: +- ffi_call_win32(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, +- ecif.rvalue, fn); ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); + break; + #else + case FFI_SYSV: +- ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, +- ecif.rvalue, fn); ++ case FFI_MS_CDECL: ++#endif ++#ifndef X86_WIN64 ++ case FFI_STDCALL: ++ ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++ case FFI_THISCALL: ++ case FFI_FASTCALL: ++ { ++ unsigned int abi = cif->abi; ++ unsigned int i, passed_regs = 0; ++ ++ if (cif->flags == FFI_TYPE_STRUCT) ++ ++passed_regs; ++ ++ for (i=0; i < cif->nargs && passed_regs < 2;i++) ++ { ++ size_t sz; ++ ++ if (cif->arg_types[i]->type == FFI_TYPE_FLOAT ++ || cif->arg_types[i]->type == FFI_TYPE_STRUCT) ++ continue; ++ sz = (cif->arg_types[i]->size + 3) & ~3; ++ if (sz == 0 || sz > 4) ++ continue; ++ ++passed_regs; ++ } ++ if (passed_regs < 2 && abi == FFI_FASTCALL) ++ cif->abi = abi = FFI_THISCALL; ++ if (passed_regs < 1 && abi == FFI_THISCALL) ++ cif->abi = abi = FFI_STDCALL; ++ ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ } + break; + #endif + default: + FFI_ASSERT(0); + break; + } + } + +diff --git a/js/src/ctypes/libffi/src/x86/ffi64.c b/js/src/ctypes/libffi/src/x86/ffi64.c +--- a/js/src/ctypes/libffi/src/x86/ffi64.c ++++ b/js/src/ctypes/libffi/src/x86/ffi64.c +@@ -1,13 +1,15 @@ + /* ----------------------------------------------------------------------- +- ffi64.c - Copyright (c) 2002, 2007 Bo Thorsen +- Copyright (c) 2008 Red Hat, Inc. +- +- x86-64 Foreign Function Interface ++ ffi64.c - Copyright (c) 2013 The Written Word, Inc. ++ Copyright (c) 2011 Anthony Green ++ Copyright (c) 2008, 2010 Red Hat, Inc. ++ Copyright (c) 2002, 2007 Bo Thorsen ++ ++ x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: +@@ -31,21 +33,40 @@ + #include + #include + + #ifdef __x86_64__ + + #define MAX_GPR_REGS 6 + #define MAX_SSE_REGS 8 + ++#if defined(__INTEL_COMPILER) ++#include "xmmintrin.h" ++#define UINT128 __m128 ++#else ++#if defined(__SUNPRO_C) ++#include ++#define UINT128 __m128i ++#else ++#define UINT128 __int128_t ++#endif ++#endif ++ ++union big_int_union ++{ ++ UINT32 i32; ++ UINT64 i64; ++ UINT128 i128; ++}; ++ + struct register_args + { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; +- __int128_t sse[MAX_SSE_REGS]; ++ union big_int_union sse[MAX_SSE_REGS]; + }; + + extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void), unsigned ssecount); + + /* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +@@ -126,33 +147,33 @@ merge_classes (enum x86_64_reg_class cla + /* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. + */ +-static int ++static size_t + classify_argument (ffi_type *type, enum x86_64_reg_class classes[], + size_t byte_offset) + { + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + { +- int size = byte_offset + type->size; ++ size_t size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { +@@ -177,25 +198,27 @@ classify_argument (ffi_type *type, enum + if (!(byte_offset % 8)) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + return 1; + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; ++#endif + case FFI_TYPE_STRUCT: + { +- const int UNITS_PER_WORD = 8; +- int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; +- ffi_type **ptr; ++ const size_t UNITS_PER_WORD = 8; ++ size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ffi_type **ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + + /* If the struct is larger than 32 bytes, pass it on the stack. */ + if (type->size > 32) + return 0; + + for (i = 0; i < words; i++) +@@ -207,26 +230,26 @@ classify_argument (ffi_type *type, enum + { + classes[0] = X86_64_NO_CLASS; + return 1; + } + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { +- int num; ++ size_t num; + + byte_offset = ALIGN (byte_offset, (*ptr)->alignment); + + num = classify_argument (*ptr, subclasses, byte_offset % 8); + if (num == 0) + return 0; + for (i = 0; i < num; i++) + { +- int pos = byte_offset / 8; ++ size_t pos = byte_offset / 8; + classes[i + pos] = + merge_classes (subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) +@@ -280,21 +303,22 @@ classify_argument (ffi_type *type, enum + } + return 0; /* Never reached. */ + } + + /* Examine the argument and return set number of register required in each + class. Return zero iff parameter should be passed in memory, otherwise + the number of registers. */ + +-static int ++static size_t + examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, int *pngpr, int *pnsse) + { +- int i, n, ngpr, nsse; ++ size_t n; ++ int i, ngpr, nsse; + + n = classify_argument (type, classes, 0); + if (n == 0) + return 0; + + ngpr = nsse = 0; + for (i = 0; i < n; ++i) + switch (classes[i]) +@@ -325,19 +349,19 @@ examine_argument (ffi_type *type, enum x + return n; + } + + /* Perform machine dependent cif processing. */ + + ffi_status + ffi_prep_cif_machdep (ffi_cif *cif) + { +- int gprcount, ssecount, i, avn, n, ngpr, nsse, flags; ++ int gprcount, ssecount, i, avn, ngpr, nsse, flags; + enum x86_64_reg_class classes[MAX_CLASSES]; +- size_t bytes; ++ size_t bytes, n; + + gprcount = ssecount = 0; + + flags = cif->rtype->type; + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + if (n == 0) +@@ -385,17 +409,17 @@ ffi_prep_cif_machdep (ffi_cif *cif) + { + gprcount += ngpr; + ssecount += nsse; + } + } + if (ssecount) + flags |= 1 << 11; + cif->flags = flags; +- cif->bytes = ALIGN (bytes, 8); ++ cif->bytes = (unsigned)ALIGN (bytes, 8); + + return FFI_OK; + } + + void + ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) + { + enum x86_64_reg_class classes[MAX_CLASSES]; +@@ -421,25 +445,24 @@ ffi_call (ffi_cif *cif, void (*fn)(void) + reg_args = (struct register_args *) stack; + argp = stack + sizeof (struct register_args); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) +- reg_args->gpr[gprcount++] = (long) rvalue; ++ reg_args->gpr[gprcount++] = (unsigned long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { +- size_t size = arg_types[i]->size; +- int n; ++ size_t n, size = arg_types[i]->size; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + +@@ -459,26 +482,43 @@ ffi_call (ffi_cif *cif, void (*fn)(void) + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: +- reg_args->gpr[gprcount] = 0; +- memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ /* Sign-extend integer arguments passed in general ++ purpose registers, to cope with the fact that ++ LLVM incorrectly assumes that this will be done ++ (the x86-64 PS ABI does not specify this). */ ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT8 *) a); ++ break; ++ case FFI_TYPE_SINT16: ++ *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT16 *) a); ++ break; ++ case FFI_TYPE_SINT32: ++ *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT32 *) a); ++ break; ++ default: ++ reg_args->gpr[gprcount] = 0; ++ memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ } + gprcount++; + break; + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: +- reg_args->sse[ssecount++] = *(UINT64 *) a; ++ reg_args->sse[ssecount++].i64 = *(UINT64 *) a; + break; + case X86_64_SSESF_CLASS: +- reg_args->sse[ssecount++] = *(UINT32 *) a; ++ reg_args->sse[ssecount++].i32 = *(UINT32 *) a; + break; + default: + abort(); + } + } + } + } + +@@ -493,22 +533,31 @@ ffi_status + ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) + { + volatile unsigned short *tramp; + ++ /* Sanity check on the cif ABI. */ ++ { ++ int abi = cif->abi; ++ if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI))) ++ return FFI_BAD_ABI; ++ } ++ + tramp = (volatile unsigned short *) &closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ +- *(void * volatile *) &tramp[1] = ffi_closure_unix64; ++ *((unsigned long long * volatile) &tramp[1]) ++ = (unsigned long) ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ +- *(void * volatile *) &tramp[6] = codeloc; ++ *((unsigned long long * volatile) &tramp[6]) ++ = (unsigned long) codeloc; + + /* Set the carry bit iff the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; +@@ -532,22 +581,22 @@ ffi_closure_unix64_inner(ffi_closure *cl + cif = closure->cif; + avalue = alloca(cif->nargs * sizeof(void *)); + gprcount = ssecount = 0; + + ret = cif->rtype->type; + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; +- int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ size_t n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ +- rvalue = (void *) reg_args->gpr[gprcount++]; ++ rvalue = (void *) (unsigned long) reg_args->gpr[gprcount++]; + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); +@@ -555,21 +604,21 @@ ffi_closure_unix64_inner(ffi_closure *cl + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; +- ++ + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; +- int n; ++ size_t n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + +diff --git a/js/src/ctypes/libffi/src/x86/ffitarget.h b/js/src/ctypes/libffi/src/x86/ffitarget.h +--- a/js/src/ctypes/libffi/src/x86/ffitarget.h ++++ b/js/src/ctypes/libffi/src/x86/ffitarget.h +@@ -1,11 +1,12 @@ + /* -----------------------------------------------------------------*-C-*- +- ffitarget.h - Copyright (c) 1996-2003, 2010 Red Hat, Inc. +- Copyright (C) 2008 Free Software Foundation, Inc. ++ ffitarget.h - Copyright (c) 2012 Anthony Green ++ Copyright (c) 1996-2003, 2010 Red Hat, Inc. ++ Copyright (C) 2008 Free Software Foundation, Inc. + + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -24,16 +25,20 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + + #ifndef LIBFFI_TARGET_H + #define LIBFFI_TARGET_H + ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ + /* ---- System specific configurations ----------------------------------- */ + + /* For code common to all platforms on x86 and x86_64. */ + #define X86_ANY + + #if defined (X86_64) && defined (__i386__) + #undef X86_64 + #define X86 +@@ -51,71 +56,80 @@ + #ifdef _MSC_VER + typedef unsigned __int64 ffi_arg; + typedef __int64 ffi_sarg; + #else + typedef unsigned long long ffi_arg; + typedef long long ffi_sarg; + #endif + #else ++#if defined __x86_64__ && defined __ILP32__ ++#define FFI_SIZEOF_ARG 8 ++#define FFI_SIZEOF_JAVA_RAW 4 ++typedef unsigned long long ffi_arg; ++typedef long long ffi_sarg; ++#else + typedef unsigned long ffi_arg; + typedef signed long ffi_sarg; + #endif ++#endif + + typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ + #ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, ++ FFI_THISCALL, ++ FFI_FASTCALL, ++ FFI_MS_CDECL, + FFI_LAST_ABI, +- /* TODO: Add fastcall support for the sake of completeness */ ++#ifdef _MSC_VER ++ FFI_DEFAULT_ABI = FFI_MS_CDECL ++#else + FFI_DEFAULT_ABI = FFI_SYSV ++#endif + + #elif defined(X86_WIN64) + FFI_WIN64, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_WIN64 + + #else + /* ---- Intel x86 and AMD x86-64 - */ + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++ FFI_THISCALL, ++ FFI_FASTCALL, ++ FFI_STDCALL, + FFI_LAST_ABI, + #if defined(__i386__) || defined(__i386) + FFI_DEFAULT_ABI = FFI_SYSV + #else + FFI_DEFAULT_ABI = FFI_UNIX64 + #endif + #endif + } ffi_abi; + #endif + + /* ---- Definitions for closures ----------------------------------------- */ + + #define FFI_CLOSURES 1 + #define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) + #define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) + #define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) ++#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) + + #if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) + #define FFI_TRAMPOLINE_SIZE 24 + #define FFI_NATIVE_RAW_API 0 +-#else +-#ifdef X86_WIN32 +-#define FFI_TRAMPOLINE_SIZE 13 +-#else +-#ifdef X86_WIN64 ++#elif defined(X86_WIN64) + #define FFI_TRAMPOLINE_SIZE 29 + #define FFI_NATIVE_RAW_API 0 + #define FFI_NO_RAW_API 1 + #else +-#define FFI_TRAMPOLINE_SIZE 10 +-#endif +-#endif +-#ifndef X86_WIN64 ++#define FFI_TRAMPOLINE_SIZE 52 + #define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ + #endif +-#endif + + #endif + +diff --git a/js/src/ctypes/libffi/src/x86/freebsd.S b/js/src/ctypes/libffi/src/x86/freebsd.S +--- a/js/src/ctypes/libffi/src/x86/freebsd.S ++++ b/js/src/ctypes/libffi/src/x86/freebsd.S +@@ -454,8 +454,10 @@ 0: + .byte 0x86 /* DW_CFA_offset, column 0x6 */ + .byte 0x3 /* .uleb128 0x3 */ + .align 4 + .LEFDE3: + + #endif + + #endif /* ifndef __x86_64__ */ ++ ++ .section .note.GNU-stack,"",%progbits +diff --git a/js/src/ctypes/libffi/src/x86/sysv.S b/js/src/ctypes/libffi/src/x86/sysv.S +--- a/js/src/ctypes/libffi/src/x86/sysv.S ++++ b/js/src/ctypes/libffi/src/x86/sysv.S +@@ -1,10 +1,11 @@ + /* ----------------------------------------------------------------------- +- sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008, 2010 Red Hat, Inc. ++ sysv.S - Copyright (c) 2013 The Written Word, Inc. ++ - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -176,19 +177,29 @@ ffi_closure_SYSV: + pushl %ebp + .LCFI2: + movl %esp, %ebp + .LCFI3: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx ++#ifdef __SUNPRO_C ++ /* The SUNPRO compiler doesn't support GCC's regparm function ++ attribute, so we have to pass all three arguments to ++ ffi_closure_SYSV_inner on the stack. */ ++ movl %edx, 8(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, 4(%esp) /* &resp */ ++ movl %eax, (%esp) /* closure */ ++#else + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ ++#endif + #if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ + call ffi_closure_SYSV_inner + #else + movl %ebx, 8(%esp) + .LCFI7: + call 1f + 1: popl %ebx + addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx +@@ -323,16 +334,38 @@ 0: + .Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp .Lrcls_epilogue + .LFE3: + .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV + #endif + ++#if defined __GNUC__ ++/* Only emit dwarf unwind info when building with GNU toolchain. */ ++ ++#if defined __PIC__ ++# if defined __sun__ && defined __svr4__ ++/* 32-bit Solaris 2/x86 uses datarel encoding for PIC. GNU ld before 2.22 ++ doesn't correctly sort .eh_frame_hdr with mixed encodings, so match this. */ ++# define FDE_ENCODING 0x30 /* datarel */ ++# define FDE_ENCODE(X) X@GOTOFF ++# else ++# define FDE_ENCODING 0x1b /* pcrel sdata4 */ ++# if defined HAVE_AS_X86_PCREL ++# define FDE_ENCODE(X) X-. ++# else ++# define FDE_ENCODE(X) X@rel ++# endif ++# endif ++#else ++# define FDE_ENCODING 0 /* absolute */ ++# define FDE_ENCODE(X) X ++#endif ++ + .section .eh_frame,EH_FRAME_FLAGS,@progbits + .Lframe1: + .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ + .LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + #ifdef HAVE_AS_ASCII_PSEUDO_OP + #ifdef __PIC__ +@@ -349,37 +382,31 @@ 0: + #else + #error missing .ascii/.string + #endif + .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ + .byte 0x8 /* CIE RA Column */ + #ifdef __PIC__ + .byte 0x1 /* .uleb128 0x1; Augmentation size */ +- .byte 0x1b /* FDE Encoding (pcrel sdata4) */ ++ .byte FDE_ENCODING + #endif + .byte 0xc /* DW_CFA_def_cfa */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x88 /* DW_CFA_offset, column 0x8 */ + .byte 0x1 /* .uleb128 0x1 */ + .align 4 + .LECIE1: + .LSFDE1: + .long .LEFDE1-.LASFDE1 /* FDE Length */ + .LASFDE1: + .long .LASFDE1-.Lframe1 /* FDE CIE offset */ +-#if defined __PIC__ && defined HAVE_AS_X86_PCREL +- .long .LFB1-. /* FDE initial location */ +-#elif defined __PIC__ +- .long .LFB1@rel +-#else +- .long .LFB1 +-#endif +- .long .LFE1-.LFB1 /* FDE address range */ ++ .long FDE_ENCODE(.LFB1) /* FDE initial location */ ++ .long .LFE1-.LFB1 /* FDE address range */ + #ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ + #endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI0-.LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ +@@ -389,24 +416,18 @@ 0: + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x5 /* .uleb128 0x5 */ + .align 4 + .LEFDE1: + .LSFDE2: + .long .LEFDE2-.LASFDE2 /* FDE Length */ + .LASFDE2: + .long .LASFDE2-.Lframe1 /* FDE CIE offset */ +-#if defined __PIC__ && defined HAVE_AS_X86_PCREL +- .long .LFB2-. /* FDE initial location */ +-#elif defined __PIC__ +- .long .LFB2@rel +-#else +- .long .LFB2 +-#endif +- .long .LFE2-.LFB2 /* FDE address range */ ++ .long FDE_ENCODE(.LFB2) /* FDE initial location */ ++ .long .LFE2-.LFB2 /* FDE address range */ + #ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ + #endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI2-.LFB2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ +@@ -425,24 +446,18 @@ 0: + .LEFDE2: + + #if !FFI_NO_RAW_API + + .LSFDE3: + .long .LEFDE3-.LASFDE3 /* FDE Length */ + .LASFDE3: + .long .LASFDE3-.Lframe1 /* FDE CIE offset */ +-#if defined __PIC__ && defined HAVE_AS_X86_PCREL +- .long .LFB3-. /* FDE initial location */ +-#elif defined __PIC__ +- .long .LFB3@rel +-#else +- .long .LFB3 +-#endif +- .long .LFE3-.LFB3 /* FDE address range */ ++ .long FDE_ENCODE(.LFB3) /* FDE initial location */ ++ .long .LFE3-.LFB3 /* FDE address range */ + #ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ + #endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI4-.LFB3 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ +@@ -454,14 +469,15 @@ 0: + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI6-.LCFI5 + .byte 0x86 /* DW_CFA_offset, column 0x6 */ + .byte 0x3 /* .uleb128 0x3 */ + .align 4 + .LEFDE3: + + #endif ++#endif + + #endif /* ifndef __x86_64__ */ + + #if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits + #endif +diff --git a/js/src/ctypes/libffi/src/x86/unix64.S b/js/src/ctypes/libffi/src/x86/unix64.S +--- a/js/src/ctypes/libffi/src/x86/unix64.S ++++ b/js/src/ctypes/libffi/src/x86/unix64.S +@@ -1,11 +1,12 @@ + /* ----------------------------------------------------------------------- +- unix64.S - Copyright (c) 2002 Bo Thorsen +- Copyright (c) 2008 Red Hat, Inc ++ unix64.S - Copyright (c) 2013 The Written Word, Inc. ++ - Copyright (c) 2008 Red Hat, Inc ++ - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -319,16 +320,19 @@ ffi_closure_unix64: + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp .Lret_from_save_sse + + .LUW9: + .size ffi_closure_unix64,.-ffi_closure_unix64 + ++#ifdef __GNUC__ ++/* Only emit DWARF unwind info when building with the GNU toolchain. */ ++ + #ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE + .section .eh_frame,"a",@unwind + #else + .section .eh_frame,"a",@progbits + #endif + .Lframe1: + .long .LECIE1-.LSCIE1 /* CIE Length */ + .LSCIE1: +@@ -414,13 +418,15 @@ ffi_closure_unix64: + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LUW8-.LUW7 + .byte 0xb /* DW_CFA_restore_state */ + + .align 8 + .LEFDE3: + ++#endif /* __GNUC__ */ ++ + #endif /* __x86_64__ */ + + #if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits + #endif +diff --git a/js/src/ctypes/libffi/src/x86/win32.S b/js/src/ctypes/libffi/src/x86/win32.S +--- a/js/src/ctypes/libffi/src/x86/win32.S ++++ b/js/src/ctypes/libffi/src/x86/win32.S +@@ -40,16 +40,17 @@ + + EXTRN ffi_closure_SYSV_inner:NEAR + + _TEXT SEGMENT + + ffi_call_win32 PROC NEAR, + ffi_prep_args : NEAR PTR DWORD, + ecif : NEAR PTR DWORD, ++ cif_abi : DWORD, + cif_bytes : DWORD, + cif_flags : DWORD, + rvalue : NEAR PTR DWORD, + fn : NEAR PTR DWORD + + ;; Make room for all of the new args. + mov ecx, cif_bytes + sub esp, ecx +@@ -59,16 +60,29 @@ ffi_call_win32 PROC NEAR, + ;; Place all of the ffi_prep_args in position + push ecif + push eax + call ffi_prep_args + + ;; Return stack to previous state and call the function + add esp, 8 + ++ ;; Handle thiscall and fastcall ++ cmp cif_abi, 3 ;; FFI_THISCALL ++ jz do_thiscall ++ cmp cif_abi, 4 ;; FFI_FASTCALL ++ jnz do_stdcall ++ mov ecx, DWORD PTR [esp] ++ mov edx, DWORD PTR [esp+4] ++ add esp, 8 ++ jmp do_stdcall ++do_thiscall: ++ mov ecx, DWORD PTR [esp] ++ add esp, 4 ++do_stdcall: + call fn + + ;; cdecl: we restore esp in the epilogue, so there's no need to + ;; remove the space we pushed for the args. + ;; stdcall: the callee has already cleaned the stack. + + ;; Load ecx with the return type code + mov ecx, cif_flags +@@ -89,41 +103,47 @@ ca_jumptable: + jmp [ca_jumpdata + 4 * ecx] + ca_jumpdata: + ;; Do not insert anything here between label and jump table. + dd offset ca_epilogue ;; FFI_TYPE_VOID + dd offset ca_retint ;; FFI_TYPE_INT + dd offset ca_retfloat ;; FFI_TYPE_FLOAT + dd offset ca_retdouble ;; FFI_TYPE_DOUBLE + dd offset ca_retlongdouble ;; FFI_TYPE_LONGDOUBLE +- dd offset ca_retint8 ;; FFI_TYPE_UINT8 +- dd offset ca_retint8 ;; FFI_TYPE_SINT8 +- dd offset ca_retint16 ;; FFI_TYPE_UINT16 +- dd offset ca_retint16 ;; FFI_TYPE_SINT16 ++ dd offset ca_retuint8 ;; FFI_TYPE_UINT8 ++ dd offset ca_retsint8 ;; FFI_TYPE_SINT8 ++ dd offset ca_retuint16 ;; FFI_TYPE_UINT16 ++ dd offset ca_retsint16 ;; FFI_TYPE_SINT16 + dd offset ca_retint ;; FFI_TYPE_UINT32 + dd offset ca_retint ;; FFI_TYPE_SINT32 + dd offset ca_retint64 ;; FFI_TYPE_UINT64 + dd offset ca_retint64 ;; FFI_TYPE_SINT64 + dd offset ca_epilogue ;; FFI_TYPE_STRUCT + dd offset ca_retint ;; FFI_TYPE_POINTER +- dd offset ca_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B +- dd offset ca_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B ++ dd offset ca_retstruct1b ;; FFI_TYPE_SMALL_STRUCT_1B ++ dd offset ca_retstruct2b ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset ca_retint ;; FFI_TYPE_SMALL_STRUCT_4B ++ dd offset ca_epilogue ;; FFI_TYPE_MS_STRUCT + +-ca_retint8: +- ;; Load %ecx with the pointer to storage for the return value +- mov ecx, rvalue +- mov [ecx + 0], al +- jmp ca_epilogue ++ /* Sign/zero extend as appropriate. */ ++ca_retuint8: ++ movzx eax, al ++ jmp ca_retint + +-ca_retint16: +- ;; Load %ecx with the pointer to storage for the return value +- mov ecx, rvalue +- mov [ecx + 0], ax +- jmp ca_epilogue ++ca_retsint8: ++ movsx eax, al ++ jmp ca_retint ++ ++ca_retuint16: ++ movzx eax, ax ++ jmp ca_retint ++ ++ca_retsint16: ++ movsx eax, ax ++ jmp ca_retint + + ca_retint: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + mov [ecx + 0], eax + jmp ca_epilogue + + ca_retint64: +@@ -146,64 +166,94 @@ ca_retdouble: + jmp ca_epilogue + + ca_retlongdouble: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + fstp TBYTE PTR [ecx] + jmp ca_epilogue + ++ca_retstruct1b: ++ ;; Load %ecx with the pointer to storage for the return value ++ mov ecx, rvalue ++ mov [ecx + 0], al ++ jmp ca_epilogue ++ ++ca_retstruct2b: ++ ;; Load %ecx with the pointer to storage for the return value ++ mov ecx, rvalue ++ mov [ecx + 0], ax ++ jmp ca_epilogue ++ + ca_epilogue: + ;; Epilogue code is autogenerated. + ret + ffi_call_win32 ENDP + ++ffi_closure_THISCALL PROC NEAR FORCEFRAME ++ sub esp, 40 ++ lea edx, [ebp -24] ++ mov [ebp - 12], edx /* resp */ ++ lea edx, [ebp + 12] /* account for stub return address on stack */ ++ jmp stub ++ffi_closure_THISCALL ENDP ++ + ffi_closure_SYSV PROC NEAR FORCEFRAME + ;; the ffi_closure ctx is passed in eax by the trampoline. + + sub esp, 40 + lea edx, [ebp - 24] + mov [ebp - 12], edx ;; resp + lea edx, [ebp + 8] ++stub:: + mov [esp + 8], edx ;; args + lea edx, [ebp - 12] + mov [esp + 4], edx ;; &resp + mov [esp], eax ;; closure + call ffi_closure_SYSV_inner + mov ecx, [ebp - 12] + + cs_jumptable: + jmp [cs_jumpdata + 4 * eax] + cs_jumpdata: + ;; Do not insert anything here between the label and jump table. + dd offset cs_epilogue ;; FFI_TYPE_VOID + dd offset cs_retint ;; FFI_TYPE_INT + dd offset cs_retfloat ;; FFI_TYPE_FLOAT + dd offset cs_retdouble ;; FFI_TYPE_DOUBLE + dd offset cs_retlongdouble ;; FFI_TYPE_LONGDOUBLE +- dd offset cs_retint8 ;; FFI_TYPE_UINT8 +- dd offset cs_retint8 ;; FFI_TYPE_SINT8 +- dd offset cs_retint16 ;; FFI_TYPE_UINT16 +- dd offset cs_retint16 ;; FFI_TYPE_SINT16 ++ dd offset cs_retuint8 ;; FFI_TYPE_UINT8 ++ dd offset cs_retsint8 ;; FFI_TYPE_SINT8 ++ dd offset cs_retuint16 ;; FFI_TYPE_UINT16 ++ dd offset cs_retsint16 ;; FFI_TYPE_SINT16 + dd offset cs_retint ;; FFI_TYPE_UINT32 + dd offset cs_retint ;; FFI_TYPE_SINT32 + dd offset cs_retint64 ;; FFI_TYPE_UINT64 + dd offset cs_retint64 ;; FFI_TYPE_SINT64 + dd offset cs_retstruct ;; FFI_TYPE_STRUCT + dd offset cs_retint ;; FFI_TYPE_POINTER +- dd offset cs_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B +- dd offset cs_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B ++ dd offset cs_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B ++ dd offset cs_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset cs_retint ;; FFI_TYPE_SMALL_STRUCT_4B ++ dd offset cs_retmsstruct ;; FFI_TYPE_MS_STRUCT + +-cs_retint8: +- mov al, [ecx] ++cs_retuint8: ++ movzx eax, BYTE PTR [ecx] + jmp cs_epilogue + +-cs_retint16: +- mov ax, [ecx] ++cs_retsint8: ++ movsx eax, BYTE PTR [ecx] ++ jmp cs_epilogue ++ ++cs_retuint16: ++ movzx eax, WORD PTR [ecx] ++ jmp cs_epilogue ++ ++cs_retsint16: ++ movsx eax, WORD PTR [ecx] + jmp cs_epilogue + + cs_retint: + mov eax, [ecx] + jmp cs_epilogue + + cs_retint64: + mov eax, [ecx + 0] +@@ -222,36 +272,52 @@ cs_retlongdouble: + fld TBYTE PTR [ecx] + jmp cs_epilogue + + cs_retstruct: + ;; Caller expects us to pop struct return value pointer hidden arg. + ;; Epilogue code is autogenerated. + ret 4 + ++cs_retmsstruct: ++ ;; Caller expects us to return a pointer to the real return value. ++ mov eax, ecx ++ ;; Caller doesn't expects us to pop struct return value pointer hidden arg. ++ jmp cs_epilogue ++ + cs_epilogue: + ;; Epilogue code is autogenerated. + ret + ffi_closure_SYSV ENDP + + #if !FFI_NO_RAW_API + + #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3) + #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) + #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) + #define CIF_FLAGS_OFFSET 20 + +-ffi_closure_raw_SYSV PROC NEAR USES esi ++ffi_closure_raw_THISCALL PROC NEAR USES esi FORCEFRAME ++ sub esp, 36 ++ mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif ++ mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data ++ mov [esp + 12], edx ++ lea edx, [ebp + 12] ++ jmp stubraw ++ffi_closure_raw_THISCALL ENDP ++ ++ffi_closure_raw_SYSV PROC NEAR USES esi FORCEFRAME + ;; the ffi_closure ctx is passed in eax by the trampoline. + + sub esp, 40 + mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif + mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data + mov [esp + 12], edx ;; user_data + lea edx, [ebp + 8] ++stubraw:: + mov [esp + 8], edx ;; raw_args + lea edx, [ebp - 24] + mov [esp + 4], edx ;; &res + mov [esp], esi ;; cif + call DWORD PTR [eax + RAW_CLOSURE_FUN_OFFSET] ;; closure->fun + mov eax, [esi + CIF_FLAGS_OFFSET] ;; cif->flags + lea ecx, [ebp - 24] + +@@ -259,36 +325,45 @@ cr_jumptable: + jmp [cr_jumpdata + 4 * eax] + cr_jumpdata: + ;; Do not insert anything here between the label and jump table. + dd offset cr_epilogue ;; FFI_TYPE_VOID + dd offset cr_retint ;; FFI_TYPE_INT + dd offset cr_retfloat ;; FFI_TYPE_FLOAT + dd offset cr_retdouble ;; FFI_TYPE_DOUBLE + dd offset cr_retlongdouble ;; FFI_TYPE_LONGDOUBLE +- dd offset cr_retint8 ;; FFI_TYPE_UINT8 +- dd offset cr_retint8 ;; FFI_TYPE_SINT8 +- dd offset cr_retint16 ;; FFI_TYPE_UINT16 +- dd offset cr_retint16 ;; FFI_TYPE_SINT16 ++ dd offset cr_retuint8 ;; FFI_TYPE_UINT8 ++ dd offset cr_retsint8 ;; FFI_TYPE_SINT8 ++ dd offset cr_retuint16 ;; FFI_TYPE_UINT16 ++ dd offset cr_retsint16 ;; FFI_TYPE_SINT16 + dd offset cr_retint ;; FFI_TYPE_UINT32 + dd offset cr_retint ;; FFI_TYPE_SINT32 + dd offset cr_retint64 ;; FFI_TYPE_UINT64 + dd offset cr_retint64 ;; FFI_TYPE_SINT64 + dd offset cr_epilogue ;; FFI_TYPE_STRUCT + dd offset cr_retint ;; FFI_TYPE_POINTER +- dd offset cr_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B +- dd offset cr_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B ++ dd offset cr_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B ++ dd offset cr_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset cr_retint ;; FFI_TYPE_SMALL_STRUCT_4B ++ dd offset cr_epilogue ;; FFI_TYPE_MS_STRUCT + +-cr_retint8: +- mov al, [ecx] ++cr_retuint8: ++ movzx eax, BYTE PTR [ecx] + jmp cr_epilogue + +-cr_retint16: +- mov ax, [ecx] ++cr_retsint8: ++ movsx eax, BYTE PTR [ecx] ++ jmp cr_epilogue ++ ++cr_retuint16: ++ movzx eax, WORD PTR [ecx] ++ jmp cr_epilogue ++ ++cr_retsint16: ++ movsx eax, WORD PTR [ecx] + jmp cr_epilogue + + cr_retint: + mov eax, [ecx] + jmp cr_epilogue + + cr_retint64: + mov eax, [ecx + 0] +@@ -332,36 +407,44 @@ cd_jumptable: + jmp [cd_jumpdata + 4 * eax] + cd_jumpdata: + ;; Do not insert anything here between the label and jump table. + dd offset cd_epilogue ;; FFI_TYPE_VOID + dd offset cd_retint ;; FFI_TYPE_INT + dd offset cd_retfloat ;; FFI_TYPE_FLOAT + dd offset cd_retdouble ;; FFI_TYPE_DOUBLE + dd offset cd_retlongdouble ;; FFI_TYPE_LONGDOUBLE +- dd offset cd_retint8 ;; FFI_TYPE_UINT8 +- dd offset cd_retint8 ;; FFI_TYPE_SINT8 +- dd offset cd_retint16 ;; FFI_TYPE_UINT16 +- dd offset cd_retint16 ;; FFI_TYPE_SINT16 ++ dd offset cd_retuint8 ;; FFI_TYPE_UINT8 ++ dd offset cd_retsint8 ;; FFI_TYPE_SINT8 ++ dd offset cd_retuint16 ;; FFI_TYPE_UINT16 ++ dd offset cd_retsint16 ;; FFI_TYPE_SINT16 + dd offset cd_retint ;; FFI_TYPE_UINT32 + dd offset cd_retint ;; FFI_TYPE_SINT32 + dd offset cd_retint64 ;; FFI_TYPE_UINT64 + dd offset cd_retint64 ;; FFI_TYPE_SINT64 + dd offset cd_epilogue ;; FFI_TYPE_STRUCT + dd offset cd_retint ;; FFI_TYPE_POINTER +- dd offset cd_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B +- dd offset cd_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B ++ dd offset cd_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B ++ dd offset cd_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset cd_retint ;; FFI_TYPE_SMALL_STRUCT_4B + +-cd_retint8: +- mov al, [ecx] ++cd_retuint8: ++ movzx eax, BYTE PTR [ecx] + jmp cd_epilogue + +-cd_retint16: +- mov ax, [ecx] ++cd_retsint8: ++ movsx eax, BYTE PTR [ecx] ++ jmp cd_epilogue ++ ++cd_retuint16: ++ movzx eax, WORD PTR [ecx] ++ jmp cd_epilogue ++ ++cd_retsint16: ++ movsx eax, WORD PTR [ecx] + jmp cd_epilogue + + cd_retint: + mov eax, [ecx] + jmp cd_epilogue + + cd_retint64: + mov eax, [ecx + 0] +@@ -385,94 +468,117 @@ cd_epilogue: + ret + ffi_closure_STDCALL ENDP + + _TEXT ENDS + END + + #else + ++#if defined(SYMBOL_UNDERSCORE) ++#define USCORE_SYMBOL(x) _##x ++#else ++#define USCORE_SYMBOL(x) x ++#endif + .text + + # This assumes we are using gas. + .balign 16 +- .globl _ffi_call_win32 +-#ifndef __OS2__ ++FFI_HIDDEN(ffi_call_win32) ++ .globl USCORE_SYMBOL(ffi_call_win32) ++#if defined(X86_WIN32) && !defined(__OS2__) + .def _ffi_call_win32; .scl 2; .type 32; .endef + #endif +-_ffi_call_win32: ++USCORE_SYMBOL(ffi_call_win32): + .LFB1: + pushl %ebp + .LCFI0: + movl %esp,%ebp + .LCFI1: + # Make room for all of the new args. +- movl 16(%ebp),%ecx ++ movl 20(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + # Place all of the ffi_prep_args in position + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + # Return stack to previous state and call the function + addl $8,%esp +- ++ ++ # Handle fastcall and thiscall ++ cmpl $3, 16(%ebp) # FFI_THISCALL ++ jz .do_thiscall ++ cmpl $4, 16(%ebp) # FFI_FASTCALL ++ jnz .do_fncall ++ movl (%esp), %ecx ++ movl 4(%esp), %edx ++ addl $8, %esp ++ jmp .do_fncall ++.do_thiscall: ++ movl (%esp), %ecx ++ addl $4, %esp ++ ++.do_fncall: ++ + # FIXME: Align the stack to a 128-bit boundary to avoid + # potential performance hits. + +- call *28(%ebp) ++ call *32(%ebp) + + # stdcall functions pop arguments off the stack themselves + + # Load %ecx with the return type code +- movl 20(%ebp),%ecx ++ movl 24(%ebp),%ecx + + # If the return value pointer is NULL, assume no return value. +- cmpl $0,24(%ebp) ++ cmpl $0,28(%ebp) + jne 0f + + # Even if there is no space for the return value, we are + # obliged to handle floating-point values. + cmpl $FFI_TYPE_FLOAT,%ecx + jne .Lnoretval + fstp %st(0) + + jmp .Lepilogue + + 0: + call 1f + # Do not insert anything here between the call and the jump table. + .Lstore_table: +- .long .Lnoretval /* FFI_TYPE_VOID */ +- .long .Lretint /* FFI_TYPE_INT */ +- .long .Lretfloat /* FFI_TYPE_FLOAT */ +- .long .Lretdouble /* FFI_TYPE_DOUBLE */ +- .long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */ +- .long .Lretuint8 /* FFI_TYPE_UINT8 */ +- .long .Lretsint8 /* FFI_TYPE_SINT8 */ +- .long .Lretuint16 /* FFI_TYPE_UINT16 */ +- .long .Lretsint16 /* FFI_TYPE_SINT16 */ +- .long .Lretint /* FFI_TYPE_UINT32 */ +- .long .Lretint /* FFI_TYPE_SINT32 */ +- .long .Lretint64 /* FFI_TYPE_UINT64 */ +- .long .Lretint64 /* FFI_TYPE_SINT64 */ +- .long .Lretstruct /* FFI_TYPE_STRUCT */ +- .long .Lretint /* FFI_TYPE_POINTER */ +- .long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */ +- .long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */ +- .long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */ ++ .long .Lnoretval-.Lstore_table /* FFI_TYPE_VOID */ ++ .long .Lretint-.Lstore_table /* FFI_TYPE_INT */ ++ .long .Lretfloat-.Lstore_table /* FFI_TYPE_FLOAT */ ++ .long .Lretdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long .Lretlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long .Lretuint8-.Lstore_table /* FFI_TYPE_UINT8 */ ++ .long .Lretsint8-.Lstore_table /* FFI_TYPE_SINT8 */ ++ .long .Lretuint16-.Lstore_table /* FFI_TYPE_UINT16 */ ++ .long .Lretsint16-.Lstore_table /* FFI_TYPE_SINT16 */ ++ .long .Lretint-.Lstore_table /* FFI_TYPE_UINT32 */ ++ .long .Lretint-.Lstore_table /* FFI_TYPE_SINT32 */ ++ .long .Lretint64-.Lstore_table /* FFI_TYPE_UINT64 */ ++ .long .Lretint64-.Lstore_table /* FFI_TYPE_SINT64 */ ++ .long .Lretstruct-.Lstore_table /* FFI_TYPE_STRUCT */ ++ .long .Lretint-.Lstore_table /* FFI_TYPE_POINTER */ ++ .long .Lretstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ ++ .long .Lretstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ ++ .long .Lretstruct4b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_4B */ ++ .long .Lretstruct-.Lstore_table /* FFI_TYPE_MS_STRUCT */ + 1: +- add %ecx, %ecx +- add %ecx, %ecx ++ shl $2, %ecx ++ add (%esp),%ecx ++ mov (%ecx),%ecx + add (%esp),%ecx + add $4, %esp +- jmp *(%ecx) ++ jmp *%ecx + + /* Sign/zero extend as appropriate. */ + .Lretsint8: + movsbl %al, %eax + jmp .Lretint + + .Lretsint16: + movswl %ax, %eax +@@ -483,125 +589,156 @@ 1: + jmp .Lretint + + .Lretuint16: + movzwl %ax, %eax + jmp .Lretint + + .Lretint: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + movl %eax,0(%ecx) + jmp .Lepilogue + + .Lretfloat: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + fstps (%ecx) + jmp .Lepilogue + + .Lretdouble: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + fstpl (%ecx) + jmp .Lepilogue + + .Lretlongdouble: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + fstpt (%ecx) + jmp .Lepilogue + + .Lretint64: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp .Lepilogue + + .Lretstruct1b: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + movb %al,0(%ecx) + jmp .Lepilogue + + .Lretstruct2b: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + movw %ax,0(%ecx) + jmp .Lepilogue + + .Lretstruct4b: + # Load %ecx with the pointer to storage for the return value +- movl 24(%ebp),%ecx ++ movl 28(%ebp),%ecx + movl %eax,0(%ecx) + jmp .Lepilogue + + .Lretstruct: + # Nothing to do! + + .Lnoretval: + .Lepilogue: + movl %ebp,%esp + popl %ebp + ret + .ffi_call_win32_end: ++ .balign 16 ++FFI_HIDDEN(ffi_closure_THISCALL) ++ .globl USCORE_SYMBOL(ffi_closure_THISCALL) ++#if defined(X86_WIN32) && !defined(__OS2__) ++ .def _ffi_closure_THISCALL; .scl 2; .type 32; .endef ++#endif ++USCORE_SYMBOL(ffi_closure_THISCALL): ++ pushl %ebp ++ movl %esp, %ebp ++ subl $40, %esp ++ leal -24(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 12(%ebp), %edx /* account for stub return address on stack */ ++ jmp .stub + .LFE1: + + # This assumes we are using gas. + .balign 16 +- .globl _ffi_closure_SYSV +-#ifndef __OS2__ ++FFI_HIDDEN(ffi_closure_SYSV) ++#if defined(X86_WIN32) ++ .globl USCORE_SYMBOL(ffi_closure_SYSV) ++#if defined(X86_WIN32) && !defined(__OS2__) + .def _ffi_closure_SYSV; .scl 2; .type 32; .endef + #endif +-_ffi_closure_SYSV: ++USCORE_SYMBOL(ffi_closure_SYSV): ++#endif + .LFB3: + pushl %ebp + .LCFI4: + movl %esp, %ebp + .LCFI5: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx ++.stub: + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ +- call _ffi_closure_SYSV_inner ++#if defined(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE) || !defined(__PIC__) ++ call USCORE_SYMBOL(ffi_closure_SYSV_inner) ++#elif defined(X86_DARWIN) ++ calll L_ffi_closure_SYSV_inner$stub ++#else ++ movl %ebx, 8(%esp) ++ call 1f ++1: popl %ebx ++ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx ++ call ffi_closure_SYSV_inner@PLT ++ movl 8(%esp), %ebx ++#endif + movl -12(%ebp), %ecx + + 0: + call 1f + # Do not insert anything here between the call and the jump table. + .Lcls_store_table: +- .long .Lcls_noretval /* FFI_TYPE_VOID */ +- .long .Lcls_retint /* FFI_TYPE_INT */ +- .long .Lcls_retfloat /* FFI_TYPE_FLOAT */ +- .long .Lcls_retdouble /* FFI_TYPE_DOUBLE */ +- .long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */ +- .long .Lcls_retuint8 /* FFI_TYPE_UINT8 */ +- .long .Lcls_retsint8 /* FFI_TYPE_SINT8 */ +- .long .Lcls_retuint16 /* FFI_TYPE_UINT16 */ +- .long .Lcls_retsint16 /* FFI_TYPE_SINT16 */ +- .long .Lcls_retint /* FFI_TYPE_UINT32 */ +- .long .Lcls_retint /* FFI_TYPE_SINT32 */ +- .long .Lcls_retllong /* FFI_TYPE_UINT64 */ +- .long .Lcls_retllong /* FFI_TYPE_SINT64 */ +- .long .Lcls_retstruct /* FFI_TYPE_STRUCT */ +- .long .Lcls_retint /* FFI_TYPE_POINTER */ +- .long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ +- .long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ +- .long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ ++ .long .Lcls_noretval-.Lcls_store_table /* FFI_TYPE_VOID */ ++ .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_INT */ ++ .long .Lcls_retfloat-.Lcls_store_table /* FFI_TYPE_FLOAT */ ++ .long .Lcls_retdouble-.Lcls_store_table /* FFI_TYPE_DOUBLE */ ++ .long .Lcls_retldouble-.Lcls_store_table /* FFI_TYPE_LONGDOUBLE */ ++ .long .Lcls_retuint8-.Lcls_store_table /* FFI_TYPE_UINT8 */ ++ .long .Lcls_retsint8-.Lcls_store_table /* FFI_TYPE_SINT8 */ ++ .long .Lcls_retuint16-.Lcls_store_table /* FFI_TYPE_UINT16 */ ++ .long .Lcls_retsint16-.Lcls_store_table /* FFI_TYPE_SINT16 */ ++ .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_UINT32 */ ++ .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_SINT32 */ ++ .long .Lcls_retllong-.Lcls_store_table /* FFI_TYPE_UINT64 */ ++ .long .Lcls_retllong-.Lcls_store_table /* FFI_TYPE_SINT64 */ ++ .long .Lcls_retstruct-.Lcls_store_table /* FFI_TYPE_STRUCT */ ++ .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_POINTER */ ++ .long .Lcls_retstruct1-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */ ++ .long .Lcls_retstruct2-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */ ++ .long .Lcls_retstruct4-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */ ++ .long .Lcls_retmsstruct-.Lcls_store_table /* FFI_TYPE_MS_STRUCT */ + + 1: +- add %eax, %eax +- add %eax, %eax ++ shl $2, %eax ++ add (%esp),%eax ++ mov (%eax),%eax + add (%esp),%eax + add $4, %esp +- jmp *(%eax) ++ jmp *%eax + + /* Sign/zero extend as appropriate. */ + .Lcls_retsint8: + movsbl (%ecx), %eax + jmp .Lcls_epilogue + + .Lcls_retsint16: + movswl (%ecx), %eax +@@ -649,84 +786,110 @@ 1: + jmp .Lcls_epilogue + + .Lcls_retstruct: + # Caller expects us to pop struct return value pointer hidden arg. + movl %ebp, %esp + popl %ebp + ret $0x4 + ++.Lcls_retmsstruct: ++ # Caller expects us to return a pointer to the real return value. ++ mov %ecx, %eax ++ # Caller doesn't expects us to pop struct return value pointer hidden arg. ++ jmp .Lcls_epilogue ++ + .Lcls_noretval: + .Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret + .ffi_closure_SYSV_end: + .LFE3: + + #if !FFI_NO_RAW_API + + #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) + #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) + #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) + #define CIF_FLAGS_OFFSET 20 +- ++ .balign 16 ++FFI_HIDDEN(ffi_closure_raw_THISCALL) ++ .globl USCORE_SYMBOL(ffi_closure_raw_THISCALL) ++#if defined(X86_WIN32) && !defined(__OS2__) ++ .def _ffi_closure_raw_THISCALL; .scl 2; .type 32; .endef ++#endif ++USCORE_SYMBOL(ffi_closure_raw_THISCALL): ++ pushl %ebp ++ movl %esp, %ebp ++ pushl %esi ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 12(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ jmp .stubraw + # This assumes we are using gas. + .balign 16 +- .globl _ffi_closure_raw_SYSV +-#ifndef __OS2__ ++#if defined(X86_WIN32) ++ .globl USCORE_SYMBOL(ffi_closure_raw_SYSV) ++#if defined(X86_WIN32) && !defined(__OS2__) + .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef + #endif +-_ffi_closure_raw_SYSV: ++USCORE_SYMBOL(ffi_closure_raw_SYSV): ++#endif /* defined(X86_WIN32) */ + .LFB4: + pushl %ebp + .LCFI6: + movl %esp, %ebp + .LCFI7: + pushl %esi + .LCFI8: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++.stubraw: + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + 0: + call 1f + # Do not insert anything here between the call and the jump table. + .Lrcls_store_table: +- .long .Lrcls_noretval /* FFI_TYPE_VOID */ +- .long .Lrcls_retint /* FFI_TYPE_INT */ +- .long .Lrcls_retfloat /* FFI_TYPE_FLOAT */ +- .long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */ +- .long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */ +- .long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */ +- .long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */ +- .long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */ +- .long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */ +- .long .Lrcls_retint /* FFI_TYPE_UINT32 */ +- .long .Lrcls_retint /* FFI_TYPE_SINT32 */ +- .long .Lrcls_retllong /* FFI_TYPE_UINT64 */ +- .long .Lrcls_retllong /* FFI_TYPE_SINT64 */ +- .long .Lrcls_retstruct /* FFI_TYPE_STRUCT */ +- .long .Lrcls_retint /* FFI_TYPE_POINTER */ +- .long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ +- .long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ +- .long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ ++ .long .Lrcls_noretval-.Lrcls_store_table /* FFI_TYPE_VOID */ ++ .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_INT */ ++ .long .Lrcls_retfloat-.Lrcls_store_table /* FFI_TYPE_FLOAT */ ++ .long .Lrcls_retdouble-.Lrcls_store_table /* FFI_TYPE_DOUBLE */ ++ .long .Lrcls_retldouble-.Lrcls_store_table /* FFI_TYPE_LONGDOUBLE */ ++ .long .Lrcls_retuint8-.Lrcls_store_table /* FFI_TYPE_UINT8 */ ++ .long .Lrcls_retsint8-.Lrcls_store_table /* FFI_TYPE_SINT8 */ ++ .long .Lrcls_retuint16-.Lrcls_store_table /* FFI_TYPE_UINT16 */ ++ .long .Lrcls_retsint16-.Lrcls_store_table /* FFI_TYPE_SINT16 */ ++ .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_UINT32 */ ++ .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_SINT32 */ ++ .long .Lrcls_retllong-.Lrcls_store_table /* FFI_TYPE_UINT64 */ ++ .long .Lrcls_retllong-.Lrcls_store_table /* FFI_TYPE_SINT64 */ ++ .long .Lrcls_retstruct-.Lrcls_store_table /* FFI_TYPE_STRUCT */ ++ .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_POINTER */ ++ .long .Lrcls_retstruct1-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */ ++ .long .Lrcls_retstruct2-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */ ++ .long .Lrcls_retstruct4-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */ ++ .long .Lrcls_retstruct-.Lrcls_store_table /* FFI_TYPE_MS_STRUCT */ + 1: +- add %eax, %eax +- add %eax, %eax ++ shl $2, %eax ++ add (%esp),%eax ++ mov (%eax),%eax + add (%esp),%eax + add $4, %esp +- jmp *(%eax) ++ jmp *%eax + + /* Sign/zero extend as appropriate. */ + .Lrcls_retsint8: + movsbl -24(%ebp), %eax + jmp .Lrcls_epilogue + + .Lrcls_retsint16: + movswl -24(%ebp), %eax +@@ -784,63 +947,76 @@ 1: + ret + .ffi_closure_raw_SYSV_end: + .LFE4: + + #endif /* !FFI_NO_RAW_API */ + + # This assumes we are using gas. + .balign 16 +- .globl _ffi_closure_STDCALL +-#ifndef __OS2__ ++FFI_HIDDEN(ffi_closure_STDCALL) ++ .globl USCORE_SYMBOL(ffi_closure_STDCALL) ++#if defined(X86_WIN32) && !defined(__OS2__) + .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef + #endif +-_ffi_closure_STDCALL: ++USCORE_SYMBOL(ffi_closure_STDCALL): + .LFB5: + pushl %ebp + .LCFI9: + movl %esp, %ebp + .LCFI10: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 12(%ebp), %edx /* account for stub return address on stack */ + movl %edx, 4(%esp) /* args */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ +- call _ffi_closure_SYSV_inner ++#if defined(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE) || !defined(__PIC__) ++ call USCORE_SYMBOL(ffi_closure_SYSV_inner) ++#elif defined(X86_DARWIN) ++ calll L_ffi_closure_SYSV_inner$stub ++#else ++ movl %ebx, 8(%esp) ++ call 1f ++1: popl %ebx ++ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx ++ call ffi_closure_SYSV_inner@PLT ++ movl 8(%esp), %ebx ++#endif + movl -12(%ebp), %ecx + 0: + call 1f + # Do not insert anything here between the call and the jump table. + .Lscls_store_table: +- .long .Lscls_noretval /* FFI_TYPE_VOID */ +- .long .Lscls_retint /* FFI_TYPE_INT */ +- .long .Lscls_retfloat /* FFI_TYPE_FLOAT */ +- .long .Lscls_retdouble /* FFI_TYPE_DOUBLE */ +- .long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */ +- .long .Lscls_retuint8 /* FFI_TYPE_UINT8 */ +- .long .Lscls_retsint8 /* FFI_TYPE_SINT8 */ +- .long .Lscls_retuint16 /* FFI_TYPE_UINT16 */ +- .long .Lscls_retsint16 /* FFI_TYPE_SINT16 */ +- .long .Lscls_retint /* FFI_TYPE_UINT32 */ +- .long .Lscls_retint /* FFI_TYPE_SINT32 */ +- .long .Lscls_retllong /* FFI_TYPE_UINT64 */ +- .long .Lscls_retllong /* FFI_TYPE_SINT64 */ +- .long .Lscls_retstruct /* FFI_TYPE_STRUCT */ +- .long .Lscls_retint /* FFI_TYPE_POINTER */ +- .long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ +- .long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ +- .long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ ++ .long .Lscls_noretval-.Lscls_store_table /* FFI_TYPE_VOID */ ++ .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_INT */ ++ .long .Lscls_retfloat-.Lscls_store_table /* FFI_TYPE_FLOAT */ ++ .long .Lscls_retdouble-.Lscls_store_table /* FFI_TYPE_DOUBLE */ ++ .long .Lscls_retldouble-.Lscls_store_table /* FFI_TYPE_LONGDOUBLE */ ++ .long .Lscls_retuint8-.Lscls_store_table /* FFI_TYPE_UINT8 */ ++ .long .Lscls_retsint8-.Lscls_store_table /* FFI_TYPE_SINT8 */ ++ .long .Lscls_retuint16-.Lscls_store_table /* FFI_TYPE_UINT16 */ ++ .long .Lscls_retsint16-.Lscls_store_table /* FFI_TYPE_SINT16 */ ++ .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_UINT32 */ ++ .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_SINT32 */ ++ .long .Lscls_retllong-.Lscls_store_table /* FFI_TYPE_UINT64 */ ++ .long .Lscls_retllong-.Lscls_store_table /* FFI_TYPE_SINT64 */ ++ .long .Lscls_retstruct-.Lscls_store_table /* FFI_TYPE_STRUCT */ ++ .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_POINTER */ ++ .long .Lscls_retstruct1-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */ ++ .long .Lscls_retstruct2-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */ ++ .long .Lscls_retstruct4-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */ + 1: +- add %eax, %eax +- add %eax, %eax ++ shl $2, %eax ++ add (%esp),%eax ++ mov (%eax),%eax + add (%esp),%eax + add $4, %esp +- jmp *(%eax) ++ jmp *%eax + + /* Sign/zero extend as appropriate. */ + .Lscls_retsint8: + movsbl (%ecx), %eax + jmp .Lscls_epilogue + + .Lscls_retsint16: + movswl (%ecx), %eax +@@ -893,17 +1069,24 @@ 1: + .Lscls_noretval: + .Lscls_epilogue: + movl %ebp, %esp + popl %ebp + ret + .ffi_closure_STDCALL_end: + .LFE5: + +-#ifndef __OS2__ ++#if defined(X86_DARWIN) ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++#endif ++ ++#if defined(X86_WIN32) && !defined(__OS2__) + .section .eh_frame,"w" + #endif + .Lframe1: + .LSCIE1: + .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */ + .LASCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +@@ -953,17 +1136,16 @@ 1: + .long .LCFI1-.LCFI0 + .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ + .byte 0x5 /* .uleb128 0x5 */ + + /* End of DW_CFA_xxx CFI instructions. */ + .align 4 + .LEFDE1: + +- + .LSFDE3: + .long .LEFDE3-.LASFDE3 /* FDE Length */ + .LASFDE3: + .long .LASFDE3-.Lframe1 /* FDE CIE offset */ + #if defined __PIC__ && defined HAVE_AS_X86_PCREL + .long .LFB3-. /* FDE initial location */ + #else + .long .LFB3 +diff --git a/js/src/ctypes/libffi/src/xtensa/ffi.c b/js/src/ctypes/libffi/src/xtensa/ffi.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/xtensa/ffi.c +@@ -0,0 +1,298 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2013 Tensilica, Inc. ++ ++ XTENSA Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* ++ |----------------------------------------| ++ | | ++ on entry to ffi_call ----> |----------------------------------------| ++ | caller stack frame for registers a0-a3 | ++ |----------------------------------------| ++ | | ++ | additional arguments | ++ entry of the function ---> |----------------------------------------| ++ | copy of function arguments a2-a7 | ++ | - - - - - - - - - - - - - | ++ | | ++ ++ The area below the entry line becomes the new stack frame for the function. ++ ++*/ ++ ++ ++#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST ++ ++ ++extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags, ++ void(*fn)(void), unsigned nbytes, extended_cif*); ++extern void ffi_closure_SYSV(void) FFI_HIDDEN; ++ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ switch(cif->rtype->type) { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ cif->flags = cif->rtype->type; ++ break; ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_FLOAT: ++ cif->flags = FFI_TYPE_UINT32; ++ break; ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ cif->flags = FFI_TYPE_UINT64; // cif->rtype->type; ++ break; ++ case FFI_TYPE_STRUCT: ++ cif->flags = FFI_TYPE_STRUCT; //_REGS; ++ /* Up to 16 bytes are returned in registers */ ++ if (cif->rtype->size > 4 * 4) { ++ /* returned structure is referenced by a register; use 8 bytes ++ (including 4 bytes for potential additional alignment) */ ++ cif->flags = FFI_TYPE_STRUCT; ++ cif->bytes += 8; ++ } ++ break; ++ ++ default: ++ cif->flags = FFI_TYPE_UINT32; ++ break; ++ } ++ ++ /* Round the stack up to a full 4 register frame, just in case ++ (we use this size in movsp). This way, it's also a multiple of ++ 8 bytes for 64-bit arguments. */ ++ cif->bytes = ALIGN(cif->bytes, 16); ++ ++ return FFI_OK; ++} ++ ++void ffi_prep_args(extended_cif *ecif, unsigned char* stack) ++{ ++ unsigned int i; ++ unsigned long *addr; ++ ffi_type **ptr; ++ ++ union { ++ void **v; ++ char **c; ++ signed char **sc; ++ unsigned char **uc; ++ signed short **ss; ++ unsigned short **us; ++ unsigned int **i; ++ long long **ll; ++ float **f; ++ double **d; ++ } p_argv; ++ ++ /* Verify that everything is aligned up properly */ ++ FFI_ASSERT (((unsigned long) stack & 0x7) == 0); ++ ++ p_argv.v = ecif->avalue; ++ addr = (unsigned long*)stack; ++ ++ /* structures with a size greater than 16 bytes are passed in memory */ ++ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16) ++ { ++ *addr++ = (unsigned long)ecif->rvalue; ++ } ++ ++ for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types; ++ i > 0; ++ i--, ptr++, p_argv.v++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *addr++ = **p_argv.sc; ++ break; ++ case FFI_TYPE_UINT8: ++ *addr++ = **p_argv.uc; ++ break; ++ case FFI_TYPE_SINT16: ++ *addr++ = **p_argv.ss; ++ break; ++ case FFI_TYPE_UINT16: ++ *addr++ = **p_argv.us; ++ break; ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ *addr++ = **p_argv.i; ++ break; ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ if (((unsigned long)addr & 4) != 0) ++ addr++; ++ *(unsigned long long*)addr = **p_argv.ll; ++ addr += sizeof(unsigned long long) / sizeof (addr); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ unsigned long offs; ++ unsigned long size; ++ ++ if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4) ++ addr++; ++ ++ offs = (unsigned long) addr - (unsigned long) stack; ++ size = (*ptr)->size; ++ ++ /* Entire structure must fit the argument registers or referenced */ ++ if (offs < FFI_REGISTER_NARGS * 4 ++ && offs + size > FFI_REGISTER_NARGS * 4) ++ addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4); ++ ++ memcpy((char*) addr, *p_argv.c, size); ++ addr += (size + 3) / 4; ++ break; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++} ++ ++ ++void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ unsigned long rsize = cif->rtype->size; ++ int flags = cif->flags; ++ void *alloc = NULL; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* Note that for structures that are returned in registers (size <= 16 bytes) ++ we allocate a temporary buffer and use memcpy to copy it to the final ++ destination. The reason is that the target address might be misaligned or ++ the length not a multiple of 4 bytes. Handling all those cases would be ++ very complex. */ ++ ++ if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL)) ++ { ++ alloc = alloca(ALIGN(rsize, 4)); ++ ecif.rvalue = alloc; ++ } ++ else ++ { ++ ecif.rvalue = rvalue; ++ } ++ ++ if (cif->abi != FFI_SYSV) ++ FFI_ASSERT(0); ++ ++ ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif); ++ ++ if (alloc != NULL && rvalue != NULL) ++ memcpy(rvalue, alloc, rsize); ++} ++ ++extern void ffi_trampoline(); ++extern void ffi_cacheflush(void* start, void* end); ++ ++ffi_status ++ffi_prep_closure_loc (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void *user_data, ++ void *codeloc) ++{ ++ /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */ ++ memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE); ++ *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV; ++ ++ // Do we have this function? ++ // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE) ++ ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE); ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ return FFI_OK; ++} ++ ++ ++long FFI_HIDDEN ++ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue) ++{ ++ ffi_cif *cif; ++ ffi_type **arg_types; ++ void **avalue; ++ int i, areg; ++ ++ cif = closure->cif; ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ areg = 0; ++ ++ int rtype = cif->rtype->type; ++ if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4) ++ { ++ rvalue = *values; ++ areg++; ++ } ++ ++ cif = closure->cif; ++ arg_types = cif->arg_types; ++ avalue = alloca(cif->nargs * sizeof(void *)); ++ ++ for (i = 0; i < cif->nargs; i++) ++ { ++ if (arg_types[i]->alignment == 8 && (areg & 1) != 0) ++ areg++; ++ ++ // skip the entry 16,a1 framework, add 16 bytes (4 registers) ++ if (areg == FFI_REGISTER_NARGS) ++ areg += 4; ++ ++ if (arg_types[i]->type == FFI_TYPE_STRUCT) ++ { ++ int numregs = ((arg_types[i]->size + 3) & ~3) / 4; ++ if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS) ++ areg = FFI_REGISTER_NARGS + 4; ++ } ++ ++ avalue[i] = &values[areg]; ++ areg += (arg_types[i]->size + 3) / 4; ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ return rtype; ++} +diff --git a/js/src/ctypes/libffi/src/xtensa/ffitarget.h b/js/src/ctypes/libffi/src/xtensa/ffitarget.h +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/xtensa/ffitarget.h +@@ -0,0 +1,53 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ffitarget.h - Copyright (c) 2013 Tensilica, Inc. ++ Target configuration macros for XTENSA. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++#ifndef LIBFFI_H ++#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." ++#endif ++ ++#ifndef LIBFFI_ASM ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ FFI_SYSV, ++ FFI_LAST_ABI, ++ FFI_DEFAULT_ABI = FFI_SYSV ++} ffi_abi; ++#endif ++ ++#define FFI_REGISTER_NARGS 6 ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++#define FFI_TRAMPOLINE_SIZE 24 ++ ++#endif +diff --git a/js/src/ctypes/libffi/src/xtensa/sysv.S b/js/src/ctypes/libffi/src/xtensa/sysv.S +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/src/xtensa/sysv.S +@@ -0,0 +1,253 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2013 Tensilica, Inc. ++ ++ XTENSA Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, ++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#define ENTRY(name) .text; .globl name; .type name,@function; .align 4; name: ++#define END(name) .size name , . - name ++ ++/* Assert that the table below is in sync with ffi.h. */ ++ ++#if FFI_TYPE_UINT8 != 5 \ ++ || FFI_TYPE_SINT8 != 6 \ ++ || FFI_TYPE_UINT16 != 7 \ ++ || FFI_TYPE_SINT16 != 8 \ ++ || FFI_TYPE_UINT32 != 9 \ ++ || FFI_TYPE_SINT32 != 10 \ ++ || FFI_TYPE_UINT64 != 11 ++#error "xtensa/sysv.S out of sync with ffi.h" ++#endif ++ ++ ++/* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif) ++ void *rvalue; a2 ++ unsigned long rbytes; a3 ++ unsigned flags; a4 ++ void (*fnaddr)(); a5 ++ unsigned long bytes; a6 ++ extended_cif* ecif) a7 ++*/ ++ ++ENTRY(ffi_call_SYSV) ++ ++ entry a1, 32 # 32 byte frame for using call8 below ++ ++ mov a10, a7 # a10(->arg0): ecif ++ sub a11, a1, a6 # a11(->arg1): stack pointer ++ mov a7, a1 # fp ++ movsp a1, a11 # set new sp = old_sp - bytes ++ ++ movi a8, ffi_prep_args ++ callx8 a8 # ffi_prep_args(ecif, stack) ++ ++ # prepare to move stack pointer back up to 6 arguments ++ # note that 'bytes' is already aligned ++ ++ movi a10, 6*4 ++ sub a11, a6, a10 ++ movgez a6, a10, a11 ++ add a6, a1, a6 ++ ++ ++ # we can pass up to 6 arguments in registers ++ # for simplicity, just load 6 arguments ++ # (the stack size is at least 32 bytes, so no risk to cross boundaries) ++ ++ l32i a10, a1, 0 ++ l32i a11, a1, 4 ++ l32i a12, a1, 8 ++ l32i a13, a1, 12 ++ l32i a14, a1, 16 ++ l32i a15, a1, 20 ++ ++ # move stack pointer ++ ++ movsp a1, a6 ++ ++ callx8 a5 # (*fn)(args...) ++ ++ # Handle return value(s) ++ ++ beqz a2, .Lexit ++ ++ movi a5, FFI_TYPE_STRUCT ++ bne a4, a5, .Lstore ++ movi a5, 16 ++ blt a5, a3, .Lexit ++ ++ s32i a10, a2, 0 ++ blti a3, 5, .Lexit ++ addi a3, a3, -1 ++ s32i a11, a2, 4 ++ blti a3, 8, .Lexit ++ s32i a12, a2, 8 ++ blti a3, 12, .Lexit ++ s32i a13, a2, 12 ++ ++.Lexit: retw ++ ++.Lstore: ++ addi a4, a4, -FFI_TYPE_UINT8 ++ bgei a4, 7, .Lexit # should never happen ++ movi a6, store_calls ++ add a4, a4, a4 ++ addx4 a6, a4, a6 # store_table + idx * 8 ++ jx a6 ++ ++ .align 8 ++store_calls: ++ # UINT8 ++ s8i a10, a2, 0 ++ retw ++ ++ # SINT8 ++ .align 8 ++ s8i a10, a2, 0 ++ retw ++ ++ # UINT16 ++ .align 8 ++ s16i a10, a2, 0 ++ retw ++ ++ # SINT16 ++ .align 8 ++ s16i a10, a2, 0 ++ retw ++ ++ # UINT32 ++ .align 8 ++ s32i a10, a2, 0 ++ retw ++ ++ # SINT32 ++ .align 8 ++ s32i a10, a2, 0 ++ retw ++ ++ # UINT64 ++ .align 8 ++ s32i a10, a2, 0 ++ s32i a11, a2, 4 ++ retw ++ ++END(ffi_call_SYSV) ++ ++ ++/* ++ * void ffi_cacheflush (unsigned long start, unsigned long end) ++ */ ++ ++#define EXTRA_ARGS_SIZE 24 ++ ++ENTRY(ffi_cacheflush) ++ ++ entry a1, 16 ++ ++1: dhwbi a2, 0 ++ ihi a2, 0 ++ addi a2, a2, 4 ++ blt a2, a3, 1b ++ ++ retw ++ ++END(ffi_cacheflush) ++ ++/* ffi_trampoline is copied to the stack */ ++ ++ENTRY(ffi_trampoline) ++ ++ entry a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4) # [ 0] ++ j 2f # [ 3] ++ .align 4 # [ 6] ++1: .long 0 # [ 8] ++2: l32r a15, 1b # [12] ++ _mov a14, a0 # [15] ++ callx0 a15 # [18] ++ # [21] ++END(ffi_trampoline) ++ ++/* ++ * ffi_closure() ++ * ++ * a0: closure + 21 ++ * a14: return address (a0) ++ */ ++ ++ENTRY(ffi_closure_SYSV) ++ ++ /* intentionally omitting entry here */ ++ ++ # restore return address (a0) and move pointer to closure to a10 ++ addi a10, a0, -21 ++ mov a0, a14 ++ ++ # allow up to 4 arguments as return values ++ addi a11, a1, 4 * 4 ++ ++ # save up to 6 arguments to stack (allocated by entry below) ++ s32i a2, a11, 0 ++ s32i a3, a11, 4 ++ s32i a4, a11, 8 ++ s32i a5, a11, 12 ++ s32i a6, a11, 16 ++ s32i a7, a11, 20 ++ ++ movi a8, ffi_closure_SYSV_inner ++ mov a12, a1 ++ callx8 a8 # .._inner(*closure, **avalue, *rvalue) ++ ++ # load up to four return arguments ++ l32i a2, a1, 0 ++ l32i a3, a1, 4 ++ l32i a4, a1, 8 ++ l32i a5, a1, 12 ++ ++ # (sign-)extend return value ++ movi a11, FFI_TYPE_UINT8 ++ bne a10, a11, 1f ++ extui a2, a2, 0, 8 ++ retw ++ ++1: movi a11, FFI_TYPE_SINT8 ++ bne a10, a11, 1f ++ sext a2, a2, 7 ++ retw ++ ++1: movi a11, FFI_TYPE_UINT16 ++ bne a10, a11, 1f ++ extui a2, a2, 0, 16 ++ retw ++ ++1: movi a11, FFI_TYPE_SINT16 ++ bne a10, a11, 1f ++ sext a2, a2, 15 ++ ++1: retw ++ ++END(ffi_closure_SYSV) +diff --git a/js/src/ctypes/libffi/stamp-h.in b/js/src/ctypes/libffi/stamp-h.in +deleted file mode 100644 +--- a/js/src/ctypes/libffi/stamp-h.in ++++ /dev/null +@@ -1,1 +0,0 @@ +-timestamp +diff --git a/js/src/ctypes/libffi/testsuite/Makefile.am b/js/src/ctypes/libffi/testsuite/Makefile.am +--- a/js/src/ctypes/libffi/testsuite/Makefile.am ++++ b/js/src/ctypes/libffi/testsuite/Makefile.am +@@ -8,73 +8,89 @@ EXPECT = `if [ -f $(top_builddir)/../exp + else echo expect ; fi` + + RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \ + echo $(top_srcdir)/../dejagnu/runtest ; \ + else echo runtest; fi` + + AM_RUNTESTFLAGS = + ++EXTRA_DEJAGNU_SITE_CONFIG=../local.exp ++ + CLEANFILES = *.exe core* *.log *.sum + +-EXTRA_DIST = libffi.special/special.exp \ +-libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \ +-libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \ +-lib/libffi-dg.exp lib/wrapper.exp libffi.call/float.c \ +-libffi.call/cls_multi_schar.c libffi.call/float3.c \ +-libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \ +-libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \ +-libffi.call/promotion.c libffi.call/cls_dbls_struct.c \ +-libffi.call/nested_struct.c libffi.call/closure_fn1.c \ +-libffi.call/cls_4_1byte.c libffi.call/cls_float.c \ +-libffi.call/cls_2byte.c libffi.call/closure_fn4.c \ +-libffi.call/return_fl2.c libffi.call/nested_struct7.c \ +-libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \ +-libffi.call/float1.c libffi.call/cls_19byte.c \ +-libffi.call/nested_struct1.c libffi.call/cls_4byte.c \ +-libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \ +-libffi.call/nested_struct4.c libffi.call/nested_struct3.c \ +-libffi.call/struct7.c libffi.call/nested_struct9.c \ +-libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \ +-libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \ +-libffi.call/testclosure.c libffi.call/cls_3byte1.c \ +-libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \ +-libffi.call/cls_ushort.c libffi.call/stret_medium2.c \ +-libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \ +-libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \ +-libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c \ +-libffi.call/return_ll.c libffi.call/cls_pointer.c \ +-libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \ +-libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c \ +-libffi.call/return_sl.c libffi.call/cls_1_1byte.c \ +-libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \ +-libffi.call/cls_double.c libffi.call/many_win32.c \ +-libffi.call/cls_16byte.c libffi.call/cls_align_double.c \ +-libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c \ +-libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \ +-libffi.call/closure_stdcall.c libffi.call/return_fl.c \ +-libffi.call/strlen_win32.c libffi.call/return_ldl.c \ +-libffi.call/cls_align_float.c libffi.call/struct3.c \ +-libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \ +-libffi.call/cls_align_longdouble_split.c \ +-libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \ +-libffi.call/stret_large.c libffi.call/cls_align_sint16.c \ +-libffi.call/nested_struct6.c libffi.call/cls_5byte.c \ +-libffi.call/return_dbl.c libffi.call/cls_20byte.c \ +-libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c \ +-libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \ +-libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \ +-libffi.call/cls_18byte.c libffi.call/closure_fn3.c \ +-libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c \ +-libffi.call/struct2.c libffi.call/cls_3byte2.c \ +-libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \ +-libffi.call/return_fl3.c libffi.call/cls_align_uint32.c \ +-libffi.call/problem1.c libffi.call/float4.c \ +-libffi.call/cls_align_uint64.c libffi.call/struct9.c \ +-libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \ +-libffi.call/closure_fn0.c libffi.call/closure_fn6.c \ +-libffi.call/struct4.c libffi.call/nested_struct2.c \ +-libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \ +-libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \ +-libffi.call/cls_12byte.c libffi.call/cls_double_va.c \ +-libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \ +-libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ +-libffi.call/huge_struct.c ++EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \ ++libffi.call/cls_align_longdouble_split.c \ ++libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c \ ++libffi.call/closure_fn1.c \ ++libffi.call/return_ul.c libffi.call/cls_align_double.c \ ++libffi.call/return_fl2.c libffi.call/cls_1_1byte.c \ ++libffi.call/cls_64byte.c libffi.call/nested_struct7.c \ ++libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c \ ++libffi.call/ffitest.h libffi.call/nested_struct4.c \ ++libffi.call/cls_multi_ushort.c libffi.call/struct3.c \ ++libffi.call/cls_3byte1.c libffi.call/cls_16byte.c \ ++libffi.call/struct8.c libffi.call/nested_struct8.c \ ++libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c \ ++libffi.call/cls_pointer.c \ ++libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ ++libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c \ ++libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c \ ++libffi.call/call.exp libffi.call/cls_double.c \ ++libffi.call/cls_align_sint16.c libffi.call/cls_uint.c \ ++libffi.call/return_ll1.c libffi.call/nested_struct3.c \ ++libffi.call/cls_20byte1.c libffi.call/closure_fn4.c \ ++libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c \ ++libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c \ ++libffi.call/return_fl.c libffi.call/struct5.c \ ++libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c \ ++libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \ ++libffi.call/return_fl3.c libffi.call/stret_medium.c \ ++libffi.call/nested_struct6.c libffi.call/closure_fn3.c \ ++libffi.call/float3.c libffi.call/many2.c \ ++libffi.call/closure_stdcall.c libffi.call/cls_align_uint16.c \ ++libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \ ++libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \ ++libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \ ++libffi.call/cls_sshort.c \ ++libffi.call/nested_struct.c libffi.call/cls_20byte.c \ ++libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \ ++libffi.call/return_uc.c libffi.call/closure_thiscall.c \ ++libffi.call/cls_18byte.c libffi.call/cls_8byte.c \ ++libffi.call/promotion.c \ ++libffi.call/return_dbl.c libffi.call/cls_24byte.c \ ++libffi.call/struct4.c libffi.call/cls_6byte.c \ ++libffi.call/cls_align_uint32.c libffi.call/float.c \ ++libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \ ++libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \ ++libffi.call/cls_align_float.c libffi.call/return_fl1.c \ ++libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ ++libffi.call/cls_align_sint64.c \ ++libffi.call/stret_large2.c libffi.call/return_sl.c \ ++libffi.call/closure_fn0.c libffi.call/cls_5byte.c \ ++libffi.call/cls_2byte.c libffi.call/float2.c \ ++libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \ ++libffi.call/stret_large.c libffi.call/cls_ulonglong.c \ ++libffi.call/cls_ushort.c libffi.call/nested_struct1.c \ ++libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \ ++libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \ ++libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \ ++libffi.call/struct1.c libffi.call/nested_struct9.c \ ++libffi.call/huge_struct.c libffi.call/problem1.c \ ++libffi.call/float4.c \ ++libffi.call/return_ldl.c \ ++libffi.call/closure_fn5.c \ ++libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c \ ++libffi.call/return_sc.c libffi.call/struct7.c \ ++libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c \ ++libffi.call/cls_6_1_byte.c \ ++libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc \ ++libffi.call/unwindtest_ffi_call.cc \ ++lib/wrapper.exp lib/target-libpath.exp \ ++lib/libffi.exp libffi.call/cls_struct_va1.c \ ++libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c \ ++libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c \ ++libffi.call/nested_struct11.c libffi.call/uninitialized.c \ ++libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c \ ++libffi.call/va_struct3.c \ ++libffi.call/strlen2.c \ ++libffi.call/strlen3.c \ ++libffi.call/strlen4.c +diff --git a/js/src/ctypes/libffi/testsuite/Makefile.in b/js/src/ctypes/libffi/testsuite/Makefile.in +--- a/js/src/ctypes/libffi/testsuite/Makefile.in ++++ b/js/src/ctypes/libffi/testsuite/Makefile.in +@@ -1,25 +1,69 @@ +-# Makefile.in generated by automake 1.11.1 from Makefile.am. ++# Makefile.in generated by automake 1.13.4 from Makefile.am. + # @configure_input@ + +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +-# Inc. ++# Copyright (C) 1994-2013 Free Software Foundation, Inc. ++ + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY, to the extent permitted by law; without + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + + @SET_MAKE@ + VPATH = @srcdir@ ++am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' ++am__make_running_with_option = \ ++ case $${target_option-} in \ ++ ?) ;; \ ++ *) echo "am__make_running_with_option: internal error: invalid" \ ++ "target option '$${target_option-}' specified" >&2; \ ++ exit 1;; \ ++ esac; \ ++ has_opt=no; \ ++ sane_makeflags=$$MAKEFLAGS; \ ++ if $(am__is_gnu_make); then \ ++ sane_makeflags=$$MFLAGS; \ ++ else \ ++ case $$MAKEFLAGS in \ ++ *\\[\ \ ]*) \ ++ bs=\\; \ ++ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ ++ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ ++ esac; \ ++ fi; \ ++ skip_next=no; \ ++ strip_trailopt () \ ++ { \ ++ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ ++ }; \ ++ for flg in $$sane_makeflags; do \ ++ test $$skip_next = yes && { skip_next=no; continue; }; \ ++ case $$flg in \ ++ *=*|--*) continue;; \ ++ -*I) strip_trailopt 'I'; skip_next=yes;; \ ++ -*I?*) strip_trailopt 'I';; \ ++ -*O) strip_trailopt 'O'; skip_next=yes;; \ ++ -*O?*) strip_trailopt 'O';; \ ++ -*l) strip_trailopt 'l'; skip_next=yes;; \ ++ -*l?*) strip_trailopt 'l';; \ ++ -[dEDm]) skip_next=yes;; \ ++ -[JT]) skip_next=yes;; \ ++ esac; \ ++ case $$flg in \ ++ *$$target_option*) has_opt=yes; break;; \ ++ esac; \ ++ done; \ ++ test $$has_opt = yes ++am__make_dryrun = (target_option=n; $(am__make_running_with_option)) ++am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) + pkgdatadir = $(datadir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkglibexecdir = $(libexecdir)/@PACKAGE@ + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +@@ -30,34 +74,65 @@ PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ + target_triplet = @target@ + subdir = testsuite +-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ++DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ ++am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ ++ $(top_srcdir)/m4/ax_append_flag.m4 \ ++ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ ++ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ ++ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ ++ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ ++ $(top_srcdir)/m4/ax_configure_args.m4 \ ++ $(top_srcdir)/m4/ax_enable_builddir.m4 \ ++ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ ++ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ ++ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ ++ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ ++ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) + mkinstalldirs = $(install_sh) -d + CONFIG_HEADER = $(top_builddir)/fficonfig.h + CONFIG_CLEAN_FILES = + CONFIG_CLEAN_VPATH_FILES = ++AM_V_P = $(am__v_P_@AM_V@) ++am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) ++am__v_P_0 = false ++am__v_P_1 = : ++AM_V_GEN = $(am__v_GEN_@AM_V@) ++am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) ++am__v_GEN_0 = @echo " GEN " $@; ++am__v_GEN_1 = ++AM_V_at = $(am__v_at_@AM_V@) ++am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) ++am__v_at_0 = @ ++am__v_at_1 = + SOURCES = + DIST_SOURCES = ++am__can_run_installinfo = \ ++ case $$AM_UPDATE_INFO_DIR in \ ++ n|no|NO) false;; \ ++ *) (install-info --version) >/dev/null 2>&1;; \ ++ esac ++am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) + DEJATOOL = $(PACKAGE) + RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + ACLOCAL = @ACLOCAL@ + ALLOCA = @ALLOCA@ + AMTAR = @AMTAR@ ++AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ + AM_LTLDFLAGS = @AM_LTLDFLAGS@ + AM_RUNTESTFLAGS = + AR = @AR@ + AUTOCONF = @AUTOCONF@ + AUTOHEADER = @AUTOHEADER@ + AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ + CC = @CC@ +@@ -66,75 +141,82 @@ CCASDEPMODE = @CCASDEPMODE@ + CCASFLAGS = @CCASFLAGS@ + CCDEPMODE = @CCDEPMODE@ + CFLAGS = @CFLAGS@ + CPP = @CPP@ + CPPFLAGS = @CPPFLAGS@ + CYGPATH_W = @CYGPATH_W@ + DEFS = @DEFS@ + DEPDIR = @DEPDIR@ ++DLLTOOL = @DLLTOOL@ + DSYMUTIL = @DSYMUTIL@ + DUMPBIN = @DUMPBIN@ + ECHO_C = @ECHO_C@ + ECHO_N = @ECHO_N@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + EXEEXT = @EXEEXT@ ++FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ + FGREP = @FGREP@ + GREP = @GREP@ + HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ ++HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ + INSTALL = @INSTALL@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LD = @LD@ + LDFLAGS = @LDFLAGS@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LIPO = @LIPO@ + LN_S = @LN_S@ + LTLIBOBJS = @LTLIBOBJS@ + MAINT = @MAINT@ + MAKEINFO = @MAKEINFO@ ++MANIFEST_TOOL = @MANIFEST_TOOL@ + MKDIR_P = @MKDIR_P@ + NM = @NM@ + NMEDIT = @NMEDIT@ + OBJDUMP = @OBJDUMP@ + OBJEXT = @OBJEXT@ + OTOOL = @OTOOL@ + OTOOL64 = @OTOOL64@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ + PACKAGE_STRING = @PACKAGE_STRING@ + PACKAGE_TARNAME = @PACKAGE_TARNAME@ + PACKAGE_URL = @PACKAGE_URL@ + PACKAGE_VERSION = @PACKAGE_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ ++PRTDIAG = @PRTDIAG@ + RANLIB = @RANLIB@ + SED = @SED@ + SET_MAKE = @SET_MAKE@ + SHELL = @SHELL@ + STRIP = @STRIP@ + TARGET = @TARGET@ + TARGETDIR = @TARGETDIR@ + VERSION = @VERSION@ + abs_builddir = @abs_builddir@ + abs_srcdir = @abs_srcdir@ + abs_top_builddir = @abs_top_builddir@ + abs_top_srcdir = @abs_top_srcdir@ ++ac_ct_AR = @ac_ct_AR@ + ac_ct_CC = @ac_ct_CC@ + ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ + am__include = @am__include@ + am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ + am__tar = @am__tar@ + am__untar = @am__untar@ ++ax_enable_builddir_sed = @ax_enable_builddir_sed@ + bindir = @bindir@ + build = @build@ + build_alias = @build_alias@ + build_cpu = @build_cpu@ + build_os = @build_os@ + build_vendor = @build_vendor@ + builddir = @builddir@ + datadir = @datadir@ +@@ -150,27 +232,27 @@ host_vendor = @host_vendor@ + htmldir = @htmldir@ + includedir = @includedir@ + infodir = @infodir@ + install_sh = @install_sh@ + libdir = @libdir@ + libexecdir = @libexecdir@ + localedir = @localedir@ + localstatedir = @localstatedir@ +-lt_ECHO = @lt_ECHO@ + mandir = @mandir@ + mkdir_p = @mkdir_p@ + oldincludedir = @oldincludedir@ + pdfdir = @pdfdir@ + prefix = @prefix@ + program_transform_name = @program_transform_name@ + psdir = @psdir@ + sbindir = @sbindir@ + sharedstatedir = @sharedstatedir@ + srcdir = @srcdir@ ++sys_symbol_underscore = @sys_symbol_underscore@ + sysconfdir = @sysconfdir@ + target = @target@ + target_alias = @target_alias@ + target_cpu = @target_cpu@ + target_os = @target_os@ + target_vendor = @target_vendor@ + toolexecdir = @toolexecdir@ + toolexeclibdir = @toolexeclibdir@ +@@ -183,80 +265,95 @@ AUTOMAKE_OPTIONS = foreign dejagnu + EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \ + echo $(top_builddir)/../expect/expect ; \ + else echo expect ; fi` + + RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \ + echo $(top_srcdir)/../dejagnu/runtest ; \ + else echo runtest; fi` + ++EXTRA_DEJAGNU_SITE_CONFIG = ../local.exp + CLEANFILES = *.exe core* *.log *.sum +-EXTRA_DIST = libffi.special/special.exp \ +-libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \ +-libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \ +-lib/libffi-dg.exp lib/wrapper.exp libffi.call/float.c \ +-libffi.call/cls_multi_schar.c libffi.call/float3.c \ +-libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \ +-libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \ +-libffi.call/promotion.c libffi.call/cls_dbls_struct.c \ +-libffi.call/nested_struct.c libffi.call/closure_fn1.c \ +-libffi.call/cls_4_1byte.c libffi.call/cls_float.c \ +-libffi.call/cls_2byte.c libffi.call/closure_fn4.c \ +-libffi.call/return_fl2.c libffi.call/nested_struct7.c \ +-libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \ +-libffi.call/float1.c libffi.call/cls_19byte.c \ +-libffi.call/nested_struct1.c libffi.call/cls_4byte.c \ +-libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \ +-libffi.call/nested_struct4.c libffi.call/nested_struct3.c \ +-libffi.call/struct7.c libffi.call/nested_struct9.c \ +-libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \ +-libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \ +-libffi.call/testclosure.c libffi.call/cls_3byte1.c \ +-libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \ +-libffi.call/cls_ushort.c libffi.call/stret_medium2.c \ +-libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \ +-libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \ +-libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c \ +-libffi.call/return_ll.c libffi.call/cls_pointer.c \ +-libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \ +-libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c \ +-libffi.call/return_sl.c libffi.call/cls_1_1byte.c \ +-libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \ +-libffi.call/cls_double.c libffi.call/many_win32.c \ +-libffi.call/cls_16byte.c libffi.call/cls_align_double.c \ +-libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c \ +-libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \ +-libffi.call/closure_stdcall.c libffi.call/return_fl.c \ +-libffi.call/strlen_win32.c libffi.call/return_ldl.c \ +-libffi.call/cls_align_float.c libffi.call/struct3.c \ +-libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \ +-libffi.call/cls_align_longdouble_split.c \ +-libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \ +-libffi.call/stret_large.c libffi.call/cls_align_sint16.c \ +-libffi.call/nested_struct6.c libffi.call/cls_5byte.c \ +-libffi.call/return_dbl.c libffi.call/cls_20byte.c \ +-libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c \ +-libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \ +-libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \ +-libffi.call/cls_18byte.c libffi.call/closure_fn3.c \ +-libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c \ +-libffi.call/struct2.c libffi.call/cls_3byte2.c \ +-libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \ +-libffi.call/return_fl3.c libffi.call/cls_align_uint32.c \ +-libffi.call/problem1.c libffi.call/float4.c \ +-libffi.call/cls_align_uint64.c libffi.call/struct9.c \ +-libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \ +-libffi.call/closure_fn0.c libffi.call/closure_fn6.c \ +-libffi.call/struct4.c libffi.call/nested_struct2.c \ +-libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \ +-libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \ +-libffi.call/cls_12byte.c libffi.call/cls_double_va.c \ +-libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \ +-libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ +-libffi.call/huge_struct.c ++EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \ ++libffi.call/cls_align_longdouble_split.c \ ++libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c \ ++libffi.call/closure_fn1.c \ ++libffi.call/return_ul.c libffi.call/cls_align_double.c \ ++libffi.call/return_fl2.c libffi.call/cls_1_1byte.c \ ++libffi.call/cls_64byte.c libffi.call/nested_struct7.c \ ++libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c \ ++libffi.call/ffitest.h libffi.call/nested_struct4.c \ ++libffi.call/cls_multi_ushort.c libffi.call/struct3.c \ ++libffi.call/cls_3byte1.c libffi.call/cls_16byte.c \ ++libffi.call/struct8.c libffi.call/nested_struct8.c \ ++libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c \ ++libffi.call/cls_pointer.c \ ++libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ ++libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c \ ++libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c \ ++libffi.call/call.exp libffi.call/cls_double.c \ ++libffi.call/cls_align_sint16.c libffi.call/cls_uint.c \ ++libffi.call/return_ll1.c libffi.call/nested_struct3.c \ ++libffi.call/cls_20byte1.c libffi.call/closure_fn4.c \ ++libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c \ ++libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c \ ++libffi.call/return_fl.c libffi.call/struct5.c \ ++libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c \ ++libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \ ++libffi.call/return_fl3.c libffi.call/stret_medium.c \ ++libffi.call/nested_struct6.c libffi.call/closure_fn3.c \ ++libffi.call/float3.c libffi.call/many2.c \ ++libffi.call/closure_stdcall.c libffi.call/cls_align_uint16.c \ ++libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \ ++libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \ ++libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \ ++libffi.call/cls_sshort.c \ ++libffi.call/nested_struct.c libffi.call/cls_20byte.c \ ++libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \ ++libffi.call/return_uc.c libffi.call/closure_thiscall.c \ ++libffi.call/cls_18byte.c libffi.call/cls_8byte.c \ ++libffi.call/promotion.c \ ++libffi.call/return_dbl.c libffi.call/cls_24byte.c \ ++libffi.call/struct4.c libffi.call/cls_6byte.c \ ++libffi.call/cls_align_uint32.c libffi.call/float.c \ ++libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \ ++libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \ ++libffi.call/cls_align_float.c libffi.call/return_fl1.c \ ++libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ ++libffi.call/cls_align_sint64.c \ ++libffi.call/stret_large2.c libffi.call/return_sl.c \ ++libffi.call/closure_fn0.c libffi.call/cls_5byte.c \ ++libffi.call/cls_2byte.c libffi.call/float2.c \ ++libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \ ++libffi.call/stret_large.c libffi.call/cls_ulonglong.c \ ++libffi.call/cls_ushort.c libffi.call/nested_struct1.c \ ++libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \ ++libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \ ++libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \ ++libffi.call/struct1.c libffi.call/nested_struct9.c \ ++libffi.call/huge_struct.c libffi.call/problem1.c \ ++libffi.call/float4.c \ ++libffi.call/return_ldl.c \ ++libffi.call/closure_fn5.c \ ++libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c \ ++libffi.call/return_sc.c libffi.call/struct7.c \ ++libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c \ ++libffi.call/cls_6_1_byte.c \ ++libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc \ ++libffi.call/unwindtest_ffi_call.cc \ ++lib/wrapper.exp lib/target-libpath.exp \ ++lib/libffi.exp libffi.call/cls_struct_va1.c \ ++libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c \ ++libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c \ ++libffi.call/nested_struct11.c libffi.call/uninitialized.c \ ++libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c \ ++libffi.call/va_struct3.c \ ++libffi.call/strlen2.c \ ++libffi.call/strlen3.c \ ++libffi.call/strlen4.c + + all: all-am + + .SUFFIXES: + $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ +@@ -287,51 +384,57 @@ Makefile: $(srcdir)/Makefile.in $(top_bu + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + $(am__aclocal_m4_deps): + + mostlyclean-libtool: + -rm -f *.lo + + clean-libtool: + -rm -rf .libs _libs +-tags: TAGS +-TAGS: ++tags TAGS: + +-ctags: CTAGS +-CTAGS: ++ctags CTAGS: ++ ++cscope cscopelist: + + + check-DEJAGNU: site.exp +- srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ ++ srcdir='$(srcdir)'; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ +- runtest=$(RUNTEST); \ +- if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ ++ if $(SHELL) -c "$(RUNTEST) --version" > /dev/null 2>&1; then \ + exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ +- if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ ++ if $(RUNTEST) $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + then :; else exit_status=1; fi; \ + done; \ +- else echo "WARNING: could not find \`runtest'" 1>&2; :;\ ++ else echo "WARNING: could not find '$(RUNTEST)'" 1>&2; :;\ + fi; \ + exit $$exit_status +-site.exp: Makefile +- @echo 'Making a new site.exp file...' ++site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG) ++ @echo 'Making a new site.exp file ...' + @echo '## these variables are automatically generated by make ##' >site.tmp + @echo '# Do not edit here. If you wish to override these values' >>site.tmp + @echo '# edit the last section' >>site.tmp +- @echo 'set srcdir $(srcdir)' >>site.tmp ++ @echo 'set srcdir "$(srcdir)"' >>site.tmp + @echo "set objdir `pwd`" >>site.tmp + @echo 'set build_alias "$(build_alias)"' >>site.tmp + @echo 'set build_triplet $(build_triplet)' >>site.tmp + @echo 'set host_alias "$(host_alias)"' >>site.tmp + @echo 'set host_triplet $(host_triplet)' >>site.tmp + @echo 'set target_alias "$(target_alias)"' >>site.tmp + @echo 'set target_triplet $(target_triplet)' >>site.tmp +- @echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp +- @test ! -f site.exp || \ +- sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp ++ @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \ ++ echo "## Begin content included from file $$f. Do not modify. ##" \ ++ && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \ ++ && echo "## End content included from file $$f. ##" \ ++ || exit 1; \ ++ done >> site.tmp ++ @echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp ++ @if test -f site.exp; then \ ++ sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \ ++ fi + @-rm -f site.bak + @test ! -f site.exp || mv site.exp site.bak + @mv site.tmp site.exp + + distclean-DEJAGNU: + -rm -f site.exp site.bak + -l='$(DEJATOOL)'; for tool in $$l; do \ + rm -f $$tool.sum $$tool.log; \ +@@ -377,20 +480,25 @@ install-exec: install-exec-am + install-data: install-data-am + uninstall: uninstall-am + + install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + + installcheck: installcheck-am + install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++ if test -z '$(STRIP)'; then \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ install; \ ++ else \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ ++ fi + mostlyclean-generic: + + clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + + distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) +@@ -462,23 +570,24 @@ ps: ps-am + + ps-am: + + uninstall-am: + + .MAKE: check-am install-am install-strip + + .PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ +- clean-libtool distclean distclean-DEJAGNU distclean-generic \ +- distclean-libtool distdir dvi dvi-am html html-am info info-am \ +- install install-am install-data install-data-am install-dvi \ +- install-dvi-am install-exec install-exec-am install-html \ +- install-html-am install-info install-info-am install-man \ +- install-pdf install-pdf-am install-ps install-ps-am \ +- install-strip installcheck installcheck-am installdirs \ +- maintainer-clean maintainer-clean-generic mostlyclean \ +- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- uninstall uninstall-am ++ clean-libtool cscopelist-am ctags-am distclean \ ++ distclean-DEJAGNU distclean-generic distclean-libtool distdir \ ++ dvi dvi-am html html-am info info-am install install-am \ ++ install-data install-data-am install-dvi install-dvi-am \ ++ install-exec install-exec-am install-html install-html-am \ ++ install-info install-info-am install-man install-pdf \ ++ install-pdf-am install-ps install-ps-am install-strip \ ++ installcheck installcheck-am installdirs maintainer-clean \ ++ maintainer-clean-generic mostlyclean mostlyclean-generic \ ++ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ ++ uninstall-am + + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: +diff --git a/js/src/ctypes/libffi/testsuite/lib/libffi-dg.exp b/js/src/ctypes/libffi/testsuite/lib/libffi-dg.exp +deleted file mode 100644 +--- a/js/src/ctypes/libffi/testsuite/lib/libffi-dg.exp ++++ /dev/null +@@ -1,350 +0,0 @@ +-# Copyright (C) 2003, 2005, 2008, 2009, 2010 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 3 of the License, or +-# (at your option) any later version. +-# +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +- +-proc load_gcc_lib { filename } { +- global srcdir +- load_file $srcdir/lib/$filename +-} +- +-load_lib dg.exp +-load_lib libgloss.exp +-load_gcc_lib target-libpath.exp +-load_gcc_lib wrapper.exp +- +- +-# Define libffi callbacks for dg.exp. +- +-proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { +- +- # To get all \n in dg-output test strings to match printf output +- # in a system that outputs it as \015\012 (i.e. not just \012), we +- # need to change all \n into \r?\n. As there is no dejagnu flag +- # or hook to do that, we simply change the text being tested. +- # Unfortunately, we have to know that the variable is called +- # dg-output-text and lives in the caller of libffi-dg-test, which +- # is two calls up. Overriding proc dg-output would be longer and +- # would necessarily have the same assumption. +- upvar 2 dg-output-text output_match +- +- if { [llength $output_match] > 1 } { +- regsub -all "\n" [lindex $output_match 1] "\r?\n" x +- set output_match [lreplace $output_match 1 1 $x] +- } +- +- # Set up the compiler flags, based on what we're going to do. +- +- set options [list] +- switch $do_what { +- "compile" { +- set compile_type "assembly" +- set output_file "[file rootname [file tail $prog]].s" +- } +- "link" { +- set compile_type "executable" +- set output_file "[file rootname [file tail $prog]].exe" +- # The following line is needed for targets like the i960 where +- # the default output file is b.out. Sigh. +- } +- "run" { +- set compile_type "executable" +- # FIXME: "./" is to cope with "." not being in $PATH. +- # Should this be handled elsewhere? +- # YES. +- set output_file "./[file rootname [file tail $prog]].exe" +- # This is the only place where we care if an executable was +- # created or not. If it was, dg.exp will try to run it. +- remote_file build delete $output_file; +- } +- default { +- perror "$do_what: not a valid dg-do keyword" +- return "" +- } +- } +- +- if { $extra_tool_flags != "" } { +- lappend options "additional_flags=$extra_tool_flags" +- } +- +- set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; +- +- +- return [list $comp_output $output_file] +-} +- +- +-proc libffi-dg-test { prog do_what extra_tool_flags } { +- return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] +-} +- +-proc libffi-init { args } { +- global gluefile wrap_flags; +- global srcdir +- global blddirffi +- global objdir +- global TOOL_OPTIONS +- global tool +- global libffi_include +- global libffi_link_flags +- global tool_root_dir +- global ld_library_path +- +- set blddirffi [pwd]/.. +- verbose "libffi $blddirffi" +- +- set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] +- if {$gccdir != ""} { +- set gccdir [file dirname $gccdir] +- } +- verbose "gccdir $gccdir" +- +- set ld_library_path "." +- append ld_library_path ":${gccdir}" +- +- set compiler "${gccdir}/xgcc" +- if { [is_remote host] == 0 && [which $compiler] != 0 } { +- foreach i "[exec $compiler --print-multi-lib]" { +- set mldir "" +- regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir +- set mldir [string trimright $mldir "\;@"] +- if { "$mldir" == "." } { +- continue +- } +- if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { +- append ld_library_path ":${gccdir}/${mldir}" +- } +- } +- } +- # add the library path for libffi. +- append ld_library_path ":${blddirffi}/.libs" +- +- verbose "ld_library_path: $ld_library_path" +- +- # Point to the Libffi headers in libffi. +- set libffi_include "${blddirffi}/include" +- verbose "libffi_include $libffi_include" +- +- set libffi_dir "${blddirffi}/.libs" +- verbose "libffi_dir $libffi_dir" +- if { $libffi_dir != "" } { +- set libffi_dir [file dirname ${libffi_dir}] +- set libffi_link_flags "-L${libffi_dir}/.libs" +- } +- +- set_ld_library_path_env_vars +- libffi_maybe_build_wrapper "${objdir}/testglue.o" +-} +- +-proc libffi_exit { } { +- global gluefile; +- +- if [info exists gluefile] { +- file_on_build delete $gluefile; +- unset gluefile; +- } +-} +- +-proc libffi_target_compile { source dest type options } { +- global gluefile wrap_flags; +- global srcdir +- global blddirffi +- global TOOL_OPTIONS +- global libffi_link_flags +- global libffi_include +- global target_triplet +- +- +- if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { +- lappend options "libs=${gluefile}" +- lappend options "ldflags=$wrap_flags" +- } +- +- # TOOL_OPTIONS must come first, so that it doesn't override testcase +- # specific options. +- if [info exists TOOL_OPTIONS] { +- lappend options [concat "additional_flags=$TOOL_OPTIONS" $options]; +- } +- +- # search for ffi_mips.h in srcdir, too +- lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." +- lappend options "additional_flags=${libffi_link_flags}" +- +- # Darwin needs a stack execution allowed flag. +- +- if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] +- || [istarget "*-*-darwin2*"] } { +- lappend options "additional_flags=-Wl,-allow_stack_execute" +- } +- +- # If you're building the compiler with --prefix set to a place +- # where it's not yet installed, then the linker won't be able to +- # find the libgcc used by libffi.dylib. We could pass the +- # -dylib_file option, but that's complicated, and it's much easier +- # to just make the linker find libgcc using -L options. +- if { [string match "*-*-darwin*" $target_triplet] } { +- lappend options "libs= -shared-libgcc" +- } +- +- if { [string match "*-*-openbsd*" $target_triplet] } { +- lappend options "libs= -lpthread" +- } +- +- lappend options "libs= -lffi" +- +- verbose "options: $options" +- return [target_compile $source $dest $type $options] +-} +- +-# Utility routines. +- +-# +-# search_for -- looks for a string match in a file +-# +-proc search_for { file pattern } { +- set fd [open $file r] +- while { [gets $fd cur_line]>=0 } { +- if [string match "*$pattern*" $cur_line] then { +- close $fd +- return 1 +- } +- } +- close $fd +- return 0 +-} +- +-# Modified dg-runtest that can cycle through a list of optimization options +-# as c-torture does. +-proc libffi-dg-runtest { testcases default-extra-flags } { +- global runtests +- +- foreach test $testcases { +- # If we're only testing specific files and this isn't one of +- # them, skip it. +- if ![runtest_file_p $runtests $test] { +- continue +- } +- +- # Look for a loop within the source code - if we don't find one, +- # don't pass -funroll[-all]-loops. +- global torture_with_loops torture_without_loops +- if [expr [search_for $test "for*("]+[search_for $test "while*("]] { +- set option_list $torture_with_loops +- } else { +- set option_list $torture_without_loops +- } +- +- set nshort [file tail [file dirname $test]]/[file tail $test] +- +- foreach flags $option_list { +- verbose "Testing $nshort, $flags" 1 +- dg-test $test $flags ${default-extra-flags} +- } +- } +-} +- +- +-# Like check_conditional_xfail, but callable from a dg test. +- +-proc dg-xfail-if { args } { +- set args [lreplace $args 0 0] +- set selector "target [join [lindex $args 1]]" +- if { [dg-process-target $selector] == "S" } { +- global compiler_conditional_xfail_data +- set compiler_conditional_xfail_data $args +- } +-} +- +-proc check-flags { args } { +- +- # The args are within another list; pull them out. +- set args [lindex $args 0] +- +- # The next two arguments are optional. If they were not specified, +- # use the defaults. +- if { [llength $args] == 2 } { +- lappend $args [list "*"] +- } +- if { [llength $args] == 3 } { +- lappend $args [list ""] +- } +- +- # If the option strings are the defaults, or the same as the +- # defaults, there is no need to call check_conditional_xfail to +- # compare them to the actual options. +- if { [string compare [lindex $args 2] "*"] == 0 +- && [string compare [lindex $args 3] "" ] == 0 } { +- set result 1 +- } else { +- # The target list might be an effective-target keyword, so replace +- # the original list with "*-*-*", since we already know it matches. +- set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] +- } +- +- return $result +-} +- +-proc dg-skip-if { args } { +- # Verify the number of arguments. The last two are optional. +- set args [lreplace $args 0 0] +- if { [llength $args] < 2 || [llength $args] > 4 } { +- error "dg-skip-if 2: need 2, 3, or 4 arguments" +- } +- +- # Don't bother if we're already skipping the test. +- upvar dg-do-what dg-do-what +- if { [lindex ${dg-do-what} 1] == "N" } { +- return +- } +- +- set selector [list target [lindex $args 1]] +- if { [dg-process-target $selector] == "S" } { +- if [check-flags $args] { +- upvar dg-do-what dg-do-what +- set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] +- } +- } +-} +- +-# We need to make sure that additional_files and additional_sources +-# are both cleared out after every test. It is not enough to clear +-# them out *before* the next test run because gcc-target-compile gets +-# run directly from some .exp files (outside of any test). (Those +-# uses should eventually be eliminated.) +- +-# Because the DG framework doesn't provide a hook that is run at the +-# end of a test, we must replace dg-test with a wrapper. +- +-if { [info procs saved-dg-test] == [list] } { +- rename dg-test saved-dg-test +- +- proc dg-test { args } { +- global additional_files +- global additional_sources +- global errorInfo +- +- if { [ catch { eval saved-dg-test $args } errmsg ] } { +- set saved_info $errorInfo +- set additional_files "" +- set additional_sources "" +- error $errmsg $saved_info +- } +- set additional_files "" +- set additional_sources "" +- } +-} +- +-# Local Variables: +-# tcl-indent-level:4 +-# End: +diff --git a/js/src/ctypes/libffi/testsuite/lib/libffi.exp b/js/src/ctypes/libffi/testsuite/lib/libffi.exp +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/lib/libffi.exp +@@ -0,0 +1,409 @@ ++# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; see the file COPYING3. If not see ++# . ++ ++proc load_gcc_lib { filename } { ++ global srcdir ++ load_file $srcdir/lib/$filename ++} ++ ++load_lib dg.exp ++load_lib libgloss.exp ++load_gcc_lib target-libpath.exp ++load_gcc_lib wrapper.exp ++ ++ ++# Define libffi callbacks for dg.exp. ++ ++proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { ++ ++ # To get all \n in dg-output test strings to match printf output ++ # in a system that outputs it as \015\012 (i.e. not just \012), we ++ # need to change all \n into \r?\n. As there is no dejagnu flag ++ # or hook to do that, we simply change the text being tested. ++ # Unfortunately, we have to know that the variable is called ++ # dg-output-text and lives in the caller of libffi-dg-test, which ++ # is two calls up. Overriding proc dg-output would be longer and ++ # would necessarily have the same assumption. ++ upvar 2 dg-output-text output_match ++ ++ if { [llength $output_match] > 1 } { ++ regsub -all "\n" [lindex $output_match 1] "\r?\n" x ++ set output_match [lreplace $output_match 1 1 $x] ++ } ++ ++ # Set up the compiler flags, based on what we're going to do. ++ ++ set options [list] ++ switch $do_what { ++ "compile" { ++ set compile_type "assembly" ++ set output_file "[file rootname [file tail $prog]].s" ++ } ++ "link" { ++ set compile_type "executable" ++ set output_file "[file rootname [file tail $prog]].exe" ++ # The following line is needed for targets like the i960 where ++ # the default output file is b.out. Sigh. ++ } ++ "run" { ++ set compile_type "executable" ++ # FIXME: "./" is to cope with "." not being in $PATH. ++ # Should this be handled elsewhere? ++ # YES. ++ set output_file "./[file rootname [file tail $prog]].exe" ++ # This is the only place where we care if an executable was ++ # created or not. If it was, dg.exp will try to run it. ++ remote_file build delete $output_file; ++ } ++ default { ++ perror "$do_what: not a valid dg-do keyword" ++ return "" ++ } ++ } ++ ++ if { $extra_tool_flags != "" } { ++ lappend options "additional_flags=$extra_tool_flags" ++ } ++ ++ set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; ++ ++ ++ return [list $comp_output $output_file] ++} ++ ++ ++proc libffi-dg-test { prog do_what extra_tool_flags } { ++ return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] ++} ++ ++proc libffi-init { args } { ++ global gluefile wrap_flags; ++ global srcdir ++ global blddirffi ++ global objdir ++ global TOOL_OPTIONS ++ global tool ++ global libffi_include ++ global libffi_link_flags ++ global tool_root_dir ++ global ld_library_path ++ ++ global using_gcc ++ ++ set blddirffi [pwd]/.. ++ verbose "libffi $blddirffi" ++ ++ # Are we building with GCC? ++ set tmp [grep ../config.status "GCC='yes'"] ++ if { [string match $tmp "GCC='yes'"] } { ++ ++ set using_gcc "yes" ++ ++ set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] ++ if {$gccdir != ""} { ++ set gccdir [file dirname $gccdir] ++ } ++ verbose "gccdir $gccdir" ++ ++ set ld_library_path "." ++ append ld_library_path ":${gccdir}" ++ ++ set compiler "${gccdir}/xgcc" ++ if { [is_remote host] == 0 && [which $compiler] != 0 } { ++ foreach i "[exec $compiler --print-multi-lib]" { ++ set mldir "" ++ regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir ++ set mldir [string trimright $mldir "\;@"] ++ if { "$mldir" == "." } { ++ continue ++ } ++ if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { ++ append ld_library_path ":${gccdir}/${mldir}" ++ } ++ } ++ } ++ ++ } else { ++ ++ set using_gcc "no" ++ ++ } ++ ++ # add the library path for libffi. ++ append ld_library_path ":${blddirffi}/.libs" ++ ++ verbose "ld_library_path: $ld_library_path" ++ ++ # Point to the Libffi headers in libffi. ++ set libffi_include "${blddirffi}/include" ++ verbose "libffi_include $libffi_include" ++ ++ set libffi_dir "${blddirffi}/.libs" ++ verbose "libffi_dir $libffi_dir" ++ if { $libffi_dir != "" } { ++ set libffi_dir [file dirname ${libffi_dir}] ++ set libffi_link_flags "-L${libffi_dir}/.libs" ++ } ++ ++ set_ld_library_path_env_vars ++ libffi_maybe_build_wrapper "${objdir}/testglue.o" ++} ++ ++proc libffi_exit { } { ++ global gluefile; ++ ++ if [info exists gluefile] { ++ file_on_build delete $gluefile; ++ unset gluefile; ++ } ++} ++ ++proc libffi_target_compile { source dest type options } { ++ global gluefile wrap_flags; ++ global srcdir ++ global blddirffi ++ global TOOL_OPTIONS ++ global libffi_link_flags ++ global libffi_include ++ global target_triplet ++ ++ ++ if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { ++ lappend options "libs=${gluefile}" ++ lappend options "ldflags=$wrap_flags" ++ } ++ ++ # TOOL_OPTIONS must come first, so that it doesn't override testcase ++ # specific options. ++ if [info exists TOOL_OPTIONS] { ++ lappend options [concat "additional_flags=$TOOL_OPTIONS" $options]; ++ } ++ ++ # search for ffi_mips.h in srcdir, too ++ lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." ++ lappend options "additional_flags=${libffi_link_flags}" ++ ++ # Darwin needs a stack execution allowed flag. ++ ++ if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] ++ || [istarget "*-*-darwin2*"] } { ++ lappend options "additional_flags=-Wl,-allow_stack_execute" ++ } ++ ++ # If you're building the compiler with --prefix set to a place ++ # where it's not yet installed, then the linker won't be able to ++ # find the libgcc used by libffi.dylib. We could pass the ++ # -dylib_file option, but that's complicated, and it's much easier ++ # to just make the linker find libgcc using -L options. ++ if { [string match "*-*-darwin*" $target_triplet] } { ++ lappend options "libs= -shared-libgcc" ++ } ++ ++ if { [string match "*-*-openbsd*" $target_triplet] } { ++ lappend options "libs= -lpthread" ++ } ++ ++ lappend options "libs= -lffi" ++ ++ if { [string match "aarch64*-*-linux*" $target_triplet] } { ++ lappend options "libs= -lpthread" ++ } ++ ++ verbose "options: $options" ++ return [target_compile $source $dest $type $options] ++} ++ ++# Utility routines. ++ ++# ++# search_for -- looks for a string match in a file ++# ++proc search_for { file pattern } { ++ set fd [open $file r] ++ while { [gets $fd cur_line]>=0 } { ++ if [string match "*$pattern*" $cur_line] then { ++ close $fd ++ return 1 ++ } ++ } ++ close $fd ++ return 0 ++} ++ ++# Modified dg-runtest that can cycle through a list of optimization options ++# as c-torture does. ++proc libffi-dg-runtest { testcases default-extra-flags } { ++ global runtests ++ ++ foreach test $testcases { ++ # If we're only testing specific files and this isn't one of ++ # them, skip it. ++ if ![runtest_file_p $runtests $test] { ++ continue ++ } ++ ++ # Look for a loop within the source code - if we don't find one, ++ # don't pass -funroll[-all]-loops. ++ global torture_with_loops torture_without_loops ++ if [expr [search_for $test "for*("]+[search_for $test "while*("]] { ++ set option_list $torture_with_loops ++ } else { ++ set option_list $torture_without_loops ++ } ++ ++ set nshort [file tail [file dirname $test]]/[file tail $test] ++ ++ foreach flags $option_list { ++ verbose "Testing $nshort, $flags" 1 ++ dg-test $test $flags ${default-extra-flags} ++ } ++ } ++} ++ ++proc run-many-tests { testcases extra_flags } { ++ global using_gcc ++ if { [string match $using_gcc "yes"] } { ++ set common "-W -Wall" ++ set optimizations { "-O0" "-O2" "-O3" "-Os" "-O2 -fomit-frame-pointer" } ++ } else { ++ # Assume we are using the vendor compiler. ++ set common "" ++ set optimizations { "" } ++ } ++ ++ set targetabis { "" } ++ if [string match $using_gcc "yes"] { ++ if [istarget "i?86-*-*"] { ++ set targetabis { ++ "" ++ "-DABI_NUM=FFI_STDCALL -DABI_ATTR=__STDCALL__" ++ "-DABI_NUM=FFI_THISCALL -DABI_ATTR=__THISCALL__" ++ "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__" ++ } ++ } ++ } ++ ++ set common [ concat $common $extra_flags ] ++ foreach test $testcases { ++ set testname [file tail $test] ++ if [search_for $test "ABI_NUM"] { ++ set abis $targetabis ++ } else { ++ set abis { "" } ++ } ++ foreach opt $optimizations { ++ foreach abi $abis { ++ set options [concat $common $opt $abi] ++ verbose "Testing $testname, $options" 1 ++ dg-test $test $options "" ++ } ++ } ++ } ++} ++ ++# Like check_conditional_xfail, but callable from a dg test. ++ ++proc dg-xfail-if { args } { ++ set args [lreplace $args 0 0] ++ set selector "target [join [lindex $args 1]]" ++ if { [dg-process-target $selector] == "S" } { ++ global compiler_conditional_xfail_data ++ set compiler_conditional_xfail_data $args ++ } ++} ++ ++proc check-flags { args } { ++ ++ # The args are within another list; pull them out. ++ set args [lindex $args 0] ++ ++ # The next two arguments are optional. If they were not specified, ++ # use the defaults. ++ if { [llength $args] == 2 } { ++ lappend $args [list "*"] ++ } ++ if { [llength $args] == 3 } { ++ lappend $args [list ""] ++ } ++ ++ # If the option strings are the defaults, or the same as the ++ # defaults, there is no need to call check_conditional_xfail to ++ # compare them to the actual options. ++ if { [string compare [lindex $args 2] "*"] == 0 ++ && [string compare [lindex $args 3] "" ] == 0 } { ++ set result 1 ++ } else { ++ # The target list might be an effective-target keyword, so replace ++ # the original list with "*-*-*", since we already know it matches. ++ set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] ++ } ++ ++ return $result ++} ++ ++proc dg-skip-if { args } { ++ # Verify the number of arguments. The last two are optional. ++ set args [lreplace $args 0 0] ++ if { [llength $args] < 2 || [llength $args] > 4 } { ++ error "dg-skip-if 2: need 2, 3, or 4 arguments" ++ } ++ ++ # Don't bother if we're already skipping the test. ++ upvar dg-do-what dg-do-what ++ if { [lindex ${dg-do-what} 1] == "N" } { ++ return ++ } ++ ++ set selector [list target [lindex $args 1]] ++ if { [dg-process-target $selector] == "S" } { ++ if [check-flags $args] { ++ upvar dg-do-what dg-do-what ++ set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] ++ } ++ } ++} ++ ++# We need to make sure that additional_files and additional_sources ++# are both cleared out after every test. It is not enough to clear ++# them out *before* the next test run because gcc-target-compile gets ++# run directly from some .exp files (outside of any test). (Those ++# uses should eventually be eliminated.) ++ ++# Because the DG framework doesn't provide a hook that is run at the ++# end of a test, we must replace dg-test with a wrapper. ++ ++if { [info procs saved-dg-test] == [list] } { ++ rename dg-test saved-dg-test ++ ++ proc dg-test { args } { ++ global additional_files ++ global additional_sources ++ global errorInfo ++ ++ if { [ catch { eval saved-dg-test $args } errmsg ] } { ++ set saved_info $errorInfo ++ set additional_files "" ++ set additional_sources "" ++ error $errmsg $saved_info ++ } ++ set additional_files "" ++ set additional_sources "" ++ } ++} ++ ++# Local Variables: ++# tcl-indent-level:4 ++# End: +diff --git a/js/src/ctypes/libffi/testsuite/lib/target-libpath.exp b/js/src/ctypes/libffi/testsuite/lib/target-libpath.exp +--- a/js/src/ctypes/libffi/testsuite/lib/target-libpath.exp ++++ b/js/src/ctypes/libffi/testsuite/lib/target-libpath.exp +@@ -20,41 +20,43 @@ set orig_environment_saved 0 + set orig_ld_library_path_saved 0 + set orig_ld_run_path_saved 0 + set orig_shlib_path_saved 0 + set orig_ld_libraryn32_path_saved 0 + set orig_ld_library64_path_saved 0 + set orig_ld_library_path_32_saved 0 + set orig_ld_library_path_64_saved 0 + set orig_dyld_library_path_saved 0 +- ++set orig_path_saved 0 + + ####################################### + # proc set_ld_library_path_env_vars { } + ####################################### + + proc set_ld_library_path_env_vars { } { + global ld_library_path + global orig_environment_saved + global orig_ld_library_path_saved + global orig_ld_run_path_saved + global orig_shlib_path_saved + global orig_ld_libraryn32_path_saved + global orig_ld_library64_path_saved + global orig_ld_library_path_32_saved + global orig_ld_library_path_64_saved + global orig_dyld_library_path_saved ++ global orig_path_saved + global orig_ld_library_path + global orig_ld_run_path + global orig_shlib_path + global orig_ld_libraryn32_path + global orig_ld_library64_path + global orig_ld_library_path_32 + global orig_ld_library_path_64 + global orig_dyld_library_path ++ global orig_path + global GCC_EXEC_PREFIX + + # Set the relocated compiler prefix, but only if the user hasn't specified one. + if { [info exists GCC_EXEC_PREFIX] && ![info exists env(GCC_EXEC_PREFIX)] } { + setenv GCC_EXEC_PREFIX "$GCC_EXEC_PREFIX" + } + + # Setting the ld library path causes trouble when testing cross-compilers. +@@ -95,16 +97,20 @@ proc set_ld_library_path_env_vars { } { + if [info exists env(LD_LIBRARY_PATH_64)] { + set orig_ld_library_path_64 "$env(LD_LIBRARY_PATH_64)" + set orig_ld_library_path_64_saved 1 + } + if [info exists env(DYLD_LIBRARY_PATH)] { + set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)" + set orig_dyld_library_path_saved 1 + } ++ if [info exists env(PATH)] { ++ set orig_path "$env(PATH)" ++ set orig_path_saved 1 ++ } + } + + # We need to set ld library path in the environment. Currently, + # unix.exp doesn't set the environment correctly for all systems. + # It only sets SHLIB_PATH and LD_LIBRARY_PATH when it executes a + # program. We also need the environment set for compilations, etc. + # + # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but +@@ -164,16 +170,23 @@ proc set_ld_library_path_env_vars { } { + } else { + setenv LD_LIBRARY_PATH_64 "$ld_library_path" + } + if { $orig_dyld_library_path_saved } { + setenv DYLD_LIBRARY_PATH "$ld_library_path:$orig_dyld_library_path" + } else { + setenv DYLD_LIBRARY_PATH "$ld_library_path" + } ++ if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } { ++ if { $orig_path_saved } { ++ setenv PATH "$ld_library_path:$orig_path" ++ } else { ++ setenv PATH "$ld_library_path" ++ } ++ } + + verbose -log "set_ld_library_path_env_vars: ld_library_path=$ld_library_path" + } + + ####################################### + # proc restore_ld_library_path_env_vars { } + ####################################### + +@@ -182,24 +195,26 @@ proc restore_ld_library_path_env_vars { + global orig_ld_library_path_saved + global orig_ld_run_path_saved + global orig_shlib_path_saved + global orig_ld_libraryn32_path_saved + global orig_ld_library64_path_saved + global orig_ld_library_path_32_saved + global orig_ld_library_path_64_saved + global orig_dyld_library_path_saved ++ global orig_path_saved + global orig_ld_library_path + global orig_ld_run_path + global orig_shlib_path + global orig_ld_libraryn32_path + global orig_ld_library64_path + global orig_ld_library_path_32 + global orig_ld_library_path_64 + global orig_dyld_library_path ++ global orig_path + + if { $orig_environment_saved == 0 } { + return + } + + if { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH "$orig_ld_library_path" + } elseif [info exists env(LD_LIBRARY_PATH)] { +@@ -235,16 +250,21 @@ proc restore_ld_library_path_env_vars { + } elseif [info exists env(LD_LIBRARY_PATH_64)] { + unsetenv LD_LIBRARY_PATH_64 + } + if { $orig_dyld_library_path_saved } { + setenv DYLD_LIBRARY_PATH "$orig_dyld_library_path" + } elseif [info exists env(DYLD_LIBRARY_PATH)] { + unsetenv DYLD_LIBRARY_PATH + } ++ if { $orig_path_saved } { ++ setenv PATH "$orig_path" ++ } elseif [info exists env(PATH)] { ++ unsetenv PATH ++ } + } + + ####################################### + # proc get_shlib_extension { } + ####################################### + + proc get_shlib_extension { } { + global shlib_ext +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/call.exp b/js/src/ctypes/libffi/testsuite/libffi.call/call.exp +--- a/js/src/ctypes/libffi/testsuite/libffi.call/call.exp ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/call.exp +@@ -1,36 +1,31 @@ +-# Copyright (C) 2003, 2006, 2009 Free Software Foundation, Inc. ++# Copyright (C) 2003, 2006, 2009, 2010 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; see the file COPYING3. If not see + # . + +-# libffi testsuite that uses the 'dg.exp' driver. +- +-load_lib libffi-dg.exp +- + dg-init + libffi-init + + global srcdir subdir + +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O0 -W -Wall" "" +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2" "" +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O3" "" +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-Os" "" +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2 -fomit-frame-pointer" "" ++run-many-tests [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "" ++if { [string match $using_gcc "yes"] } { ++ run-many-tests [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] "-shared-libgcc -lstdc++" ++} + + dg-finish + + # Local Variables: + # tcl-indent-level:4 + # End: +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/closure_stdcall.c b/js/src/ctypes/libffi/testsuite/libffi.call/closure_stdcall.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/closure_stdcall.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/closure_stdcall.c +@@ -1,15 +1,15 @@ + /* Area: closure_call (stdcall convention) + Purpose: Check handling when caller expects stdcall callee + Limitations: none. + PR: none. + Originator: */ + +-/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ ++/* { dg-do run { target i?86-*-* } } */ + #include "ffitest.h" + + static void + closure_test_stdcall(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) + { + *(ffi_arg*)resp = + (int)*(int *)args[0] + (int)(*(int *)args[1]) +@@ -18,47 +18,39 @@ closure_test_stdcall(ffi_cif* cif __UNUS + + printf("%d %d %d %d: %d\n", + (int)*(int *)args[0], (int)(*(int *)args[1]), + (int)(*(int *)args[2]), (int)(*(int *)args[3]), + (int)*(ffi_arg *)resp); + + } + +-typedef int (__stdcall *closure_test_type0)(int, int, int, int); ++typedef int (__STDCALL__ *closure_test_type0)(int, int, int, int); + + int main (void) + { + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; +- void* sp_pre; +- void* sp_post; +- char buf[1024]; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = &ffi_type_uint; + cl_arg_types[2] = &ffi_type_uint; + cl_arg_types[3] = &ffi_type_uint; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 4, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_stdcall, + (void *) 3 /* userdata */, code) == FFI_OK); + +- asm volatile (" movl %%esp,%0" : "=g" (sp_pre)); + res = (*(closure_test_type0)code)(0, 1, 2, 3); +- asm volatile (" movl %%esp,%0" : "=g" (sp_post)); + /* { dg-output "0 1 2 3: 9" } */ + + printf("res: %d\n",res); + /* { dg-output "\nres: 9" } */ + +- sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post); +- printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf)); +- /* { dg-output "\nstack pointer match" } */ + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/closure_thiscall.c b/js/src/ctypes/libffi/testsuite/libffi.call/closure_thiscall.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/closure_thiscall.c +@@ -0,0 +1,56 @@ ++/* Area: closure_call (thiscall convention) ++ Purpose: Check handling when caller expects thiscall callee ++ Limitations: none. ++ PR: none. ++ Originator: */ ++ ++/* { dg-do run { target i?86-*-* } } */ ++#include "ffitest.h" ++ ++static void ++closure_test_thiscall(ffi_cif* cif __UNUSED__, void* resp, void** args, ++ void* userdata) ++{ ++ *(ffi_arg*)resp = ++ (int)*(int *)args[0] + (int)(*(int *)args[1]) ++ + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) ++ + (int)(intptr_t)userdata; ++ ++ printf("%d %d %d %d: %d\n", ++ (int)*(int *)args[0], (int)(*(int *)args[1]), ++ (int)(*(int *)args[2]), (int)(*(int *)args[3]), ++ (int)*(ffi_arg *)resp); ++ ++} ++ ++typedef int (__THISCALL__ *closure_test_type0)(int, int, int, int); ++ ++int main (void) ++{ ++ ffi_cif cif; ++ void *code; ++ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ++ ffi_type * cl_arg_types[17]; ++ int res; ++ ++ cl_arg_types[0] = &ffi_type_uint; ++ cl_arg_types[1] = &ffi_type_uint; ++ cl_arg_types[2] = &ffi_type_uint; ++ cl_arg_types[3] = &ffi_type_uint; ++ cl_arg_types[4] = NULL; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif(&cif, FFI_THISCALL, 4, ++ &ffi_type_sint, cl_arg_types) == FFI_OK); ++ ++ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_thiscall, ++ (void *) 3 /* userdata */, code) == FFI_OK); ++ ++ res = (*(closure_test_type0)code)(0, 1, 2, 3); ++ /* { dg-output "0 1 2 3: 9" } */ ++ ++ printf("res: %d\n",res); ++ /* { dg-output "\nres: 9" } */ ++ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_12byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_12byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_12byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_12byte.c +@@ -44,25 +44,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_12byte h_dbl = { 7, 4, 9 }; ++ struct cls_struct_12byte j_dbl = { 1, 5, 3 }; ++ struct cls_struct_12byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_12byte h_dbl = { 7, 4, 9 }; +- struct cls_struct_12byte j_dbl = { 1, 5, 3 }; +- struct cls_struct_12byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_16byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_16byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_16byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_16byte.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_16byte h_dbl = { 7, 8.0, 9 }; ++ struct cls_struct_16byte j_dbl = { 1, 9.0, 3 }; ++ struct cls_struct_16byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_16byte h_dbl = { 7, 8.0, 9 }; +- struct cls_struct_16byte j_dbl = { 1, 9.0, 3 }; +- struct cls_struct_16byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_18byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_18byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_18byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_18byte.c +@@ -49,25 +49,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + ++ struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 }; ++ struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 }; ++ struct cls_struct_18byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 }; +- struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 }; +- struct cls_struct_18byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_19byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_19byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_19byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_19byte.c +@@ -52,25 +52,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[6]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + ++ struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 }; ++ struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 }; ++ struct cls_struct_19byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 }; +- struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 }; +- struct cls_struct_19byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = NULL; + + dbl_arg_types[0] = &cls_struct_type; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[2]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_1_1byte g_dbl = { 12 }; ++ struct cls_struct_1_1byte f_dbl = { 178 }; ++ struct cls_struct_1_1byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_1_1byte g_dbl = { 12 }; +- struct cls_struct_1_1byte f_dbl = { 178 }; +- struct cls_struct_1_1byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 }; ++ struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 }; ++ struct cls_struct_20byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 }; +- struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 }; +- struct cls_struct_20byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte1.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte1.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte1.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_20byte1.c +@@ -47,25 +47,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + ++ struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 }; ++ struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 }; ++ struct cls_struct_20byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 }; +- struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 }; +- struct cls_struct_20byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_24byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_24byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_24byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_24byte.c +@@ -56,27 +56,27 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + +- cls_struct_type.size = 0; +- cls_struct_type.alignment = 0; +- cls_struct_type.type = FFI_TYPE_STRUCT; +- cls_struct_type.elements = cls_struct_fields; +- + struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 }; + struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 }; + struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 }; + struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 }; + struct cls_struct_24byte res_dbl; + ++ cls_struct_type.size = 0; ++ cls_struct_type.alignment = 0; ++ cls_struct_type.type = FFI_TYPE_STRUCT; ++ cls_struct_type.elements = cls_struct_fields; ++ + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = &ffi_type_float; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_2byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_2byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_2byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_2byte.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_2byte g_dbl = { 12, 127 }; ++ struct cls_struct_2byte f_dbl = { 1, 13 }; ++ struct cls_struct_2byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_2byte g_dbl = { 12, 127 }; +- struct cls_struct_2byte f_dbl = { 1, 13 }; +- struct cls_struct_2byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c +@@ -49,25 +49,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_3_1byte g_dbl = { 12, 13, 14 }; ++ struct cls_struct_3_1byte f_dbl = { 178, 179, 180 }; ++ struct cls_struct_3_1byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_3_1byte g_dbl = { 12, 13, 14 }; +- struct cls_struct_3_1byte f_dbl = { 178, 179, 180 }; +- struct cls_struct_3_1byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte1.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte1.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte1.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte1.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_3byte g_dbl = { 12, 119 }; ++ struct cls_struct_3byte f_dbl = { 1, 15 }; ++ struct cls_struct_3byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_3byte g_dbl = { 12, 119 }; +- struct cls_struct_3byte f_dbl = { 1, 15 }; +- struct cls_struct_3byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte2.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte2.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte2.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_3byte2.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_3byte_1 g_dbl = { 15, 125 }; ++ struct cls_struct_3byte_1 f_dbl = { 9, 19 }; ++ struct cls_struct_3byte_1 res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_3byte_1 g_dbl = { 15, 125 }; +- struct cls_struct_3byte_1 f_dbl = { 9, 19 }; +- struct cls_struct_3byte_1 res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c +@@ -51,25 +51,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 }; ++ struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 }; ++ struct cls_struct_4_1byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 }; +- struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 }; +- struct cls_struct_4_1byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_4byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_4byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_4byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_4byte.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_4byte g_dbl = { 127, 120 }; ++ struct cls_struct_4byte f_dbl = { 12, 128 }; ++ struct cls_struct_4byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_4byte g_dbl = { 127, 120 }; +- struct cls_struct_4byte f_dbl = { 12, 128 }; +- struct cls_struct_4byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c +@@ -53,25 +53,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[6]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; ++ struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; ++ struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; +- struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; +- struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = NULL; + + dbl_arg_types[0] = &cls_struct_type; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_5byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_5byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_5byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_5byte.c +@@ -48,25 +48,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_5byte g_dbl = { 127, 120, 1 }; ++ struct cls_struct_5byte f_dbl = { 12, 128, 9 }; ++ struct cls_struct_5byte res_dbl = { 0, 0, 0 }; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_5byte g_dbl = { 127, 120, 1 }; +- struct cls_struct_5byte f_dbl = { 12, 128, 9 }; +- struct cls_struct_5byte res_dbl = { 0, 0, 0 }; +- + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_64byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_64byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_64byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_64byte.c +@@ -61,27 +61,27 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[9]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + +- cls_struct_type.size = 0; +- cls_struct_type.alignment = 0; +- cls_struct_type.type = FFI_TYPE_STRUCT; +- cls_struct_type.elements = cls_struct_fields; +- + struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 }; + struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 }; + struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 }; + struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 }; + struct cls_struct_64byte res_dbl; + ++ cls_struct_type.size = 0; ++ cls_struct_type.alignment = 0; ++ cls_struct_type.type = FFI_TYPE_STRUCT; ++ cls_struct_type.elements = cls_struct_fields; ++ + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c +@@ -55,25 +55,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[7]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 }; ++ struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 }; ++ struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 }; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 }; +- struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 }; +- struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 }; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = &ffi_type_uchar; + cls_struct_fields[6] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_6byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_6byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_6byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_6byte.c +@@ -51,25 +51,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 }; ++ struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 }; ++ struct cls_struct_6byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 }; +- struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 }; +- struct cls_struct_6byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c +@@ -57,25 +57,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 }; ++ struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 }; ++ struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 }; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 }; +- struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 }; +- struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 }; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = &ffi_type_uchar; + cls_struct_fields[6] = &ffi_type_uchar; + cls_struct_fields[7] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_7byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_7byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_7byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_7byte.c +@@ -50,25 +50,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; ++ struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; ++ struct cls_struct_7byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; +- struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; +- struct cls_struct_7byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_ushort; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_8byte.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_8byte.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_8byte.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_8byte.c +@@ -44,25 +44,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_8byte g_dbl = { 1, 2.0 }; ++ struct cls_struct_8byte f_dbl = { 4, 5.0 }; ++ struct cls_struct_8byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_8byte g_dbl = { 1, 2.0 }; +- struct cls_struct_8byte f_dbl = { 4, 5.0 }; +- struct cls_struct_8byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte1.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte1.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte1.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte1.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + ++ struct cls_struct_9byte h_dbl = { 7, 8.0}; ++ struct cls_struct_9byte j_dbl = { 1, 9.0}; ++ struct cls_struct_9byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_9byte h_dbl = { 7, 8.0}; +- struct cls_struct_9byte j_dbl = { 1, 9.0}; +- struct cls_struct_9byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte2.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte2.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte2.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_9byte2.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + ++ struct cls_struct_9byte h_dbl = { 7.0, 8}; ++ struct cls_struct_9byte j_dbl = { 1.0, 9}; ++ struct cls_struct_9byte res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_9byte h_dbl = { 7.0, 8}; +- struct cls_struct_9byte j_dbl = { 1.0, 9}; +- struct cls_struct_9byte res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_double.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_double.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_double.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_double.c +@@ -47,25 +47,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_float.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_float.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_float.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_float.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c +@@ -46,25 +46,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +@@ -1,17 +1,17 @@ + /* Area: ffi_call, closure_call + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: 20031203 */ + + /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +-/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */ ++/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ + /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + + #include "ffitest.h" + + typedef struct cls_struct_align { + long double a; + long double b; + long double c; +@@ -82,25 +82,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + ++ struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; ++ struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; +- struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_longdouble; + cls_struct_fields[3] = &ffi_type_longdouble; + cls_struct_fields[4] = &ffi_type_longdouble; + cls_struct_fields[5] = &ffi_type_longdouble; + cls_struct_fields[6] = &ffi_type_longdouble; + cls_struct_fields[7] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +@@ -2,17 +2,17 @@ + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/18/2007 + */ + + /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + /* { dg-do run { xfail strongarm*-*-* } } */ +-/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */ ++/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ + /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + + #include "ffitest.h" + + typedef struct cls_struct_align { + long double a; + long double b; + long double c; +@@ -62,25 +62,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + ++ struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; ++ struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; +- struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_longdouble; + cls_struct_fields[3] = &ffi_type_longdouble; + cls_struct_fields[4] = &ffi_type_longdouble; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_longdouble; + cls_struct_fields[7] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c +@@ -49,25 +49,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, (void *)4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, (void *)9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, (void *)4951, 127 }; +- struct cls_struct_align f_dbl = { 1, (void *)9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_pointer; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sshort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c +@@ -46,25 +46,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sint64; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c +@@ -45,25 +45,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c +@@ -47,25 +47,25 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_align g_dbl = { 12, 4951, 127 }; ++ struct cls_struct_align f_dbl = { 1, 9320, 13 }; ++ struct cls_struct_align res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + +- struct cls_struct_align g_dbl = { 12, 4951, 127 }; +- struct cls_struct_align f_dbl = { 1, 9320, 13 }; +- struct cls_struct_align res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint64; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c +@@ -32,29 +32,29 @@ int main(int argc __UNUSED__, char** arg + + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* cl_arg_types[1]; + + ffi_type ts1_type; + ffi_type* ts1_type_elements[4]; + ++ Dbls arg = { 1.0, 2.0 }; ++ + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + + ts1_type_elements[0] = &ffi_type_double; + ts1_type_elements[1] = &ffi_type_double; + ts1_type_elements[2] = NULL; + + cl_arg_types[0] = &ts1_type; + +- Dbls arg = { 1.0, 2.0 }; +- + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_void, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); + + ((void*(*)(Dbls))(code))(arg); + /* { dg-output "1.0 2.0\n" } */ +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c +@@ -1,17 +1,17 @@ + /* Area: ffi_call, closure_call + Purpose: Test doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + + /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ + /* { dg-output "" { xfail avr32*-*-* } } */ +-/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */ ++/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ + + #include "ffitest.h" + + static void + cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) + { + char* format = *(char**)args[0]; +@@ -31,29 +31,31 @@ int main (void) + char* format = "%.1f\n"; + double doubleArg = 7; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_double; + arg_types[2] = NULL; + +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, +- arg_types) == FFI_OK); ++ /* This printf call is variadic */ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, ++ arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &doubleArg; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(printf), &res, args); +- // { dg-output "7.0" } ++ /* { dg-output "7.0" } */ + printf("res: %d\n", (int) res); +- // { dg-output "\nres: 4" } ++ /* { dg-output "\nres: 4" } */ + +- CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, code) == FFI_OK); ++ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, ++ code) == FFI_OK); + +- res = ((int(*)(char*, double))(code))(format, doubleArg); +- // { dg-output "\n7.0" } ++ res = ((int(*)(char*, ...))(code))(format, doubleArg); ++ /* { dg-output "\n7.0" } */ + printf("res: %d\n", (int) res); +- // { dg-output "\nres: 4" } ++ /* { dg-output "\nres: 4" } */ + + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble.c +@@ -1,17 +1,19 @@ + /* Area: ffi_call, closure_call + Purpose: Check long double arguments. + Limitations: none. + PR: none. + Originator: Blake Chaffin */ + + /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ +-/* { dg-do run { xfail arm*-*-* strongarm*-*-* xscale*-*-* } } */ +-/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */ ++/* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have ++ remove the xfail for arm*-*-* below, until we know more. */ ++/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ ++/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ + /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + + #include "ffitest.h" + + long double cls_ldouble_fn( + long double a1, + long double a2, + long double a3, +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c +@@ -1,17 +1,17 @@ + /* Area: ffi_call, closure_call + Purpose: Test long doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + + /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ + /* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ +-/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */ ++/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ + + #include "ffitest.h" + + static void + cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) + { + char* format = *(char**)args[0]; +@@ -31,29 +31,31 @@ int main (void) + char* format = "%.1Lf\n"; + long double ldArg = 7; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_longdouble; + arg_types[2] = NULL; + +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, +- arg_types) == FFI_OK); ++ /* This printf call is variadic */ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, ++ arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &ldArg; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(printf), &res, args); +- // { dg-output "7.0" } ++ /* { dg-output "7.0" } */ + printf("res: %d\n", (int) res); +- // { dg-output "\nres: 4" } ++ /* { dg-output "\nres: 4" } */ + +- CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, code) == FFI_OK); ++ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, ++ code) == FFI_OK); + +- res = ((int(*)(char*, long double))(code))(format, ldArg); +- // { dg-output "\n7.0" } ++ res = ((int(*)(char*, ...))(code))(format, ldArg); ++ /* { dg-output "\n7.0" } */ + printf("res: %d\n", (int) res); +- // { dg-output "\nres: 4" } ++ /* { dg-output "\nres: 4" } */ + + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer.c +@@ -30,17 +30,17 @@ cls_pointer_gn(ffi_cif* cif __UNUSED__, + } + + int main (void) + { + ffi_cif cif; + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; +-// ffi_type cls_pointer_type; ++ /* ffi_type cls_pointer_type; */ + ffi_type* arg_types[3]; + + /* cls_pointer_type.size = sizeof(void*); + cls_pointer_type.alignment = 0; + cls_pointer_type.type = FFI_TYPE_POINTER; + cls_pointer_type.elements = NULL;*/ + + void* arg1 = (void*)0x12345678; +@@ -60,15 +60,15 @@ int main (void) + + ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args); + /* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */ + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\nres: 0x9be02467" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); + +- res = (ffi_arg)((void*(*)(void*, void*))(code))(arg1, arg2); ++ res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); + /* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */ + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\nres: 0x9be02467" } */ + + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c +@@ -23,21 +23,22 @@ void* cls_pointer_fn2(void* a1, void* a2 + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; ++ void* result; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + +- void* result = (void*)((intptr_t)a1 + (intptr_t)a2); ++ result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(uintptr_t) a1, + (unsigned int)(uintptr_t) a2, + (unsigned int)(uintptr_t) result); + + return result; + } +@@ -47,21 +48,22 @@ void* cls_pointer_fn1(void* a1, void* a2 + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; ++ void* result; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + +- void* result = (void*)((intptr_t)a1 + (intptr_t)a2); ++ result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(intptr_t) a1, + (unsigned int)(intptr_t) a2, + (unsigned int)(intptr_t) result); + + result = cls_pointer_fn2(result, a1); + +@@ -91,17 +93,17 @@ cls_pointer_gn(ffi_cif* cif __UNUSED__, + } + + int main (void) + { + ffi_cif cif; + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; +-// ffi_type cls_pointer_type; ++ /* ffi_type cls_pointer_type; */ + ffi_type* arg_types[3]; + + /* cls_pointer_type.size = sizeof(void*); + cls_pointer_type.alignment = 0; + cls_pointer_type.type = FFI_TYPE_POINTER; + cls_pointer_type.elements = NULL;*/ + + void* arg1 = (void*)0x01234567; +@@ -118,23 +120,23 @@ int main (void) + args[0] = &arg1; + args[1] = &arg2; + args[2] = NULL; + + printf("\n"); + ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args); + + printf("res: 0x%08x\n", (unsigned int) res); +- // { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } +- // { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } +- // { dg-output "\nres: 0x8bf258bd" } ++ /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ ++ /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ ++ /* { dg-output "\nres: 0x8bf258bd" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); + +- res = (ffi_arg)((void*(*)(void*, void*))(code))(arg1, arg2); ++ res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); + + printf("res: 0x%08x\n", (unsigned int) res); +- // { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } +- // { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } +- // { dg-output "\nres: 0x8bf258bd" } ++ /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ ++ /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ ++ /* { dg-output "\nres: 0x8bf258bd" } */ + + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c +@@ -0,0 +1,114 @@ ++/* Area: ffi_call, closure_call ++ Purpose: Test doubles passed in variable argument lists. ++ Limitations: none. ++ PR: none. ++ Originator: Blake Chaffin 6/6/2007 */ ++ ++/* { dg-do run } */ ++/* { dg-output "" { xfail avr32*-*-* } } */ ++#include "ffitest.h" ++ ++struct small_tag ++{ ++ unsigned char a; ++ unsigned char b; ++}; ++ ++struct large_tag ++{ ++ unsigned a; ++ unsigned b; ++ unsigned c; ++ unsigned d; ++ unsigned e; ++}; ++ ++static void ++test_fn (ffi_cif* cif __UNUSED__, void* resp, ++ void** args, void* userdata __UNUSED__) ++{ ++ int n = *(int*)args[0]; ++ struct small_tag s1 = * (struct small_tag *) args[1]; ++ struct large_tag l1 = * (struct large_tag *) args[2]; ++ struct small_tag s2 = * (struct small_tag *) args[3]; ++ ++ printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b, ++ l1.a, l1.b, l1.c, l1.d, l1.e, ++ s2.a, s2.b); ++ * (ffi_arg*) resp = 42; ++} ++ ++int ++main (void) ++{ ++ ffi_cif cif; ++ void *code; ++ ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code); ++ ffi_type* arg_types[5]; ++ ++ ffi_arg res = 0; ++ ++ ffi_type s_type; ++ ffi_type *s_type_elements[3]; ++ ++ ffi_type l_type; ++ ffi_type *l_type_elements[6]; ++ ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l1; ++ ++ int si; ++ ++ s_type.size = 0; ++ s_type.alignment = 0; ++ s_type.type = FFI_TYPE_STRUCT; ++ s_type.elements = s_type_elements; ++ ++ s_type_elements[0] = &ffi_type_uchar; ++ s_type_elements[1] = &ffi_type_uchar; ++ s_type_elements[2] = NULL; ++ ++ l_type.size = 0; ++ l_type.alignment = 0; ++ l_type.type = FFI_TYPE_STRUCT; ++ l_type.elements = l_type_elements; ++ ++ l_type_elements[0] = &ffi_type_uint; ++ l_type_elements[1] = &ffi_type_uint; ++ l_type_elements[2] = &ffi_type_uint; ++ l_type_elements[3] = &ffi_type_uint; ++ l_type_elements[4] = &ffi_type_uint; ++ l_type_elements[5] = NULL; ++ ++ arg_types[0] = &ffi_type_sint; ++ arg_types[1] = &s_type; ++ arg_types[2] = &l_type; ++ arg_types[3] = &s_type; ++ arg_types[4] = NULL; ++ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, ++ arg_types) == FFI_OK); ++ ++ si = 4; ++ s1.a = 5; ++ s1.b = 6; ++ ++ s2.a = 20; ++ s2.b = 21; ++ ++ l1.a = 10; ++ l1.b = 11; ++ l1.c = 12; ++ l1.d = 13; ++ l1.e = 14; ++ ++ CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK); ++ ++ res = ((int (*)(int, ...))(code))(si, s1, l1, s2); ++ /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */ ++ printf("res: %d\n", (int) res); ++ /* { dg-output "\nres: 42" } */ ++ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_uchar_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_uchar_va.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_uchar_va.c +@@ -0,0 +1,44 @@ ++/* Area: closure_call ++ Purpose: Test anonymous unsigned char argument. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++#include "ffitest.h" ++ ++typedef unsigned char T; ++ ++static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, ++ void* userdata __UNUSED__) ++ { ++ *(ffi_arg *)resp = *(T *)args[0]; ++ ++ printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); ++ } ++ ++typedef T (*cls_ret_T)(T, ...); ++ ++int main (void) ++{ ++ ffi_cif cif; ++ void *code; ++ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ++ ffi_type * cl_arg_types[3]; ++ T res; ++ ++ cl_arg_types[0] = &ffi_type_uchar; ++ cl_arg_types[1] = &ffi_type_uchar; ++ cl_arg_types[2] = NULL; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, ++ &ffi_type_uchar, cl_arg_types) == FFI_OK); ++ ++ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); ++ res = ((((cls_ret_T)code)(67, 4))); ++ /* { dg-output "67: 67 4" } */ ++ printf("res: %d\n", res); ++ /* { dg-output "\nres: 67" } */ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_uint_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_uint_va.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_uint_va.c +@@ -0,0 +1,45 @@ ++/* Area: closure_call ++ Purpose: Test anonymous unsigned int argument. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++typedef unsigned int T; ++ ++static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, ++ void* userdata __UNUSED__) ++ { ++ *(ffi_arg *)resp = *(T *)args[0]; ++ ++ printf("%d: %d %d\n", (int)*(ffi_arg *)resp, *(T *)args[0], *(T *)args[1]); ++ } ++ ++typedef T (*cls_ret_T)(T, ...); ++ ++int main (void) ++{ ++ ffi_cif cif; ++ void *code; ++ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ++ ffi_type * cl_arg_types[3]; ++ T res; ++ ++ cl_arg_types[0] = &ffi_type_uint; ++ cl_arg_types[1] = &ffi_type_uint; ++ cl_arg_types[2] = NULL; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, ++ &ffi_type_uint, cl_arg_types) == FFI_OK); ++ ++ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); ++ res = ((((cls_ret_T)code)(67, 4))); ++ /* { dg-output "67: 67 4" } */ ++ printf("res: %d\n", res); ++ /* { dg-output "\nres: 67" } */ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_ulong_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_ulong_va.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_ulong_va.c +@@ -0,0 +1,45 @@ ++/* Area: closure_call ++ Purpose: Test anonymous unsigned long argument. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++typedef unsigned long T; ++ ++static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, ++ void* userdata __UNUSED__) ++ { ++ *(T *)resp = *(T *)args[0]; ++ ++ printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]); ++ } ++ ++typedef T (*cls_ret_T)(T, ...); ++ ++int main (void) ++{ ++ ffi_cif cif; ++ void *code; ++ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ++ ffi_type * cl_arg_types[3]; ++ T res; ++ ++ cl_arg_types[0] = &ffi_type_ulong; ++ cl_arg_types[1] = &ffi_type_ulong; ++ cl_arg_types[2] = NULL; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, ++ &ffi_type_ulong, cl_arg_types) == FFI_OK); ++ ++ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); ++ res = ((((cls_ret_T)code)(67, 4))); ++ /* { dg-output "67: 67 4" } */ ++ printf("res: %ld\n", res); ++ /* { dg-output "\nres: 67" } */ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c +@@ -6,17 +6,17 @@ + + /* { dg-do run } */ + /* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ + #include "ffitest.h" + + static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) + { +- *(unsigned long long *)resp= *(unsigned long long *)args[0]; ++ *(unsigned long long *)resp= 0xfffffffffffffffLL ^ *(unsigned long long *)args[0]; + + printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0], + *(unsigned long long *)(resp)); + } + typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long); + + int main (void) + { +@@ -29,19 +29,19 @@ int main (void) + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint64, cl_arg_types) == FFI_OK); + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code) == FFI_OK); + res = (*((cls_ret_ulonglong)code))(214LL); +- /* { dg-output "214: 214" } */ ++ /* { dg-output "214: 1152921504606846761" } */ + printf("res: %" PRIdLL "\n", res); +- /* { dg-output "\nres: 214" } */ ++ /* { dg-output "\nres: 1152921504606846761" } */ + + res = (*((cls_ret_ulonglong)code))(9223372035854775808LL); +- /* { dg-output "\n9223372035854775808: 9223372035854775808" } */ ++ /* { dg-output "\n9223372035854775808: 8070450533247928831" } */ + printf("res: %" PRIdLL "\n", res); +- /* { dg-output "\nres: 9223372035854775808" } */ ++ /* { dg-output "\nres: 8070450533247928831" } */ + + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_ushort_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_ushort_va.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_ushort_va.c +@@ -0,0 +1,44 @@ ++/* Area: closure_call ++ Purpose: Test anonymous unsigned short argument. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++#include "ffitest.h" ++ ++typedef unsigned short T; ++ ++static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, ++ void* userdata __UNUSED__) ++ { ++ *(ffi_arg *)resp = *(T *)args[0]; ++ ++ printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); ++ } ++ ++typedef T (*cls_ret_T)(T, ...); ++ ++int main (void) ++{ ++ ffi_cif cif; ++ void *code; ++ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ++ ffi_type * cl_arg_types[3]; ++ T res; ++ ++ cl_arg_types[0] = &ffi_type_ushort; ++ cl_arg_types[1] = &ffi_type_ushort; ++ cl_arg_types[2] = NULL; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, ++ &ffi_type_ushort, cl_arg_types) == FFI_OK); ++ ++ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); ++ res = ((((cls_ret_T)code)(67, 4))); ++ /* { dg-output "67: 67 4" } */ ++ printf("res: %d\n", res); ++ /* { dg-output "\nres: 67" } */ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_abi.c b/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_abi.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_abi.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_abi.c +@@ -1,15 +1,16 @@ + /* Area: ffi_prep_cif, ffi_prep_closure + Purpose: Test error return for bad ABIs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +-/* { dg-do run { xfail *-*-* } } */ ++/* { dg-do run } */ ++ + #include "ffitest.h" + + static void + dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args __UNUSED__, void* userdata __UNUSED__) + {} + + int main (void) +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c b/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c +@@ -1,25 +1,26 @@ + /* Area: ffi_prep_cif + Purpose: Test error return for bad typedefs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +-/* { dg-do run { xfail *-*-* } } */ ++/* { dg-do run } */ ++ + #include "ffitest.h" + + int main (void) + { + ffi_cif cif; + ffi_type* arg_types[1]; + ++ ffi_type badType = ffi_type_void; ++ + arg_types[0] = NULL; + +- ffi_type badType = ffi_type_void; +- + badType.size = 0; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType, + arg_types) == FFI_BAD_TYPEDEF); + + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/ffitest.h b/js/src/ctypes/libffi/testsuite/libffi.call/ffitest.h +--- a/js/src/ctypes/libffi/testsuite/libffi.call/ffitest.h ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/ffitest.h +@@ -10,24 +10,35 @@ + #endif + + #if defined HAVE_INTTYPES_H + #include + #endif + + #define MAX_ARGS 256 + +-#define CHECK(x) !(x) ? abort() : 0 ++#define CHECK(x) (!(x) ? (abort(), 1) : 0) + +-/* Define __UNUSED__ that also other compilers than gcc can run the tests. */ ++/* Define macros so that compilers other than gcc can run the tests. */ + #undef __UNUSED__ + #if defined(__GNUC__) + #define __UNUSED__ __attribute__((__unused__)) ++#define __STDCALL__ __attribute__((stdcall)) ++#define __THISCALL__ __attribute__((thiscall)) ++#define __FASTCALL__ __attribute__((fastcall)) + #else + #define __UNUSED__ ++#define __STDCALL__ __stdcall ++#define __THISCALL__ __thiscall ++#define __FASTCALL__ __fastcall ++#endif ++ ++#ifndef ABI_NUM ++#define ABI_NUM FFI_DEFAULT_ABI ++#define ABI_ATTR + #endif + + /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a + file open. */ + #ifdef HAVE_MMAP_ANON + # undef HAVE_MMAP_DEV_ZERO + + # include +@@ -62,68 +73,63 @@ + + /* Tru64 UNIX kludge. */ + #if defined(__alpha__) && defined(__osf__) + /* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ + #undef PRIdLL + #define PRIdLL "ld" + #undef PRIuLL + #define PRIuLL "lu" ++#define PRId8 "hd" ++#define PRIu8 "hu" + #define PRId64 "ld" + #define PRIu64 "lu" + #define PRIuPTR "lu" + #endif + + /* PA HP-UX kludge. */ + #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) + #define PRIuPTR "lu" + #endif + ++/* IRIX kludge. */ ++#if defined(__sgi) ++/* IRIX 6.5 provides all definitions, but only for C99 ++ compilations. */ ++#define PRId8 "hhd" ++#define PRIu8 "hhu" ++#if (_MIPS_SZLONG == 32) ++#define PRId64 "lld" ++#define PRIu64 "llu" ++#endif ++/* This doesn't match , which always has "lld" here, but the ++ arguments are uint64_t, int64_t, which are unsigned long, long for ++ 64-bit in . */ ++#if (_MIPS_SZLONG == 64) ++#define PRId64 "ld" ++#define PRIu64 "lu" ++#endif ++/* This doesn't match , which has "u" here, but the arguments ++ are uintptr_t, which is always unsigned long. */ ++#define PRIuPTR "lu" ++#endif ++ + /* Solaris < 10 kludge. */ + #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) + #if defined(__arch64__) || defined (__x86_64__) + #define PRIuPTR "lu" + #else + #define PRIuPTR "u" + #endif + #endif + +-#ifdef USING_MMAP +-static inline void * +-allocate_mmap (size_t size) +-{ +- void *page; +-#if defined (HAVE_MMAP_DEV_ZERO) +- static int dev_zero_fd = -1; ++/* MSVC kludge. */ ++#if defined _MSC_VER ++#define PRIuPTR "lu" ++#define PRIu8 "u" ++#define PRId8 "d" ++#define PRIu64 "I64u" ++#define PRId64 "I64d" + #endif + +-#ifdef HAVE_MMAP_DEV_ZERO +- if (dev_zero_fd == -1) +- { +- dev_zero_fd = open ("/dev/zero", O_RDONLY); +- if (dev_zero_fd == -1) +- { +- perror ("open /dev/zero: %m"); +- exit (1); +- } +- } ++#ifndef PRIuPTR ++#define PRIuPTR "u" + #endif +- +- +-#ifdef HAVE_MMAP_ANON +- page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, +- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +-#endif +-#ifdef HAVE_MMAP_DEV_ZERO +- page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, +- MAP_PRIVATE, dev_zero_fd, 0); +-#endif +- +- if (page == (void *) MAP_FAILED) +- { +- perror ("virtual memory exhausted"); +- exit (1); +- } +- +- return page; +-} +- +-#endif +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/float_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/float_va.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/float_va.c +@@ -0,0 +1,107 @@ ++/* Area: fp and variadics ++ Purpose: check fp inputs and returns work on variadics, even the fixed params ++ Limitations: None ++ PR: none ++ Originator: 2011-01-25 ++ ++ Intended to stress the difference in ABI on ARM vfp ++*/ ++ ++/* { dg-do run } */ ++ ++#include ++ ++#include "ffitest.h" ++ ++/* prints out all the parameters, and returns the sum of them all. ++ * 'x' is the number of variadic parameters all of which are double in this test ++ */ ++double float_va_fn(unsigned int x, double y,...) ++{ ++ double total=0.0; ++ va_list ap; ++ unsigned int i; ++ ++ total+=(double)x; ++ total+=y; ++ ++ printf("%u: %.1f :", x, y); ++ ++ va_start(ap, y); ++ for(i=0;i + #include ++#include + +-static float many(float f1, +- float f2, +- float f3, +- float f4, +- float f5, +- float f6, +- float f7, +- float f8, +- float f9, +- float f10, +- float f11, +- float f12, +- float f13) ++static float ABI_ATTR many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13) + { + #if 0 + printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", + (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, + (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, + (double) f11, (double) f12, (double) f13); + #endif + +- return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); ++ return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[13]; + void *values[13]; + float fa[13]; +@@ -45,25 +35,25 @@ int main (void) + for (i = 0; i < 13; i++) + { + args[i] = &ffi_type_float; + values[i] = &fa[i]; + fa[i] = (float) i; + } + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 13, + &ffi_type_float, args) == FFI_OK); + + ffi_call(&cif, FFI_FN(many), &f, values); + + ff = many(fa[0], fa[1], + fa[2], fa[3], + fa[4], fa[5], + fa[6], fa[7], + fa[8], fa[9], + fa[10],fa[11],fa[12]); + +- if (f - ff < FLT_EPSILON) ++ if (fabs(f - ff) < FLT_EPSILON) + exit(0); + else + abort(); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/many2.c b/js/src/ctypes/libffi/testsuite/libffi.call/many2.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/many2.c +@@ -0,0 +1,57 @@ ++/* Area: ffi_call ++ Purpose: Check uint8_t arguments. ++ Limitations: none. ++ PR: PR45677. ++ Originator: Dan Witte 20100916 */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++#define NARGS 7 ++ ++typedef unsigned char u8; ++ ++#ifdef __GNUC__ ++__attribute__((noinline)) ++#endif ++uint8_t ++foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d, ++ uint8_t e, uint8_t f, uint8_t g) ++{ ++ return a + b + c + d + e + f + g; ++} ++ ++uint8_t ABI_ATTR ++bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d, ++ uint8_t e, uint8_t f, uint8_t g) ++{ ++ return foo (a, b, c, d, e, f, g); ++} ++ ++int ++main (void) ++{ ++ ffi_type *ffitypes[NARGS]; ++ int i; ++ ffi_cif cif; ++ ffi_arg result = 0; ++ uint8_t args[NARGS]; ++ void *argptrs[NARGS]; ++ ++ for (i = 0; i < NARGS; ++i) ++ ffitypes[i] = &ffi_type_uint8; ++ ++ CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS, ++ &ffi_type_uint8, ffitypes) == FFI_OK); ++ ++ for (i = 0; i < NARGS; ++i) ++ { ++ args[i] = i; ++ argptrs[i] = &args[i]; ++ } ++ ffi_call (&cif, FFI_FN (bar), &result, argptrs); ++ ++ CHECK (result == 21); ++ return 0; ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/many_win32.c b/js/src/ctypes/libffi/testsuite/libffi.call/many_win32.c +deleted file mode 100644 +--- a/js/src/ctypes/libffi/testsuite/libffi.call/many_win32.c ++++ /dev/null +@@ -1,63 +0,0 @@ +-/* Area: ffi_call +- Purpose: Check stdcall many call on X86_WIN32 systems. +- Limitations: none. +- PR: none. +- Originator: From the original ffitest.c */ +- +-/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ +- +-#include "ffitest.h" +-#include +- +-static float __attribute__((stdcall)) stdcall_many(float f1, +- float f2, +- float f3, +- float f4, +- float f5, +- float f6, +- float f7, +- float f8, +- float f9, +- float f10, +- float f11, +- float f12, +- float f13) +-{ +- return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); +-} +- +-int main (void) +-{ +- ffi_cif cif; +- ffi_type *args[13]; +- void *values[13]; +- float fa[13]; +- float f, ff; +- unsigned long ul; +- +- for (ul = 0; ul < 13; ul++) +- { +- args[ul] = &ffi_type_float; +- values[ul] = &fa[ul]; +- fa[ul] = (float) ul; +- } +- +- /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 13, +- &ffi_type_float, args) == FFI_OK); +- +- ff = stdcall_many(fa[0], fa[1], +- fa[2], fa[3], +- fa[4], fa[5], +- fa[6], fa[7], +- fa[8], fa[9], +- fa[10], fa[11], fa[12]); +- +- ffi_call(&cif, FFI_FN(stdcall_many), &f, values); +- +- if (f - ff < FLT_EPSILON) +- printf("stdcall many arg tests ok!\n"); +- else +- CHECK(0); +- exit(0); +-} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/negint.c b/js/src/ctypes/libffi/testsuite/libffi.call/negint.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/negint.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/negint.c +@@ -1,16 +1,15 @@ + /* Area: ffi_call + Purpose: Check that negative integers are passed correctly. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + + /* { dg-do run } */ +-/* { dg-options -O2 } */ + + #include "ffitest.h" + + static int checking(int a, short b, signed char c) + { + + return (a < 0 && b < 0 && c < 0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct.c +@@ -72,37 +72,37 @@ int main (void) + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type* cls_struct_fields1[5]; + ffi_type* cls_struct_fields2[5]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; ++ struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; ++ struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, ++ {3, 1.0, 8.0}}; ++ struct cls_struct_combined res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + +- struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; +- struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; +- struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, +- {3, 1.0, 8.0}}; +- struct cls_struct_combined res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + cls_struct_fields1[0] = &ffi_type_sint; + cls_struct_fields1[1] = &ffi_type_double; + cls_struct_fields1[2] = &ffi_type_float; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct1.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct1.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct1.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct1.c +@@ -76,38 +76,38 @@ int main (void) + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type* cls_struct_fields1[5]; + ffi_type* cls_struct_fields2[5]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; ++ struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; ++ struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, ++ {3, 1.0, 8.0}}; ++ struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4}; ++ struct cls_struct_combined res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + +- struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; +- struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; +- struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, +- {3, 1.0, 8.0}}; +- struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4}; +- struct cls_struct_combined res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + cls_struct_fields1[0] = &ffi_type_sint; + cls_struct_fields1[1] = &ffi_type_double; + cls_struct_fields1[2] = &ffi_type_float; +@@ -151,11 +151,11 @@ int main (void) + (code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); +- // CHECK( 1 == 0); ++ /* CHECK( 1 == 0); */ + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct10.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct10.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct10.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct10.c +@@ -62,37 +62,37 @@ int main (void) + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[4]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + ++ struct A e_dbl = { 1LL, 7}; ++ struct B f_dbl = { 99, {12LL , 127}, 255}; ++ struct C g_dbl = { 2LL, 9}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + +- struct A e_dbl = { 1LL, 7}; +- struct B f_dbl = { 99, {12LL , 127}, 255}; +- struct C g_dbl = { 2LL, 9}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &ffi_type_uchar; + cls_struct_fields1[1] = &cls_struct_type; + cls_struct_fields1[2] = &ffi_type_uint; + cls_struct_fields1[3] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct11.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct11.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct11.c +@@ -0,0 +1,121 @@ ++/* Area: ffi_call, closure_call ++ Purpose: Check parameter passing with nested structs ++ of a single type. This tests the special cases ++ for homogeneous floating-point aggregates in the ++ AArch64 PCS. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++#include "ffitest.h" ++ ++typedef struct A { ++ float a_x; ++ float a_y; ++} A; ++ ++typedef struct B { ++ float b_x; ++ float b_y; ++} B; ++ ++typedef struct C { ++ A a; ++ B b; ++} C; ++ ++static C C_fn (int x, int y, int z, C source, int i, int j, int k) ++{ ++ C result; ++ result.a.a_x = source.a.a_x; ++ result.a.a_y = source.a.a_y; ++ result.b.b_x = source.b.b_x; ++ result.b.b_y = source.b.b_y; ++ ++ printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k); ++ ++ printf ("%.1f, %.1f, %.1f, %.1f, " ++ "%.1f, %.1f, %.1f, %.1f\n", ++ source.a.a_x, source.a.a_y, ++ source.b.b_x, source.b.b_y, ++ result.a.a_x, result.a.a_y, ++ result.b.b_x, result.b.b_y); ++ ++ return result; ++} ++ ++int main (void) ++{ ++ ffi_cif cif; ++ ++ ffi_type* struct_fields_source_a[3]; ++ ffi_type* struct_fields_source_b[3]; ++ ffi_type* struct_fields_source_c[3]; ++ ffi_type* arg_types[8]; ++ ++ ffi_type struct_type_a, struct_type_b, struct_type_c; ++ ++ struct A source_fld_a = {1.0, 2.0}; ++ struct B source_fld_b = {4.0, 8.0}; ++ int k = 1; ++ ++ struct C result; ++ struct C source = {source_fld_a, source_fld_b}; ++ ++ struct_type_a.size = 0; ++ struct_type_a.alignment = 0; ++ struct_type_a.type = FFI_TYPE_STRUCT; ++ struct_type_a.elements = struct_fields_source_a; ++ ++ struct_type_b.size = 0; ++ struct_type_b.alignment = 0; ++ struct_type_b.type = FFI_TYPE_STRUCT; ++ struct_type_b.elements = struct_fields_source_b; ++ ++ struct_type_c.size = 0; ++ struct_type_c.alignment = 0; ++ struct_type_c.type = FFI_TYPE_STRUCT; ++ struct_type_c.elements = struct_fields_source_c; ++ ++ struct_fields_source_a[0] = &ffi_type_float; ++ struct_fields_source_a[1] = &ffi_type_float; ++ struct_fields_source_a[2] = NULL; ++ ++ struct_fields_source_b[0] = &ffi_type_float; ++ struct_fields_source_b[1] = &ffi_type_float; ++ struct_fields_source_b[2] = NULL; ++ ++ struct_fields_source_c[0] = &struct_type_a; ++ struct_fields_source_c[1] = &struct_type_b; ++ struct_fields_source_c[2] = NULL; ++ ++ arg_types[0] = &ffi_type_sint32; ++ arg_types[1] = &ffi_type_sint32; ++ arg_types[2] = &ffi_type_sint32; ++ arg_types[3] = &struct_type_c; ++ arg_types[4] = &ffi_type_sint32; ++ arg_types[5] = &ffi_type_sint32; ++ arg_types[6] = &ffi_type_sint32; ++ arg_types[7] = NULL; ++ ++ void *args[7]; ++ args[0] = &k; ++ args[1] = &k; ++ args[2] = &k; ++ args[3] = &source; ++ args[4] = &k; ++ args[5] = &k; ++ args[6] = &k; ++ CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, 7, &struct_type_c, ++ arg_types) == FFI_OK); ++ ++ ffi_call (&cif, FFI_FN (C_fn), &result, args); ++ /* { dg-output "1, 1, 1, 1, 1, 1\n" } */ ++ /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */ ++ CHECK (result.a.a_x == source.a.a_x); ++ CHECK (result.a.a_y == source.a.a_y); ++ CHECK (result.b.b_x == source.b.b_x); ++ CHECK (result.b.b_y == source.b.b_y); ++ exit (0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct2.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct2.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct2.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct2.c +@@ -52,31 +52,31 @@ int main (void) + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + ++ struct A e_dbl = { 1, 7}; ++ struct B f_dbl = {{12 , 127}, 99}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + +- struct A e_dbl = { 1, 7}; +- struct B f_dbl = {{12 , 127}, 99}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_ulong; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct3.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct3.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct3.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct3.c +@@ -53,31 +53,31 @@ int main (void) + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + ++ struct A e_dbl = { 1LL, 7}; ++ struct B f_dbl = {{12LL , 127}, 99}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + +- struct A e_dbl = { 1LL, 7}; +- struct B f_dbl = {{12LL , 127}, 99}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct4.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct4.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct4.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct4.c +@@ -53,31 +53,31 @@ int main (void) + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + ++ struct A e_dbl = { 1.0, 7}; ++ struct B f_dbl = {{12.0 , 127}, 99}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + +- struct A e_dbl = { 1.0, 7}; +- struct B f_dbl = {{12.0 , 127}, 99}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct5.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct5.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct5.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct5.c +@@ -53,31 +53,31 @@ int main (void) + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + ++ struct A e_dbl = { 1.0, 7}; ++ struct B f_dbl = {{12.0 , 127}, 99}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + +- struct A e_dbl = { 1.0, 7}; +- struct B f_dbl = {{12.0 , 127}, 99}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct6.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct6.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct6.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct6.c +@@ -61,37 +61,37 @@ int main (void) + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + ++ struct A e_dbl = { 1.0, 7}; ++ struct B f_dbl = {{12.0 , 127}, 99}; ++ struct C g_dbl = { 2, 9}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + +- struct A e_dbl = { 1.0, 7}; +- struct B f_dbl = {{12.0 , 127}, 99}; +- struct C g_dbl = { 2, 9}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct7.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct7.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct7.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct7.c +@@ -53,31 +53,31 @@ int main (void) + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + ++ struct A e_dbl = { 1LL, 7}; ++ struct B f_dbl = {{12.0 , 127}, 99}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + +- struct A e_dbl = { 1LL, 7}; +- struct B f_dbl = {{12.0 , 127}, 99}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct8.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct8.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct8.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct8.c +@@ -61,37 +61,37 @@ int main (void) + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + ++ struct A e_dbl = { 1LL, 7}; ++ struct B f_dbl = {{12LL , 127}, 99}; ++ struct C g_dbl = { 2LL, 9}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + +- struct A e_dbl = { 1LL, 7}; +- struct B f_dbl = {{12LL , 127}, 99}; +- struct C g_dbl = { 2LL, 9}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct9.c b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct9.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct9.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/nested_struct9.c +@@ -61,37 +61,37 @@ int main (void) + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + ++ struct A e_dbl = { 1, 7LL}; ++ struct B f_dbl = {{12.0 , 127}, 99}; ++ struct C g_dbl = { 2, 9}; ++ ++ struct B res_dbl; ++ + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + +- struct A e_dbl = { 1, 7LL}; +- struct B f_dbl = {{12.0 , 127}, 99}; +- struct C g_dbl = { 2, 9}; +- +- struct B res_dbl; +- + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint64; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/return_dbl.c b/js/src/ctypes/libffi/testsuite/libffi.call/return_dbl.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/return_dbl.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/return_dbl.c +@@ -4,16 +4,17 @@ + PR: none. + Originator: 20050212 */ + + /* { dg-do run } */ + #include "ffitest.h" + + static double return_dbl(double dbl) + { ++ printf ("%f\n", dbl); + return 2 * dbl; + } + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double dbl, rdbl; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/return_sc.c b/js/src/ctypes/libffi/testsuite/libffi.call/return_sc.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/return_sc.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/return_sc.c +@@ -25,12 +25,12 @@ int main (void) + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_schar, args) == FFI_OK); + + for (sc = (signed char) -127; + sc < (signed char) 127; sc++) + { + ffi_call(&cif, FFI_FN(return_sc), &rint, values); +- CHECK(rint == (ffi_arg) sc); ++ CHECK((signed char)rint == sc); + } + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/return_uc.c b/js/src/ctypes/libffi/testsuite/libffi.call/return_uc.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/return_uc.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/return_uc.c +@@ -27,12 +27,12 @@ int main (void) + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uchar, args) == FFI_OK); + + for (uc = (unsigned char) '\x00'; + uc < (unsigned char) '\xff'; uc++) + { + ffi_call(&cif, FFI_FN(return_uc), &rint, values); +- CHECK(rint == (signed int) uc); ++ CHECK((unsigned char)rint == uc); + } + exit(0); + } +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/stret_large.c b/js/src/ctypes/libffi/testsuite/libffi.call/stret_large.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/stret_large.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/stret_large.c +@@ -4,18 +4,18 @@ + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + + /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ + #include "ffitest.h" + +-// 13 FPRs: 104 bytes +-// 14 FPRs: 112 bytes ++/* 13 FPRs: 104 bytes */ ++/* 14 FPRs: 112 bytes */ + + typedef struct struct_108byte { + double a; + double b; + double c; + double d; + double e; + double f; +@@ -77,27 +77,27 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[15]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + +- cls_struct_type.size = 0; +- cls_struct_type.alignment = 0; +- cls_struct_type.type = FFI_TYPE_STRUCT; +- cls_struct_type.elements = cls_struct_fields; +- + struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 }; + struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 }; + struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 }; + struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 }; + struct_108byte res_dbl; + ++ cls_struct_type.size = 0; ++ cls_struct_type.alignment = 0; ++ cls_struct_type.type = FFI_TYPE_STRUCT; ++ cls_struct_type.elements = cls_struct_fields; ++ + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/stret_large2.c b/js/src/ctypes/libffi/testsuite/libffi.call/stret_large2.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/stret_large2.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/stret_large2.c +@@ -4,18 +4,18 @@ + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + + /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ + #include "ffitest.h" + +-// 13 FPRs: 104 bytes +-// 14 FPRs: 112 bytes ++/* 13 FPRs: 104 bytes */ ++/* 14 FPRs: 112 bytes */ + + typedef struct struct_116byte { + double a; + double b; + double c; + double d; + double e; + double f; +@@ -79,27 +79,27 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[16]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + +- cls_struct_type.size = 0; +- cls_struct_type.alignment = 0; +- cls_struct_type.type = FFI_TYPE_STRUCT; +- cls_struct_type.elements = cls_struct_fields; +- + struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 }; + struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 }; + struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 }; + struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 }; + struct_116byte res_dbl; + ++ cls_struct_type.size = 0; ++ cls_struct_type.alignment = 0; ++ cls_struct_type.type = FFI_TYPE_STRUCT; ++ cls_struct_type.elements = cls_struct_fields; ++ + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium.c b/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium.c +@@ -63,27 +63,27 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[10]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + +- cls_struct_type.size = 0; +- cls_struct_type.alignment = 0; +- cls_struct_type.type = FFI_TYPE_STRUCT; +- cls_struct_type.elements = cls_struct_fields; +- + struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 }; + struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 }; + struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 }; + struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 }; + struct_72byte res_dbl; + ++ cls_struct_type.size = 0; ++ cls_struct_type.alignment = 0; ++ cls_struct_type.type = FFI_TYPE_STRUCT; ++ cls_struct_type.elements = cls_struct_fields; ++ + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium2.c b/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium2.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium2.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/stret_medium2.c +@@ -64,27 +64,27 @@ int main (void) + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[10]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + +- cls_struct_type.size = 0; +- cls_struct_type.alignment = 0; +- cls_struct_type.type = FFI_TYPE_STRUCT; +- cls_struct_type.elements = cls_struct_fields; +- + struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 }; + struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 }; + struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 }; + struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 }; + struct_72byte res_dbl; + ++ cls_struct_type.size = 0; ++ cls_struct_type.alignment = 0; ++ cls_struct_type.type = FFI_TYPE_STRUCT; ++ cls_struct_type.elements = cls_struct_fields; ++ + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/strlen.c b/js/src/ctypes/libffi/testsuite/libffi.call/strlen.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/strlen.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/strlen.c +@@ -2,34 +2,34 @@ + Purpose: Check strlen function call. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + + /* { dg-do run } */ + #include "ffitest.h" + +-static size_t my_strlen(char *s) ++static size_t ABI_ATTR my_strlen(char *s) + { + return (strlen(s)); + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + char *s; + + args[0] = &ffi_type_pointer; + values[0] = (void*) &s; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ffi_type_sint, args) == FFI_OK); + + s = "a"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); + CHECK(rint == 1); + + s = "1234567"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/strlen2.c b/js/src/ctypes/libffi/testsuite/libffi.call/strlen2.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/strlen2.c +@@ -0,0 +1,49 @@ ++/* Area: ffi_call ++ Purpose: Check strlen function call with additional arguments. ++ Limitations: none. ++ PR: none. ++ Originator: From the original ffitest.c */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++static size_t ABI_ATTR my_f(char *s, float a) ++{ ++ return (size_t) ((int) strlen(s) + (int) a); ++} ++ ++int main (void) ++{ ++ ffi_cif cif; ++ ffi_type *args[MAX_ARGS]; ++ void *values[MAX_ARGS]; ++ ffi_arg rint; ++ char *s; ++ float v2; ++ args[0] = &ffi_type_pointer; ++ args[1] = &ffi_type_float; ++ values[0] = (void*) &s; ++ values[1] = (void*) &v2; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, ++ &ffi_type_sint, args) == FFI_OK); ++ ++ s = "a"; ++ v2 = 0.0; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 1); ++ ++ s = "1234567"; ++ v2 = -1.0; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 6); ++ ++ s = "1234567890123456789012345"; ++ v2 = 1.0; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 26); ++ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/strlen3.c b/js/src/ctypes/libffi/testsuite/libffi.call/strlen3.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/strlen3.c +@@ -0,0 +1,49 @@ ++/* Area: ffi_call ++ Purpose: Check strlen function call with additional arguments. ++ Limitations: none. ++ PR: none. ++ Originator: From the original ffitest.c */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++static size_t ABI_ATTR my_f(float a, char *s) ++{ ++ return (size_t) ((int) strlen(s) + (int) a); ++} ++ ++int main (void) ++{ ++ ffi_cif cif; ++ ffi_type *args[MAX_ARGS]; ++ void *values[MAX_ARGS]; ++ ffi_arg rint; ++ char *s; ++ float v2; ++ args[1] = &ffi_type_pointer; ++ args[0] = &ffi_type_float; ++ values[1] = (void*) &s; ++ values[0] = (void*) &v2; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, ++ &ffi_type_sint, args) == FFI_OK); ++ ++ s = "a"; ++ v2 = 0.0; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 1); ++ ++ s = "1234567"; ++ v2 = -1.0; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 6); ++ ++ s = "1234567890123456789012345"; ++ v2 = 1.0; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 26); ++ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/strlen4.c b/js/src/ctypes/libffi/testsuite/libffi.call/strlen4.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/strlen4.c +@@ -0,0 +1,55 @@ ++/* Area: ffi_call ++ Purpose: Check strlen function call with additional arguments. ++ Limitations: none. ++ PR: none. ++ Originator: From the original ffitest.c */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++static size_t ABI_ATTR my_f(float a, char *s, int i) ++{ ++ return (size_t) ((int) strlen(s) + (int) a + i); ++} ++ ++int main (void) ++{ ++ ffi_cif cif; ++ ffi_type *args[MAX_ARGS]; ++ void *values[MAX_ARGS]; ++ ffi_arg rint; ++ char *s; ++ int v1; ++ float v2; ++ args[2] = &ffi_type_sint; ++ args[1] = &ffi_type_pointer; ++ args[0] = &ffi_type_float; ++ values[2] = (void*) &v1; ++ values[1] = (void*) &s; ++ values[0] = (void*) &v2; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 3, ++ &ffi_type_sint, args) == FFI_OK); ++ ++ s = "a"; ++ v1 = 1; ++ v2 = 0.0; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 2); ++ ++ s = "1234567"; ++ v2 = -1.0; ++ v1 = -2; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 4); ++ ++ s = "1234567890123456789012345"; ++ v2 = 1.0; ++ v1 = 2; ++ ffi_call(&cif, FFI_FN(my_f), &rint, values); ++ CHECK(rint == 28); ++ ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/strlen_win32.c b/js/src/ctypes/libffi/testsuite/libffi.call/strlen_win32.c +deleted file mode 100644 +--- a/js/src/ctypes/libffi/testsuite/libffi.call/strlen_win32.c ++++ /dev/null +@@ -1,44 +0,0 @@ +-/* Area: ffi_call +- Purpose: Check stdcall strlen call on X86_WIN32 systems. +- Limitations: none. +- PR: none. +- Originator: From the original ffitest.c */ +- +-/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ +- +-#include "ffitest.h" +- +-static size_t __attribute__((stdcall)) my_stdcall_strlen(char *s) +-{ +- return (strlen(s)); +-} +- +-int main (void) +-{ +- ffi_cif cif; +- ffi_type *args[MAX_ARGS]; +- void *values[MAX_ARGS]; +- ffi_arg rint; +- char *s; +- args[0] = &ffi_type_pointer; +- values[0] = (void*) &s; +- +- /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 1, +- &ffi_type_sint, args) == FFI_OK); +- +- s = "a"; +- ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); +- CHECK(rint == 1); +- +- s = "1234567"; +- ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); +- CHECK(rint == 7); +- +- s = "1234567890123456789012345"; +- ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); +- CHECK(rint == 25); +- +- printf("stdcall strlen tests passed\n"); +- exit(0); +-} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct1.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct1.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct1.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct1.c +@@ -9,51 +9,53 @@ + + typedef struct + { + unsigned char uc; + double d; + unsigned int ui; + } test_structure_1; + +-static test_structure_1 struct1(test_structure_1 ts) ++static test_structure_1 ABI_ATTR struct1(test_structure_1 ts) + { + ts.uc++; + ts.d--; + ts.ui++; + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts1_type; + ffi_type *ts1_type_elements[4]; ++ ++ test_structure_1 ts1_arg; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_1 *ts1_result = ++ (test_structure_1 *) malloc (sizeof(test_structure_1)); ++ + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + ts1_type_elements[0] = &ffi_type_uchar; + ts1_type_elements[1] = &ffi_type_double; + ts1_type_elements[2] = &ffi_type_uint; + ts1_type_elements[3] = NULL; + +- test_structure_1 ts1_arg; +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_1 *ts1_result = +- (test_structure_1 *) malloc (sizeof(test_structure_1)); +- + args[0] = &ts1_type; + values[0] = &ts1_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ts1_type, args) == FFI_OK); + + ts1_arg.uc = '\x01'; + ts1_arg.d = 3.14159; + ts1_arg.ui = 555; + + ffi_call(&cif, FFI_FN(struct1), ts1_result, values); + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct2.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct2.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct2.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct2.c +@@ -8,50 +8,50 @@ + #include "ffitest.h" + + typedef struct + { + double d1; + double d2; + } test_structure_2; + +-static test_structure_2 struct2(test_structure_2 ts) ++static test_structure_2 ABI_ATTR struct2(test_structure_2 ts) + { + ts.d1--; + ts.d2--; + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + test_structure_2 ts2_arg; + ffi_type ts2_type; + ffi_type *ts2_type_elements[3]; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_2 *ts2_result = ++ (test_structure_2 *) malloc (sizeof(test_structure_2)); ++ + ts2_type.size = 0; + ts2_type.alignment = 0; + ts2_type.type = FFI_TYPE_STRUCT; + ts2_type.elements = ts2_type_elements; + ts2_type_elements[0] = &ffi_type_double; + ts2_type_elements[1] = &ffi_type_double; + ts2_type_elements[2] = NULL; + +- +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_2 *ts2_result = +- (test_structure_2 *) malloc (sizeof(test_structure_2)); +- + args[0] = &ts2_type; + values[0] = &ts2_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts2_type, args) == FFI_OK); ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts2_type, args) == FFI_OK); + + ts2_arg.d1 = 5.55; + ts2_arg.d2 = 6.66; + + printf ("%g\n", ts2_arg.d1); + printf ("%g\n", ts2_arg.d2); + + ffi_call(&cif, FFI_FN(struct2), ts2_result, values); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct3.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct3.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct3.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct3.c +@@ -7,47 +7,48 @@ + /* { dg-do run } */ + #include "ffitest.h" + + typedef struct + { + int si; + } test_structure_3; + +-static test_structure_3 struct3(test_structure_3 ts) ++static test_structure_3 ABI_ATTR struct3(test_structure_3 ts) + { + ts.si = -(ts.si*2); + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + int compare_value; + ffi_type ts3_type; + ffi_type *ts3_type_elements[2]; ++ ++ test_structure_3 ts3_arg; ++ test_structure_3 *ts3_result = ++ (test_structure_3 *) malloc (sizeof(test_structure_3)); ++ + ts3_type.size = 0; + ts3_type.alignment = 0; + ts3_type.type = FFI_TYPE_STRUCT; + ts3_type.elements = ts3_type_elements; + ts3_type_elements[0] = &ffi_type_sint; + ts3_type_elements[1] = NULL; + +- test_structure_3 ts3_arg; +- test_structure_3 *ts3_result = +- (test_structure_3 *) malloc (sizeof(test_structure_3)); +- + args[0] = &ts3_type; + values[0] = &ts3_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ts3_type, args) == FFI_OK); + + ts3_arg.si = -123; + compare_value = ts3_arg.si; + + ffi_call(&cif, FFI_FN(struct3), ts3_result, values); + + printf ("%d %d\n", ts3_result->si, -(compare_value*2)); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct4.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct4.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct4.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct4.c +@@ -9,50 +9,51 @@ + + typedef struct + { + unsigned ui1; + unsigned ui2; + unsigned ui3; + } test_structure_4; + +-static test_structure_4 struct4(test_structure_4 ts) ++static test_structure_4 ABI_ATTR struct4(test_structure_4 ts) + { + ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3; + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts4_type; + ffi_type *ts4_type_elements[4]; ++ ++ test_structure_4 ts4_arg; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_4 *ts4_result = ++ (test_structure_4 *) malloc (sizeof(test_structure_4)); ++ + ts4_type.size = 0; + ts4_type.alignment = 0; + ts4_type.type = FFI_TYPE_STRUCT; +- test_structure_4 ts4_arg; + ts4_type.elements = ts4_type_elements; + ts4_type_elements[0] = &ffi_type_uint; + ts4_type_elements[1] = &ffi_type_uint; + ts4_type_elements[2] = &ffi_type_uint; + ts4_type_elements[3] = NULL; + +- +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_4 *ts4_result = +- (test_structure_4 *) malloc (sizeof(test_structure_4)); +- + args[0] = &ts4_type; + values[0] = &ts4_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts4_type, args) == FFI_OK); ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK); + + ts4_arg.ui1 = 2; + ts4_arg.ui2 = 3; + ts4_arg.ui3 = 4; + + ffi_call (&cif, FFI_FN(struct4), ts4_result, values); + + CHECK(ts4_result->ui3 == 2U * 3U * 4U); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct5.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct5.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct5.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct5.c +@@ -7,52 +7,53 @@ + /* { dg-do run } */ + #include "ffitest.h" + typedef struct + { + char c1; + char c2; + } test_structure_5; + +-static test_structure_5 struct5(test_structure_5 ts1, test_structure_5 ts2) ++static test_structure_5 ABI_ATTR struct5(test_structure_5 ts1, test_structure_5 ts2) + { + ts1.c1 += ts2.c1; + ts1.c2 -= ts2.c2; + + return ts1; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts5_type; + ffi_type *ts5_type_elements[3]; ++ ++ test_structure_5 ts5_arg1, ts5_arg2; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_5 *ts5_result = ++ (test_structure_5 *) malloc (sizeof(test_structure_5)); ++ + ts5_type.size = 0; + ts5_type.alignment = 0; + ts5_type.type = FFI_TYPE_STRUCT; + ts5_type.elements = ts5_type_elements; + ts5_type_elements[0] = &ffi_type_schar; + ts5_type_elements[1] = &ffi_type_schar; + ts5_type_elements[2] = NULL; + +- test_structure_5 ts5_arg1, ts5_arg2; +- +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_5 *ts5_result = +- (test_structure_5 *) malloc (sizeof(test_structure_5)); +- + args[0] = &ts5_type; + args[1] = &ts5_type; + values[0] = &ts5_arg1; + values[1] = &ts5_arg2; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ts5_type, args) == FFI_OK); ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts5_type, args) == FFI_OK); + + ts5_arg1.c1 = 2; + ts5_arg1.c2 = 6; + ts5_arg2.c1 = 5; + ts5_arg2.c2 = 3; + + ffi_call (&cif, FFI_FN(struct5), ts5_result, values); + +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct6.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct6.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct6.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct6.c +@@ -7,51 +7,51 @@ + /* { dg-do run } */ + #include "ffitest.h" + typedef struct + { + float f; + double d; + } test_structure_6; + +-static test_structure_6 struct6 (test_structure_6 ts) ++static test_structure_6 ABI_ATTR struct6 (test_structure_6 ts) + { + ts.f += 1; + ts.d += 1; + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts6_type; + ffi_type *ts6_type_elements[3]; ++ ++ test_structure_6 ts6_arg; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_6 *ts6_result = ++ (test_structure_6 *) malloc (sizeof(test_structure_6)); ++ + ts6_type.size = 0; + ts6_type.alignment = 0; + ts6_type.type = FFI_TYPE_STRUCT; + ts6_type.elements = ts6_type_elements; + ts6_type_elements[0] = &ffi_type_float; + ts6_type_elements[1] = &ffi_type_double; + ts6_type_elements[2] = NULL; + +- +- test_structure_6 ts6_arg; +- +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_6 *ts6_result = +- (test_structure_6 *) malloc (sizeof(test_structure_6)); +- + args[0] = &ts6_type; + values[0] = &ts6_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts6_type, args) == FFI_OK); ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts6_type, args) == FFI_OK); + + ts6_arg.f = 5.55f; + ts6_arg.d = 6.66; + + printf ("%g\n", ts6_arg.f); + printf ("%g\n", ts6_arg.d); + + ffi_call(&cif, FFI_FN(struct6), ts6_result, values); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct7.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct7.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct7.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct7.c +@@ -8,53 +8,53 @@ + #include "ffitest.h" + typedef struct + { + float f1; + float f2; + double d; + } test_structure_7; + +-static test_structure_7 struct7 (test_structure_7 ts) ++static test_structure_7 ABI_ATTR struct7 (test_structure_7 ts) + { + ts.f1 += 1; + ts.f2 += 1; + ts.d += 1; + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts7_type; + ffi_type *ts7_type_elements[4]; ++ ++ test_structure_7 ts7_arg; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_7 *ts7_result = ++ (test_structure_7 *) malloc (sizeof(test_structure_7)); ++ + ts7_type.size = 0; + ts7_type.alignment = 0; + ts7_type.type = FFI_TYPE_STRUCT; + ts7_type.elements = ts7_type_elements; + ts7_type_elements[0] = &ffi_type_float; + ts7_type_elements[1] = &ffi_type_float; + ts7_type_elements[2] = &ffi_type_double; + ts7_type_elements[3] = NULL; + +- +- test_structure_7 ts7_arg; +- +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_7 *ts7_result = +- (test_structure_7 *) malloc (sizeof(test_structure_7)); +- + args[0] = &ts7_type; + values[0] = &ts7_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts7_type, args) == FFI_OK); ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts7_type, args) == FFI_OK); + + ts7_arg.f1 = 5.55f; + ts7_arg.f2 = 55.5f; + ts7_arg.d = 6.66; + + printf ("%g\n", ts7_arg.f1); + printf ("%g\n", ts7_arg.f2); + printf ("%g\n", ts7_arg.d); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct8.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct8.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct8.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct8.c +@@ -9,54 +9,55 @@ + typedef struct + { + float f1; + float f2; + float f3; + float f4; + } test_structure_8; + +-static test_structure_8 struct8 (test_structure_8 ts) ++static test_structure_8 ABI_ATTR struct8 (test_structure_8 ts) + { + ts.f1 += 1; + ts.f2 += 1; + ts.f3 += 1; + ts.f4 += 1; + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts8_type; + ffi_type *ts8_type_elements[5]; ++ ++ test_structure_8 ts8_arg; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_8 *ts8_result = ++ (test_structure_8 *) malloc (sizeof(test_structure_8)); ++ + ts8_type.size = 0; + ts8_type.alignment = 0; + ts8_type.type = FFI_TYPE_STRUCT; + ts8_type.elements = ts8_type_elements; + ts8_type_elements[0] = &ffi_type_float; + ts8_type_elements[1] = &ffi_type_float; + ts8_type_elements[2] = &ffi_type_float; + ts8_type_elements[3] = &ffi_type_float; + ts8_type_elements[4] = NULL; + +- test_structure_8 ts8_arg; +- +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_8 *ts8_result = +- (test_structure_8 *) malloc (sizeof(test_structure_8)); +- + args[0] = &ts8_type; + values[0] = &ts8_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts8_type, args) == FFI_OK); ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts8_type, args) == FFI_OK); + + ts8_arg.f1 = 5.55f; + ts8_arg.f2 = 55.5f; + ts8_arg.f3 = -5.55f; + ts8_arg.f4 = -55.5f; + + printf ("%g\n", ts8_arg.f1); + printf ("%g\n", ts8_arg.f2); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/struct9.c b/js/src/ctypes/libffi/testsuite/libffi.call/struct9.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/struct9.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/struct9.c +@@ -8,50 +8,51 @@ + #include "ffitest.h" + + typedef struct + { + float f; + int i; + } test_structure_9; + +-static test_structure_9 struct9 (test_structure_9 ts) ++static test_structure_9 ABI_ATTR struct9 (test_structure_9 ts) + { + ts.f += 1; + ts.i += 1; + + return ts; + } + + int main (void) + { + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts9_type; + ffi_type *ts9_type_elements[3]; ++ ++ test_structure_9 ts9_arg; ++ ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_9 *ts9_result = ++ (test_structure_9 *) malloc (sizeof(test_structure_9)); ++ + ts9_type.size = 0; + ts9_type.alignment = 0; + ts9_type.type = FFI_TYPE_STRUCT; + ts9_type.elements = ts9_type_elements; + ts9_type_elements[0] = &ffi_type_float; + ts9_type_elements[1] = &ffi_type_sint; + ts9_type_elements[2] = NULL; + +- test_structure_9 ts9_arg; +- +- /* This is a hack to get a properly aligned result buffer */ +- test_structure_9 *ts9_result = +- (test_structure_9 *) malloc (sizeof(test_structure_9)); +- + args[0] = &ts9_type; + values[0] = &ts9_arg; + + /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts9_type, args) == FFI_OK); ++ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts9_type, args) == FFI_OK); + + ts9_arg.f = 5.55f; + ts9_arg.i = 5; + + printf ("%g\n", ts9_arg.f); + printf ("%d\n", ts9_arg.i); + + ffi_call(&cif, FFI_FN(struct9), ts9_result, values); +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/testclosure.c b/js/src/ctypes/libffi/testsuite/libffi.call/testclosure.c +--- a/js/src/ctypes/libffi/testsuite/libffi.call/testclosure.c ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/testclosure.c +@@ -38,23 +38,23 @@ int main (void) + { + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* cls_struct_fields0[5]; + ffi_type cls_struct_type0; + ffi_type* dbl_arg_types[5]; + ++ struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; ++ + cls_struct_type0.size = 0; + cls_struct_type0.alignment = 0; + cls_struct_type0.type = FFI_TYPE_STRUCT; + cls_struct_type0.elements = cls_struct_fields0; + +- struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; +- + cls_struct_fields0[0] = &ffi_type_float; + cls_struct_fields0[1] = &ffi_type_float; + cls_struct_fields0[2] = &ffi_type_float; + cls_struct_fields0[3] = &ffi_type_float; + cls_struct_fields0[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type0; + dbl_arg_types[1] = NULL; +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/uninitialized.c b/js/src/ctypes/libffi/testsuite/libffi.call/uninitialized.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/uninitialized.c +@@ -0,0 +1,61 @@ ++/* { dg-do run } */ ++#include "ffitest.h" ++ ++typedef struct ++{ ++ unsigned char uc; ++ double d; ++ unsigned int ui; ++} test_structure_1; ++ ++static test_structure_1 struct1(test_structure_1 ts) ++{ ++ ts.uc++; ++ ts.d--; ++ ts.ui++; ++ ++ return ts; ++} ++ ++int main (void) ++{ ++ ffi_cif cif; ++ ffi_type *args[MAX_ARGS]; ++ void *values[MAX_ARGS]; ++ ffi_type ts1_type; ++ ffi_type *ts1_type_elements[4]; ++ ++ memset(&cif, 1, sizeof(cif)); ++ ts1_type.size = 0; ++ ts1_type.alignment = 0; ++ ts1_type.type = FFI_TYPE_STRUCT; ++ ts1_type.elements = ts1_type_elements; ++ ts1_type_elements[0] = &ffi_type_uchar; ++ ts1_type_elements[1] = &ffi_type_double; ++ ts1_type_elements[2] = &ffi_type_uint; ++ ts1_type_elements[3] = NULL; ++ ++ test_structure_1 ts1_arg; ++ /* This is a hack to get a properly aligned result buffer */ ++ test_structure_1 *ts1_result = ++ (test_structure_1 *) malloc (sizeof(test_structure_1)); ++ ++ args[0] = &ts1_type; ++ values[0] = &ts1_arg; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ts1_type, args) == FFI_OK); ++ ++ ts1_arg.uc = '\x01'; ++ ts1_arg.d = 3.14159; ++ ts1_arg.ui = 555; ++ ++ ffi_call(&cif, FFI_FN(struct1), ts1_result, values); ++ ++ CHECK(ts1_result->ui == 556); ++ CHECK(ts1_result->d == 3.14159 - 1); ++ ++ free (ts1_result); ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/unwindtest.cc b/js/src/ctypes/libffi/testsuite/libffi.call/unwindtest.cc +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/unwindtest.cc +@@ -0,0 +1,117 @@ ++/* Area: ffi_closure, unwind info ++ Purpose: Check if the unwind information is passed correctly. ++ Limitations: none. ++ PR: none. ++ Originator: Jeff Sturm */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++void ABI_ATTR ++closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, ++ void** args __UNUSED__, void* userdata __UNUSED__) ++{ ++ throw 9; ++} ++ ++typedef void (*closure_test_type)(); ++ ++void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, ++ void** args, void* userdata __UNUSED__) ++ { ++ *(ffi_arg*)resp = ++ (int)*(float *)args[0] +(int)(*(float *)args[1]) + ++ (int)(*(float *)args[2]) + (int)*(float *)args[3] + ++ (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + ++ (int)*(float *)args[6] + (int)(*(int *)args[7]) + ++ (int)(*(double*)args[8]) + (int)*(int *)args[9] + ++ (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + ++ (int)*(int *)args[12] + (int)(*(int *)args[13]) + ++ (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata; ++ ++ printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", ++ (int)*(float *)args[0], (int)(*(float *)args[1]), ++ (int)(*(float *)args[2]), (int)*(float *)args[3], ++ (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), ++ (int)*(float *)args[6], (int)(*(int *)args[7]), ++ (int)(*(double *)args[8]), (int)*(int *)args[9], ++ (int)(*(int *)args[10]), (int)(*(float *)args[11]), ++ (int)*(int *)args[12], (int)(*(int *)args[13]), ++ (int)(*(int *)args[14]), *(int *)args[15], ++ (int)(intptr_t)userdata, (int)*(ffi_arg*)resp); ++ ++ throw (int)*(ffi_arg*)resp; ++} ++ ++typedef int (*closure_test_type1)(float, float, float, float, signed short, ++ float, float, int, double, int, int, float, ++ int, int, int, int); ++ ++int main (void) ++{ ++ ffi_cif cif; ++ void *code; ++ ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code); ++ ffi_type * cl_arg_types[17]; ++ ++ { ++ cl_arg_types[1] = NULL; ++ ++ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, ++ &ffi_type_void, cl_arg_types) == FFI_OK); ++ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK); ++ ++ try ++ { ++ (*((closure_test_type)(code)))(); ++ } catch (int exception_code) ++ { ++ CHECK(exception_code == 9); ++ } ++ ++ printf("part one OK\n"); ++ /* { dg-output "part one OK" } */ ++ } ++ ++ { ++ ++ cl_arg_types[0] = &ffi_type_float; ++ cl_arg_types[1] = &ffi_type_float; ++ cl_arg_types[2] = &ffi_type_float; ++ cl_arg_types[3] = &ffi_type_float; ++ cl_arg_types[4] = &ffi_type_sshort; ++ cl_arg_types[5] = &ffi_type_float; ++ cl_arg_types[6] = &ffi_type_float; ++ cl_arg_types[7] = &ffi_type_uint; ++ cl_arg_types[8] = &ffi_type_double; ++ cl_arg_types[9] = &ffi_type_uint; ++ cl_arg_types[10] = &ffi_type_uint; ++ cl_arg_types[11] = &ffi_type_float; ++ cl_arg_types[12] = &ffi_type_uint; ++ cl_arg_types[13] = &ffi_type_uint; ++ cl_arg_types[14] = &ffi_type_uint; ++ cl_arg_types[15] = &ffi_type_uint; ++ cl_arg_types[16] = NULL; ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, ++ &ffi_type_sint, cl_arg_types) == FFI_OK); ++ ++ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, ++ (void *) 3 /* userdata */, code) == FFI_OK); ++ try ++ { ++ (*((closure_test_type1)code)) ++ (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, ++ 19, 21, 1); ++ /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ ++ } catch (int exception_code) ++ { ++ CHECK(exception_code == 255); ++ } ++ printf("part two OK\n"); ++ /* { dg-output "\npart two OK" } */ ++ } ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc b/js/src/ctypes/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +@@ -0,0 +1,54 @@ ++/* Area: ffi_call, unwind info ++ Purpose: Check if the unwind information is passed correctly. ++ Limitations: none. ++ PR: none. ++ Originator: Andreas Tobler 20061213 */ ++ ++/* { dg-do run } */ ++ ++#include "ffitest.h" ++ ++static int checking(int a __UNUSED__, short b __UNUSED__, ++ signed char c __UNUSED__) ++{ ++ throw 9; ++} ++ ++int main (void) ++{ ++ ffi_cif cif; ++ ffi_type *args[MAX_ARGS]; ++ void *values[MAX_ARGS]; ++ ffi_arg rint; ++ ++ signed int si; ++ signed short ss; ++ signed char sc; ++ ++ args[0] = &ffi_type_sint; ++ values[0] = &si; ++ args[1] = &ffi_type_sshort; ++ values[1] = &ss; ++ args[2] = &ffi_type_schar; ++ values[2] = ≻ ++ ++ /* Initialize the cif */ ++ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, ++ &ffi_type_sint, args) == FFI_OK); ++ ++ si = -6; ++ ss = -12; ++ sc = -1; ++ { ++ try ++ { ++ ffi_call(&cif, FFI_FN(checking), &rint, values); ++ } catch (int exception_code) ++ { ++ CHECK(exception_code == 9); ++ } ++ printf("part one OK\n"); ++ /* { dg-output "part one OK" } */ ++ } ++ exit(0); ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/va_1.c b/js/src/ctypes/libffi/testsuite/libffi.call/va_1.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/va_1.c +@@ -0,0 +1,196 @@ ++/* Area: ffi_call ++ Purpose: Test passing struct in variable argument lists. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++/* { dg-output "" { xfail avr32*-*-* } } */ ++ ++#include "ffitest.h" ++#include ++ ++struct small_tag ++{ ++ unsigned char a; ++ unsigned char b; ++}; ++ ++struct large_tag ++{ ++ unsigned a; ++ unsigned b; ++ unsigned c; ++ unsigned d; ++ unsigned e; ++}; ++ ++static int ++test_fn (int n, ...) ++{ ++ va_list ap; ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l; ++ unsigned char uc; ++ signed char sc; ++ unsigned short us; ++ signed short ss; ++ unsigned int ui; ++ signed int si; ++ unsigned long ul; ++ signed long sl; ++ float f; ++ double d; ++ ++ va_start (ap, n); ++ s1 = va_arg (ap, struct small_tag); ++ l = va_arg (ap, struct large_tag); ++ s2 = va_arg (ap, struct small_tag); ++ ++ uc = va_arg (ap, unsigned); ++ sc = va_arg (ap, signed); ++ ++ us = va_arg (ap, unsigned); ++ ss = va_arg (ap, signed); ++ ++ ui = va_arg (ap, unsigned int); ++ si = va_arg (ap, signed int); ++ ++ ul = va_arg (ap, unsigned long); ++ sl = va_arg (ap, signed long); ++ ++ f = va_arg (ap, double); /* C standard promotes float->double ++ when anonymous */ ++ d = va_arg (ap, double); ++ ++ printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n", ++ s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, ++ s2.a, s2.b, ++ uc, sc, ++ us, ss, ++ ui, si, ++ ul, sl, ++ f, d); ++ va_end (ap); ++ return n + 1; ++} ++ ++int ++main (void) ++{ ++ ffi_cif cif; ++ void* args[15]; ++ ffi_type* arg_types[15]; ++ ++ ffi_type s_type; ++ ffi_type *s_type_elements[3]; ++ ++ ffi_type l_type; ++ ffi_type *l_type_elements[6]; ++ ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l1; ++ ++ int n; ++ ffi_arg res; ++ ++ unsigned char uc; ++ signed char sc; ++ unsigned short us; ++ signed short ss; ++ unsigned int ui; ++ signed int si; ++ unsigned long ul; ++ signed long sl; ++ double d1; ++ double f1; ++ ++ s_type.size = 0; ++ s_type.alignment = 0; ++ s_type.type = FFI_TYPE_STRUCT; ++ s_type.elements = s_type_elements; ++ ++ s_type_elements[0] = &ffi_type_uchar; ++ s_type_elements[1] = &ffi_type_uchar; ++ s_type_elements[2] = NULL; ++ ++ l_type.size = 0; ++ l_type.alignment = 0; ++ l_type.type = FFI_TYPE_STRUCT; ++ l_type.elements = l_type_elements; ++ ++ l_type_elements[0] = &ffi_type_uint; ++ l_type_elements[1] = &ffi_type_uint; ++ l_type_elements[2] = &ffi_type_uint; ++ l_type_elements[3] = &ffi_type_uint; ++ l_type_elements[4] = &ffi_type_uint; ++ l_type_elements[5] = NULL; ++ ++ arg_types[0] = &ffi_type_sint; ++ arg_types[1] = &s_type; ++ arg_types[2] = &l_type; ++ arg_types[3] = &s_type; ++ arg_types[4] = &ffi_type_uchar; ++ arg_types[5] = &ffi_type_schar; ++ arg_types[6] = &ffi_type_ushort; ++ arg_types[7] = &ffi_type_sshort; ++ arg_types[8] = &ffi_type_uint; ++ arg_types[9] = &ffi_type_sint; ++ arg_types[10] = &ffi_type_ulong; ++ arg_types[11] = &ffi_type_slong; ++ arg_types[12] = &ffi_type_double; ++ arg_types[13] = &ffi_type_double; ++ arg_types[14] = NULL; ++ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK); ++ ++ s1.a = 5; ++ s1.b = 6; ++ ++ l1.a = 10; ++ l1.b = 11; ++ l1.c = 12; ++ l1.d = 13; ++ l1.e = 14; ++ ++ s2.a = 7; ++ s2.b = 8; ++ ++ n = 41; ++ ++ uc = 9; ++ sc = 10; ++ us = 11; ++ ss = 12; ++ ui = 13; ++ si = 14; ++ ul = 15; ++ sl = 16; ++ f1 = 2.12; ++ d1 = 3.13; ++ ++ args[0] = &n; ++ args[1] = &s1; ++ args[2] = &l1; ++ args[3] = &s2; ++ args[4] = &uc; ++ args[5] = ≻ ++ args[6] = &us; ++ args[7] = &ss; ++ args[8] = &ui; ++ args[9] = &si; ++ args[10] = &ul; ++ args[11] = &sl; ++ args[12] = &f1; ++ args[13] = &d1; ++ args[14] = NULL; ++ ++ ffi_call(&cif, FFI_FN(test_fn), &res, args); ++ /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */ ++ printf("res: %d\n", (int) res); ++ /* { dg-output "\nres: 42" } */ ++ ++ return 0; ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/va_struct1.c b/js/src/ctypes/libffi/testsuite/libffi.call/va_struct1.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/va_struct1.c +@@ -0,0 +1,121 @@ ++/* Area: ffi_call ++ Purpose: Test passing struct in variable argument lists. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++/* { dg-output "" { xfail avr32*-*-* } } */ ++ ++#include "ffitest.h" ++#include ++ ++struct small_tag ++{ ++ unsigned char a; ++ unsigned char b; ++}; ++ ++struct large_tag ++{ ++ unsigned a; ++ unsigned b; ++ unsigned c; ++ unsigned d; ++ unsigned e; ++}; ++ ++static int ++test_fn (int n, ...) ++{ ++ va_list ap; ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l; ++ ++ va_start (ap, n); ++ s1 = va_arg (ap, struct small_tag); ++ l = va_arg (ap, struct large_tag); ++ s2 = va_arg (ap, struct small_tag); ++ printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, ++ s2.a, s2.b); ++ va_end (ap); ++ return n + 1; ++} ++ ++int ++main (void) ++{ ++ ffi_cif cif; ++ void* args[5]; ++ ffi_type* arg_types[5]; ++ ++ ffi_type s_type; ++ ffi_type *s_type_elements[3]; ++ ++ ffi_type l_type; ++ ffi_type *l_type_elements[6]; ++ ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l1; ++ ++ int n; ++ ffi_arg res; ++ ++ s_type.size = 0; ++ s_type.alignment = 0; ++ s_type.type = FFI_TYPE_STRUCT; ++ s_type.elements = s_type_elements; ++ ++ s_type_elements[0] = &ffi_type_uchar; ++ s_type_elements[1] = &ffi_type_uchar; ++ s_type_elements[2] = NULL; ++ ++ l_type.size = 0; ++ l_type.alignment = 0; ++ l_type.type = FFI_TYPE_STRUCT; ++ l_type.elements = l_type_elements; ++ ++ l_type_elements[0] = &ffi_type_uint; ++ l_type_elements[1] = &ffi_type_uint; ++ l_type_elements[2] = &ffi_type_uint; ++ l_type_elements[3] = &ffi_type_uint; ++ l_type_elements[4] = &ffi_type_uint; ++ l_type_elements[5] = NULL; ++ ++ arg_types[0] = &ffi_type_sint; ++ arg_types[1] = &s_type; ++ arg_types[2] = &l_type; ++ arg_types[3] = &s_type; ++ arg_types[4] = NULL; ++ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK); ++ ++ s1.a = 5; ++ s1.b = 6; ++ ++ l1.a = 10; ++ l1.b = 11; ++ l1.c = 12; ++ l1.d = 13; ++ l1.e = 14; ++ ++ s2.a = 7; ++ s2.b = 8; ++ ++ n = 41; ++ ++ args[0] = &n; ++ args[1] = &s1; ++ args[2] = &l1; ++ args[3] = &s2; ++ args[4] = NULL; ++ ++ ffi_call(&cif, FFI_FN(test_fn), &res, args); ++ /* { dg-output "5 6 10 11 12 13 14 7 8" } */ ++ printf("res: %d\n", (int) res); ++ /* { dg-output "\nres: 42" } */ ++ ++ return 0; ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/va_struct2.c b/js/src/ctypes/libffi/testsuite/libffi.call/va_struct2.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/va_struct2.c +@@ -0,0 +1,123 @@ ++/* Area: ffi_call ++ Purpose: Test passing struct in variable argument lists. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++/* { dg-output "" { xfail avr32*-*-* } } */ ++ ++#include "ffitest.h" ++#include ++ ++struct small_tag ++{ ++ unsigned char a; ++ unsigned char b; ++}; ++ ++struct large_tag ++{ ++ unsigned a; ++ unsigned b; ++ unsigned c; ++ unsigned d; ++ unsigned e; ++}; ++ ++static struct small_tag ++test_fn (int n, ...) ++{ ++ va_list ap; ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l; ++ ++ va_start (ap, n); ++ s1 = va_arg (ap, struct small_tag); ++ l = va_arg (ap, struct large_tag); ++ s2 = va_arg (ap, struct small_tag); ++ printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, ++ s2.a, s2.b); ++ va_end (ap); ++ s1.a += s2.a; ++ s1.b += s2.b; ++ return s1; ++} ++ ++int ++main (void) ++{ ++ ffi_cif cif; ++ void* args[5]; ++ ffi_type* arg_types[5]; ++ ++ ffi_type s_type; ++ ffi_type *s_type_elements[3]; ++ ++ ffi_type l_type; ++ ffi_type *l_type_elements[6]; ++ ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l1; ++ ++ int n; ++ struct small_tag res; ++ ++ s_type.size = 0; ++ s_type.alignment = 0; ++ s_type.type = FFI_TYPE_STRUCT; ++ s_type.elements = s_type_elements; ++ ++ s_type_elements[0] = &ffi_type_uchar; ++ s_type_elements[1] = &ffi_type_uchar; ++ s_type_elements[2] = NULL; ++ ++ l_type.size = 0; ++ l_type.alignment = 0; ++ l_type.type = FFI_TYPE_STRUCT; ++ l_type.elements = l_type_elements; ++ ++ l_type_elements[0] = &ffi_type_uint; ++ l_type_elements[1] = &ffi_type_uint; ++ l_type_elements[2] = &ffi_type_uint; ++ l_type_elements[3] = &ffi_type_uint; ++ l_type_elements[4] = &ffi_type_uint; ++ l_type_elements[5] = NULL; ++ ++ arg_types[0] = &ffi_type_sint; ++ arg_types[1] = &s_type; ++ arg_types[2] = &l_type; ++ arg_types[3] = &s_type; ++ arg_types[4] = NULL; ++ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &s_type, arg_types) == FFI_OK); ++ ++ s1.a = 5; ++ s1.b = 6; ++ ++ l1.a = 10; ++ l1.b = 11; ++ l1.c = 12; ++ l1.d = 13; ++ l1.e = 14; ++ ++ s2.a = 7; ++ s2.b = 8; ++ ++ n = 41; ++ ++ args[0] = &n; ++ args[1] = &s1; ++ args[2] = &l1; ++ args[3] = &s2; ++ args[4] = NULL; ++ ++ ffi_call(&cif, FFI_FN(test_fn), &res, args); ++ /* { dg-output "5 6 10 11 12 13 14 7 8" } */ ++ printf("res: %d %d\n", res.a, res.b); ++ /* { dg-output "\nres: 12 14" } */ ++ ++ return 0; ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/va_struct3.c b/js/src/ctypes/libffi/testsuite/libffi.call/va_struct3.c +new file mode 100644 +--- /dev/null ++++ b/js/src/ctypes/libffi/testsuite/libffi.call/va_struct3.c +@@ -0,0 +1,125 @@ ++/* Area: ffi_call ++ Purpose: Test passing struct in variable argument lists. ++ Limitations: none. ++ PR: none. ++ Originator: ARM Ltd. */ ++ ++/* { dg-do run } */ ++/* { dg-output "" { xfail avr32*-*-* } } */ ++ ++#include "ffitest.h" ++#include ++ ++struct small_tag ++{ ++ unsigned char a; ++ unsigned char b; ++}; ++ ++struct large_tag ++{ ++ unsigned a; ++ unsigned b; ++ unsigned c; ++ unsigned d; ++ unsigned e; ++}; ++ ++static struct large_tag ++test_fn (int n, ...) ++{ ++ va_list ap; ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l; ++ ++ va_start (ap, n); ++ s1 = va_arg (ap, struct small_tag); ++ l = va_arg (ap, struct large_tag); ++ s2 = va_arg (ap, struct small_tag); ++ printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, ++ s2.a, s2.b); ++ va_end (ap); ++ l.a += s1.a; ++ l.b += s1.b; ++ l.c += s2.a; ++ l.d += s2.b; ++ return l; ++} ++ ++int ++main (void) ++{ ++ ffi_cif cif; ++ void* args[5]; ++ ffi_type* arg_types[5]; ++ ++ ffi_type s_type; ++ ffi_type *s_type_elements[3]; ++ ++ ffi_type l_type; ++ ffi_type *l_type_elements[6]; ++ ++ struct small_tag s1; ++ struct small_tag s2; ++ struct large_tag l1; ++ ++ int n; ++ struct large_tag res; ++ ++ s_type.size = 0; ++ s_type.alignment = 0; ++ s_type.type = FFI_TYPE_STRUCT; ++ s_type.elements = s_type_elements; ++ ++ s_type_elements[0] = &ffi_type_uchar; ++ s_type_elements[1] = &ffi_type_uchar; ++ s_type_elements[2] = NULL; ++ ++ l_type.size = 0; ++ l_type.alignment = 0; ++ l_type.type = FFI_TYPE_STRUCT; ++ l_type.elements = l_type_elements; ++ ++ l_type_elements[0] = &ffi_type_uint; ++ l_type_elements[1] = &ffi_type_uint; ++ l_type_elements[2] = &ffi_type_uint; ++ l_type_elements[3] = &ffi_type_uint; ++ l_type_elements[4] = &ffi_type_uint; ++ l_type_elements[5] = NULL; ++ ++ arg_types[0] = &ffi_type_sint; ++ arg_types[1] = &s_type; ++ arg_types[2] = &l_type; ++ arg_types[3] = &s_type; ++ arg_types[4] = NULL; ++ ++ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &l_type, arg_types) == FFI_OK); ++ ++ s1.a = 5; ++ s1.b = 6; ++ ++ l1.a = 10; ++ l1.b = 11; ++ l1.c = 12; ++ l1.d = 13; ++ l1.e = 14; ++ ++ s2.a = 7; ++ s2.b = 8; ++ ++ n = 41; ++ ++ args[0] = &n; ++ args[1] = &s1; ++ args[2] = &l1; ++ args[3] = &s2; ++ args[4] = NULL; ++ ++ ffi_call(&cif, FFI_FN(test_fn), &res, args); ++ /* { dg-output "5 6 10 11 12 13 14 7 8" } */ ++ printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e); ++ /* { dg-output "\nres: 15 17 19 21 14" } */ ++ ++ return 0; ++} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.special/ffitestcxx.h b/js/src/ctypes/libffi/testsuite/libffi.special/ffitestcxx.h +deleted file mode 100644 +--- a/js/src/ctypes/libffi/testsuite/libffi.special/ffitestcxx.h ++++ /dev/null +@@ -1,96 +0,0 @@ +-#include +-#include +-#include +-#include +-#include "fficonfig.h" +- +-#define MAX_ARGS 256 +- +- +-/* Define __UNUSED__ that also other compilers than gcc can run the tests. */ +-#undef __UNUSED__ +-#if defined(__GNUC__) +-#define __UNUSED__ __attribute__((__unused__)) +-#else +-#define __UNUSED__ +-#endif +- +-#define CHECK(x) (!(x) ? abort() : (void)0) +- +-/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a +- file open. */ +-#ifdef HAVE_MMAP_ANON +-# undef HAVE_MMAP_DEV_ZERO +- +-# include +-# ifndef MAP_FAILED +-# define MAP_FAILED -1 +-# endif +-# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) +-# define MAP_ANONYMOUS MAP_ANON +-# endif +-# define USING_MMAP +- +-#endif +- +-#ifdef HAVE_MMAP_DEV_ZERO +- +-# include +-# ifndef MAP_FAILED +-# define MAP_FAILED -1 +-# endif +-# define USING_MMAP +- +-#endif +- +- +-/* MinGW kludge. */ +-#ifdef _WIN64 +-#define PRIdLL "I64d" +-#define PRIuLL "I64u" +-#else +-#define PRIdLL "lld" +-#define PRIuLL "llu" +-#endif +- +-#ifdef USING_MMAP +-static inline void * +-allocate_mmap (size_t size) +-{ +- void *page; +-#if defined (HAVE_MMAP_DEV_ZERO) +- static int dev_zero_fd = -1; +-#endif +- +-#ifdef HAVE_MMAP_DEV_ZERO +- if (dev_zero_fd == -1) +- { +- dev_zero_fd = open ("/dev/zero", O_RDONLY); +- if (dev_zero_fd == -1) +- { +- perror ("open /dev/zero: %m"); +- exit (1); +- } +- } +-#endif +- +- +-#ifdef HAVE_MMAP_ANON +- page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, +- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +-#endif +-#ifdef HAVE_MMAP_DEV_ZERO +- page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, +- MAP_PRIVATE, dev_zero_fd, 0); +-#endif +- +- if (page == (char *) MAP_FAILED) +- { +- perror ("virtual memory exhausted"); +- exit (1); +- } +- +- return page; +-} +- +-#endif +diff --git a/js/src/ctypes/libffi/testsuite/libffi.special/special.exp b/js/src/ctypes/libffi/testsuite/libffi.special/special.exp +deleted file mode 100644 +--- a/js/src/ctypes/libffi/testsuite/libffi.special/special.exp ++++ /dev/null +@@ -1,37 +0,0 @@ +-# Copyright (C) 2003, 2006, 2009 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 3 of the License, or +-# (at your option) any later version. +-# +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; see the file COPYING3. If not see +-# . +- +-load_lib libffi-dg.exp +- +-dg-init +-libffi-init +- +-global srcdir subdir +- +-global cxx_options +- +-set cxx_options " -shared-libgcc -lstdc++" +- +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O0 -W -Wall" +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O2" +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O3" +-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-Os" +- +-dg-finish +- +-# Local Variables: +-# tcl-indent-level:4 +-# End: +diff --git a/js/src/ctypes/libffi/testsuite/libffi.special/unwindtest.cc b/js/src/ctypes/libffi/testsuite/libffi.special/unwindtest.cc +deleted file mode 100644 +--- a/js/src/ctypes/libffi/testsuite/libffi.special/unwindtest.cc ++++ /dev/null +@@ -1,124 +0,0 @@ +-/* Area: ffi_closure, unwind info +- Purpose: Check if the unwind information is passed correctly. +- Limitations: none. +- PR: none. +- Originator: Jeff Sturm */ +- +-/* { dg-do run } */ +-#include "ffitestcxx.h" +- +-#if defined HAVE_STDINT_H +-#include +-#endif +- +-#if defined HAVE_INTTYPES_H +-#include +-#endif +- +-void +-closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, +- void** args __UNUSED__, void* userdata __UNUSED__) +-{ +- throw 9; +-} +- +-typedef void (*closure_test_type)(); +- +-void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, +- void** args, void* userdata __UNUSED__) +- { +- *(ffi_arg*)resp = +- (int)*(float *)args[0] +(int)(*(float *)args[1]) + +- (int)(*(float *)args[2]) + (int)*(float *)args[3] + +- (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + +- (int)*(float *)args[6] + (int)(*(int *)args[7]) + +- (int)(*(double*)args[8]) + (int)*(int *)args[9] + +- (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + +- (int)*(int *)args[12] + (int)(*(int *)args[13]) + +- (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata; +- +- printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", +- (int)*(float *)args[0], (int)(*(float *)args[1]), +- (int)(*(float *)args[2]), (int)*(float *)args[3], +- (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), +- (int)*(float *)args[6], (int)(*(int *)args[7]), +- (int)(*(double *)args[8]), (int)*(int *)args[9], +- (int)(*(int *)args[10]), (int)(*(float *)args[11]), +- (int)*(int *)args[12], (int)(*(int *)args[13]), +- (int)(*(int *)args[14]), *(int *)args[15], +- (int)(intptr_t)userdata, (int)*(ffi_arg*)resp); +- +- throw (int)*(ffi_arg*)resp; +-} +- +-typedef int (*closure_test_type1)(float, float, float, float, signed short, +- float, float, int, double, int, int, float, +- int, int, int, int); +- +-int main (void) +-{ +- ffi_cif cif; +- void *code; +- ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code); +- ffi_type * cl_arg_types[17]; +- +- { +- cl_arg_types[1] = NULL; +- +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, +- &ffi_type_void, cl_arg_types) == FFI_OK); +- CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK); +- +- try +- { +- (*((closure_test_type)(code)))(); +- } catch (int exception_code) +- { +- CHECK(exception_code == 9); +- } +- +- printf("part one OK\n"); +- /* { dg-output "part one OK" } */ +- } +- +- { +- +- cl_arg_types[0] = &ffi_type_float; +- cl_arg_types[1] = &ffi_type_float; +- cl_arg_types[2] = &ffi_type_float; +- cl_arg_types[3] = &ffi_type_float; +- cl_arg_types[4] = &ffi_type_sshort; +- cl_arg_types[5] = &ffi_type_float; +- cl_arg_types[6] = &ffi_type_float; +- cl_arg_types[7] = &ffi_type_uint; +- cl_arg_types[8] = &ffi_type_double; +- cl_arg_types[9] = &ffi_type_uint; +- cl_arg_types[10] = &ffi_type_uint; +- cl_arg_types[11] = &ffi_type_float; +- cl_arg_types[12] = &ffi_type_uint; +- cl_arg_types[13] = &ffi_type_uint; +- cl_arg_types[14] = &ffi_type_uint; +- cl_arg_types[15] = &ffi_type_uint; +- cl_arg_types[16] = NULL; +- +- /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, +- &ffi_type_sint, cl_arg_types) == FFI_OK); +- +- CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, +- (void *) 3 /* userdata */, code) == FFI_OK); +- try +- { +- (*((closure_test_type1)code)) +- (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, +- 19, 21, 1); +- /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ +- } catch (int exception_code) +- { +- CHECK(exception_code == 255); +- } +- printf("part two OK\n"); +- /* { dg-output "\npart two OK" } */ +- } +- exit(0); +-} +diff --git a/js/src/ctypes/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc b/js/src/ctypes/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +deleted file mode 100644 +--- a/js/src/ctypes/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc ++++ /dev/null +@@ -1,53 +0,0 @@ +-/* Area: ffi_call, unwind info +- Purpose: Check if the unwind information is passed correctly. +- Limitations: none. +- PR: none. +- Originator: Andreas Tobler 20061213 */ +- +-/* { dg-do run } */ +-#include "ffitestcxx.h" +- +-static int checking(int a __UNUSED__, short b __UNUSED__, +- signed char c __UNUSED__) +-{ +- throw 9; +-} +- +-int main (void) +-{ +- ffi_cif cif; +- ffi_type *args[MAX_ARGS]; +- void *values[MAX_ARGS]; +- ffi_arg rint; +- +- signed int si; +- signed short ss; +- signed char sc; +- +- args[0] = &ffi_type_sint; +- values[0] = &si; +- args[1] = &ffi_type_sshort; +- values[1] = &ss; +- args[2] = &ffi_type_schar; +- values[2] = ≻ +- +- /* Initialize the cif */ +- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, +- &ffi_type_sint, args) == FFI_OK); +- +- si = -6; +- ss = -12; +- sc = -1; +- { +- try +- { +- ffi_call(&cif, FFI_FN(checking), &rint, values); +- } catch (int exception_code) +- { +- CHECK(exception_code == 9); +- } +- printf("part one OK\n"); +- /* { dg-output "part one OK" } */ +- } +- exit(0); +-} +--- a/js/src/ctypes/patches-libffi/00-base.patch ++++ /dev/null +@@ -1,1349 +0,0 @@ +-Patch libffi to fix bug 550602, bug 538216, bug545634, bug 594611, bug 605421 +-and bug 631928. +- +-diff --git a/js/src/ctypes/libffi/Makefile.in b/js/src/ctypes/libffi/Makefile.in +---- a/js/src/ctypes/libffi/Makefile.in +-+++ b/js/src/ctypes/libffi/Makefile.in +-@@ -199,17 +199,17 @@ LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIB +- CCLD = $(CC) +- LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +- --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ +- $(LDFLAGS) -o $@ +- SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \ +- $(libffi_convenience_la_SOURCES) \ +- $(nodist_libffi_convenience_la_SOURCES) +- DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES) +--INFO_DEPS = $(srcdir)/doc/libffi.info +-+INFO_DEPS = +- am__TEXINFO_TEX_DIR = $(srcdir) +- DVIS = doc/libffi.dvi +- PDFS = doc/libffi.pdf +- PSS = doc/libffi.ps +- HTMLS = doc/libffi.html +- TEXINFOS = doc/libffi.texi +- TEXI2DVI = texi2dvi +- TEXI2PDF = $(TEXI2DVI) --pdf --batch +-@@ -986,57 +986,57 @@ distclean-compile: +- @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@ +- @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@ +- @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/freebsd.Plo@am__quote@ +- @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/sysv.Plo@am__quote@ +- @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/unix64.Plo@am__quote@ +- @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win32.Plo@am__quote@ +- @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win64.Plo@am__quote@ +- +--.S.o: +-+%.o: %.S +- @am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +- @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +- @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +- @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +- @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- @am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ $< +- +--.S.obj: +-+%.obj: %.S +- @am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +- @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +- @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +- @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +- @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- @am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +- +--.S.lo: +-+%.lo: %.S +- @am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +- @am__fastdepCCAS_TRUE@ $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +- @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +- @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +- @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- @am__fastdepCCAS_FALSE@ $(LTCPPASCOMPILE) -c -o $@ $< +- +--.c.o: +-+%.o: %.c +- @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +- @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +- @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +- @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +- @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< +- +--.c.obj: +-+%.obj: %.c +- @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +- @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +- @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +- @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +- @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +- +--.c.lo: +-+%.lo: %.c +- @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +- @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +- @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +- @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +- @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +- +- mostlyclean-libtool: +-@@ -1129,17 +1129,17 @@ doc/libffi.html: doc/libffi.texi $(srcdi +- -@rm -f vti.tmp +- @cp $(srcdir)/doc/version.texi $@ +- +- mostlyclean-vti: +- -rm -f vti.tmp +- +- maintainer-clean-vti: +- @MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi +--.dvi.ps: +-+%.ps: %.dvi +- TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ +- $(DVIPS) -o $@ $< +- +- uninstall-dvi-am: +- @$(NORMAL_UNINSTALL) +- @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ +- for p in $$list; do \ +- $(am__strip_dir) \ +-diff --git a/js/src/ctypes/libffi/aclocal.m4 b/js/src/ctypes/libffi/aclocal.m4 +---- a/js/src/ctypes/libffi/aclocal.m4 +-+++ b/js/src/ctypes/libffi/aclocal.m4 +-@@ -4703,17 +4703,17 @@ dnl Note also adjust exclude_expsyms for +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' +- # FIXME: Should let the user specify the lib program. +- _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' +-- _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' +-+ _LT_TAGVAR(fix_srcfile_path, $1)='' +- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes +- ;; +- +- darwin* | rhapsody*) +- _LT_DARWIN_LINKER_FEATURES($1) +- ;; +- +- dgux*) +-diff --git a/js/src/ctypes/libffi/config.sub b/js/src/ctypes/libffi/config.sub +---- a/js/src/ctypes/libffi/config.sub +-+++ b/js/src/ctypes/libffi/config.sub +-@@ -1,15 +1,15 @@ +- #! /bin/sh +- # Configuration validation subroutine script. +- # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +- # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +- # Free Software Foundation, Inc. +- +--timestamp='2009-11-07' +-+timestamp='2011-01-03' +- +- # This file is (in principle) common to ALL GNU software. +- # The presence of a machine in this file suggests that SOME GNU software +- # can handle that machine. It does not imply ALL GNU software can. +- # +- # This file is free software; you can redistribute it and/or modify +- # it under the terms of the GNU General Public License as published by +- # the Free Software Foundation; either version 2 of the License, or +-@@ -121,17 +121,17 @@ esac +- +- # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +- # Here we must recognize all the valid KERNEL-OS combinations. +- maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +- case $maybe_os in +- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ +- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ +- kopensolaris*-gnu* | \ +-- storm-chaos* | os2-emx* | rtmk-nova*) +-+ storm-chaos* | os2-emx* | rtmk-nova* | wince-winmo*) +- os=-$maybe_os +- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` +- ;; +- *) +- basic_machine=`echo $1 | sed 's/-[^-]*$//'` +- if [ $basic_machine != $1 ] +- then os=`echo $1 | sed 's/.*-/-/'` +- else os=; fi +-@@ -282,32 +282,30 @@ case $basic_machine in +- | mt \ +- | msp430 \ +- | nios | nios2 \ +- | ns16k | ns32k \ +- | or32 \ +- | pdp10 | pdp11 | pj | pjl \ +- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ +- | pyramid \ +-- | rx \ +- | score \ +- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ +- | sh64 | sh64le \ +- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ +- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ +- | spu | strongarm \ +- | tahoe | thumb | tic4x | tic80 | tron \ +-- | ubicom32 \ +- | v850 | v850e \ +- | we32k \ +- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ +- | z8k | z80) +- basic_machine=$basic_machine-unknown +- ;; +-- m6811 | m68hc11 | m6812 | m68hc12 | picochip) +-+ m6811 | m68hc11 | m6812 | m68hc12) +- # Motorola 68HC11/12. +- basic_machine=$basic_machine-unknown +- os=-none +- ;; +- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) +- ;; +- ms1) +- basic_machine=mt-unknown +-@@ -368,26 +366,25 @@ case $basic_machine in +- | mt-* \ +- | msp430-* \ +- | nios-* | nios2-* \ +- | none-* | np1-* | ns16k-* | ns32k-* \ +- | orion-* \ +- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ +- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ +- | pyramid-* \ +-- | romp-* | rs6000-* | rx-* \ +-+ | romp-* | rs6000-* \ +- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ +- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ +- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ +- | sparclite-* \ +- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ +- | tahoe-* | thumb-* \ +- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ +- | tron-* \ +-- | ubicom32-* \ +- | v850-* | v850e-* | vax-* \ +- | we32k-* \ +- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ +- | xstormy16-* | xtensa*-* \ +- | ymp-* \ +- | z8k-* | z80-*) +- ;; +- # Recognize the basic CPU types without company name, with glob match. +-@@ -1294,17 +1291,17 @@ case $os in +- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ +- | -uxpv* | -beos* | -mpeix* | -udk* \ +- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ +- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ +- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +- | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ +- | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ +- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ +-- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) +-+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -winmo*) +- # Remember, each alternative MUST END IN *, to match a version number. +- ;; +- -qnx*) +- case $basic_machine in +- x86-* | i*86-*) +- ;; +- *) +- os=-nto$os +-@@ -1336,16 +1333,19 @@ case $os in +- os=`echo $os | sed -e 's|sunos6|solaris3|'` +- ;; +- -opened*) +- os=-openedition +- ;; +- -os400*) +- os=-os400 +- ;; +-+ -wince-winmo*) +-+ os=-wince-winmo +-+ ;; +- -wince*) +- os=-wince +- ;; +- -osfrose*) +- os=-osfrose +- ;; +- -osf*) +- os=-osf +-@@ -1427,16 +1427,19 @@ case $os in +- os=-kaos +- ;; +- -zvmoe) +- os=-zvmoe +- ;; +- -dicos*) +- os=-dicos +- ;; +-+ -android*) +-+ os=-android +-+ ;; +- -none) +- ;; +- *) +- # Get rid of the `-' at the beginning of $os. +- os=`echo $os | sed 's/[^-]*-//'` +- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 +- exit 1 +- ;; +-@@ -1681,16 +1684,19 @@ case $basic_machine in +- vendor=apple +- ;; +- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) +- vendor=atari +- ;; +- -vos*) +- vendor=stratus +- ;; +-+ *-android*|*-linuxandroid*) +-+ vendor=linux- +-+ ;; +- esac +- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` +- ;; +- esac +- +- echo $basic_machine$os +- exit +- +-diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +---- a/js/src/ctypes/libffi/configure +-+++ b/js/src/ctypes/libffi/configure +-@@ -8903,17 +8903,17 @@ if test -z "$aix_libpath"; then aix_libp +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- old_archive_from_new_cmds='true' +- # FIXME: Should let the user specify the lib program. +- old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' +-- fix_srcfile_path='`cygpath -w "$srcfile"`' +-+ fix_srcfile_path='' +- enable_shared_with_static_runtimes=yes +- ;; +- +- darwin* | rhapsody*) +- +- +- archive_cmds_need_lc=no +- hardcode_direct=no +-@@ -12270,20 +12270,20 @@ fi +- +- if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5 +- $as_echo_n "checking assembler supports pc related relocs... " >&6; } +- if test "${libffi_cv_as_x86_pcrel+set}" = set; then : +- $as_echo_n "(cached) " >&6 +- else +- +-- libffi_cv_as_x86_pcrel=yes +-+ libffi_cv_as_x86_pcrel=no +- echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s +-- if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then +-- libffi_cv_as_x86_pcrel=no +-+ if $CC $CFLAGS -c conftest.s > /dev/null; then +-+ libffi_cv_as_x86_pcrel=yes +- fi +- +- fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_pcrel" >&5 +- $as_echo "$libffi_cv_as_x86_pcrel" >&6; } +- if test "x$libffi_cv_as_x86_pcrel" = xyes; then +- +- $as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h +-diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +---- a/js/src/ctypes/libffi/configure.ac +-+++ b/js/src/ctypes/libffi/configure.ac +-@@ -272,20 +272,20 @@ if test x$TARGET = xSPARC; then +- AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1, +- [Define if your assembler supports .register.]) +- fi +- fi +- +- if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then +- AC_CACHE_CHECK([assembler supports pc related relocs], +- libffi_cv_as_x86_pcrel, [ +-- libffi_cv_as_x86_pcrel=yes +-+ libffi_cv_as_x86_pcrel=no +- echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s +-- if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then +-- libffi_cv_as_x86_pcrel=no +-+ if $CC $CFLAGS -c conftest.s > /dev/null; then +-+ libffi_cv_as_x86_pcrel=yes +- fi +- ]) +- if test "x$libffi_cv_as_x86_pcrel" = xyes; then +- AC_DEFINE(HAVE_AS_X86_PCREL, 1, +- [Define if your assembler supports PC relative relocs.]) +- fi +- +- AC_CACHE_CHECK([assembler .ascii pseudo-op support], +-diff --git a/js/src/ctypes/libffi/include/ffi.h.in b/js/src/ctypes/libffi/include/ffi.h.in +---- a/js/src/ctypes/libffi/include/ffi.h.in +-+++ b/js/src/ctypes/libffi/include/ffi.h.in +-@@ -72,25 +72,37 @@ extern "C" { +- #endif +- +- #include +- #include +- +- /* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). +- But we can find it either under the correct ANSI name, or under GNU +- C's internal name. */ +-+ +-+#define FFI_64_BIT_MAX 9223372036854775807 +-+ +- #ifdef LONG_LONG_MAX +- # define FFI_LONG_LONG_MAX LONG_LONG_MAX +- #else +- # ifdef LLONG_MAX +- # define FFI_LONG_LONG_MAX LLONG_MAX +- # else +- # ifdef __GNUC__ +- # define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +- # endif +-+# ifdef _AIX +-+# ifndef __PPC64__ +-+# if defined (__IBMC__) || defined (__IBMCPP__) +-+# define FFI_LONG_LONG_MAX LONGLONG_MAX +-+# endif +-+# endif /* __PPC64__ */ +-+# undef FFI_64_BIT_MAX +-+# define FFI_64_BIT_MAX 9223372036854775807LL +-+# endif +- # endif +- #endif +- +- /* The closure code assumes that this works on pointers, i.e. a size_t */ +- /* can hold a pointer. */ +- +- typedef struct _ffi_type +- { +-@@ -127,27 +139,27 @@ typedef struct _ffi_type +- #elif INT_MAX == 9223372036854775807 +- # define ffi_type_uint ffi_type_uint64 +- # define ffi_type_sint ffi_type_sint64 +- #else +- #error "int size not supported" +- #endif +- +- #if LONG_MAX == 2147483647 +--# if FFI_LONG_LONG_MAX != 9223372036854775807 +-+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX +- #error "no 64-bit data type supported" +- # endif +--#elif LONG_MAX != 9223372036854775807 +-+#elif LONG_MAX != FFI_64_BIT_MAX +- #error "long size not supported" +- #endif +- +- #if LONG_MAX == 2147483647 +- # define ffi_type_ulong ffi_type_uint32 +- # define ffi_type_slong ffi_type_sint32 +--#elif LONG_MAX == 9223372036854775807 +-+#elif LONG_MAX == FFI_64_BIT_MAX +- # define ffi_type_ulong ffi_type_uint64 +- # define ffi_type_slong ffi_type_sint64 +- #else +- #error "long size not supported" +- #endif +- +- /* These are defined in types.c */ +- extern ffi_type ffi_type_void; +-@@ -190,17 +202,17 @@ typedef struct { +- #endif +- } ffi_cif; +- +- /* ---- Definitions for the raw API -------------------------------------- */ +- +- #ifndef FFI_SIZEOF_ARG +- # if LONG_MAX == 2147483647 +- # define FFI_SIZEOF_ARG 4 +--# elif LONG_MAX == 9223372036854775807 +-+# elif LONG_MAX == FFI_64_BIT_MAX +- # define FFI_SIZEOF_ARG 8 +- # endif +- #endif +- +- #ifndef FFI_SIZEOF_JAVA_RAW +- # define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +- #endif +- +-diff --git a/js/src/ctypes/libffi/src/arm/ffi.c b/js/src/ctypes/libffi/src/arm/ffi.c +---- a/js/src/ctypes/libffi/src/arm/ffi.c +-+++ b/js/src/ctypes/libffi/src/arm/ffi.c +-@@ -24,22 +24,30 @@ +- DEALINGS IN THE SOFTWARE. +- ----------------------------------------------------------------------- */ +- +- #include +- #include +- +- #include +- +-+/* Forward declares. */ +-+static int vfp_type_p (ffi_type *); +-+static void layout_vfp_args (ffi_cif *); +-+ +- /* ffi_prep_args is called by the assembly routine once stack space +-- has been allocated for the function's arguments */ +-- +--void ffi_prep_args(char *stack, extended_cif *ecif) +-+ has been allocated for the function's arguments +-+ +-+ The vfp_space parameter is the load area for VFP regs, the return +-+ value is cif->vfp_used (word bitset of VFP regs used for passing +-+ arguments). These are only used for the VFP hard-float ABI. +-+*/ +-+int ffi_prep_args(char *stack, extended_cif *ecif, float *vfp_space) +- { +-- register unsigned int i; +-+ register unsigned int i, vi = 0; +- register void **p_argv; +- register char *argp; +- register ffi_type **p_arg; +- +- argp = stack; +- +- if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { +- *(void **) argp = ecif->rvalue; +-@@ -49,16 +57,31 @@ void ffi_prep_args(char *stack, extended +- p_argv = ecif->avalue; +- +- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- (i != 0); +- i--, p_arg++) +- { +- size_t z; +- +-+ /* Allocated in VFP registers. */ +-+ if (ecif->cif->abi == FFI_VFP +-+ && vi < ecif->cif->vfp_nargs && vfp_type_p (*p_arg)) +-+ { +-+ float* vfp_slot = vfp_space + ecif->cif->vfp_args[vi++]; +-+ if ((*p_arg)->type == FFI_TYPE_FLOAT) +-+ *((float*)vfp_slot) = *((float*)*p_argv); +-+ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) +-+ *((double*)vfp_slot) = *((double*)*p_argv); +-+ else +-+ memcpy(vfp_slot, *p_argv, (*p_arg)->size); +-+ p_argv++; +-+ continue; +-+ } +-+ +- /* Align if necessary */ +- if (((*p_arg)->alignment - 1) & (unsigned) argp) { +- argp = (char *) ALIGN(argp, (*p_arg)->alignment); +- } +- +- if ((*p_arg)->type == FFI_TYPE_STRUCT) +- argp = (char *) ALIGN(argp, 4); +- +-@@ -98,23 +121,25 @@ void ffi_prep_args(char *stack, extended +- } +- else +- { +- memcpy(argp, *p_argv, z); +- } +- p_argv++; +- argp += z; +- } +-- +-- return; +-+ +-+ /* Indicate the VFP registers used. */ +-+ return ecif->cif->vfp_used; +- } +- +- /* Perform machine dependent cif processing */ +- ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +- { +-+ int type_code; +- /* Round the stack up to a multiple of 8 bytes. This isn't needed +- everywhere, but it is on some platforms, and it doesn't harm anything +- when it isn't needed. */ +- cif->bytes = (cif->bytes + 7) & ~7; +- +- /* Set the return type flag */ +- switch (cif->rtype->type) +- { +-@@ -125,137 +150,176 @@ ffi_status ffi_prep_cif_machdep(ffi_cif +- break; +- +- case FFI_TYPE_SINT64: +- case FFI_TYPE_UINT64: +- cif->flags = (unsigned) FFI_TYPE_SINT64; +- break; +- +- case FFI_TYPE_STRUCT: +-- if (cif->rtype->size <= 4) +-+ if (cif->abi == FFI_VFP +-+ && (type_code = vfp_type_p (cif->rtype)) != 0) +-+ { +-+ /* A Composite Type passed in VFP registers, either +-+ FFI_TYPE_STRUCT_VFP_FLOAT or FFI_TYPE_STRUCT_VFP_DOUBLE. */ +-+ cif->flags = (unsigned) type_code; +-+ } +-+ else if (cif->rtype->size <= 4) +- /* A Composite Type not larger than 4 bytes is returned in r0. */ +- cif->flags = (unsigned)FFI_TYPE_INT; +- else +- /* A Composite Type larger than 4 bytes, or whose size cannot +- be determined statically ... is stored in memory at an +- address passed [in r0]. */ +- cif->flags = (unsigned)FFI_TYPE_STRUCT; +- break; +- +- default: +- cif->flags = FFI_TYPE_INT; +- break; +- } +- +-+ /* Map out the register placements of VFP register args. +-+ The VFP hard-float calling conventions are slightly more sophisticated than +-+ the base calling conventions, so we do it here instead of in ffi_prep_args(). */ +-+ if (cif->abi == FFI_VFP) +-+ layout_vfp_args (cif); +-+ +- return FFI_OK; +- } +- +--extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, +-- unsigned, unsigned, unsigned *, void (*fn)(void)); +-+/* Prototypes for assembly functions, in sysv.S */ +-+extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); +-+extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); +- +- void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +- { +- extended_cif ecif; +- +- int small_struct = (cif->flags == FFI_TYPE_INT +- && cif->rtype->type == FFI_TYPE_STRUCT); +-+ int vfp_struct = (cif->flags == FFI_TYPE_STRUCT_VFP_FLOAT +-+ || cif->flags == FFI_TYPE_STRUCT_VFP_DOUBLE); +- +- ecif.cif = cif; +- ecif.avalue = avalue; +- +- unsigned int temp; +- +- /* If the return value is a struct and we don't have a return */ +- /* value address then we need to make one */ +- +- if ((rvalue == NULL) && +- (cif->flags == FFI_TYPE_STRUCT)) +- { +- ecif.rvalue = alloca(cif->rtype->size); +- } +- else if (small_struct) +- ecif.rvalue = &temp; +-+ else if (vfp_struct) +-+ { +-+ /* Largest case is double x 4. */ +-+ ecif.rvalue = alloca(32); +-+ } +- else +- ecif.rvalue = rvalue; +- +- switch (cif->abi) +- { +- case FFI_SYSV: +-- ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, +-- fn); +-+ ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); +-+ break; +- +-+ case FFI_VFP: +-+ ffi_call_VFP (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); +- break; +-+ +- default: +- FFI_ASSERT(0); +- break; +- } +- if (small_struct) +- memcpy (rvalue, &temp, cif->rtype->size); +-+ else if (vfp_struct) +-+ memcpy (rvalue, ecif.rvalue, cif->rtype->size); +- } +- +- /** private members **/ +- +- static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, +-- void** args, ffi_cif* cif); +-+ void** args, ffi_cif* cif, float *vfp_stack); +- +- void ffi_closure_SYSV (ffi_closure *); +- +-+void ffi_closure_VFP (ffi_closure *); +-+ +- /* This function is jumped to by the trampoline */ +- +- unsigned int +--ffi_closure_SYSV_inner (closure, respp, args) +-+ffi_closure_SYSV_inner (closure, respp, args, vfp_args) +- ffi_closure *closure; +- void **respp; +- void *args; +-+ void *vfp_args; +- { +- // our various things... +- ffi_cif *cif; +- void **arg_area; +- +- cif = closure->cif; +- arg_area = (void**) alloca (cif->nargs * sizeof (void*)); +- +- /* this call will initialize ARG_AREA, such that each +- * element in that array points to the corresponding +- * value on the stack; and if the function returns +- * a structure, it will re-set RESP to point to the +- * structure return address. */ +- +-- ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); +-+ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); +- +- (closure->fun) (cif, *respp, arg_area, closure->user_data); +- +- return cif->flags; +- } +- +- /*@-exportheader@*/ +- static void +- ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, +-- void **avalue, ffi_cif *cif) +-+ void **avalue, ffi_cif *cif, +-+ /* Used only under VFP hard-float ABI. */ +-+ float *vfp_stack) +- /*@=exportheader@*/ +- { +-- register unsigned int i; +-+ register unsigned int i, vi = 0; +- register void **p_argv; +- register char *argp; +- register ffi_type **p_arg; +- +- argp = stack; +- +- if ( cif->flags == FFI_TYPE_STRUCT ) { +- *rvalue = *(void **) argp; +- argp += 4; +- } +- +- p_argv = avalue; +- +- for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) +- { +- size_t z; +-+ size_t alignment; +-+ +-+ if (cif->abi == FFI_VFP +-+ && vi < cif->vfp_nargs && vfp_type_p (*p_arg)) +-+ { +-+ *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]); +-+ continue; +-+ } +- +-- size_t alignment = (*p_arg)->alignment; +-+ alignment = (*p_arg)->alignment; +- if (alignment < 4) +- alignment = 4; +- /* Align if necessary */ +- if ((alignment - 1) & (unsigned) argp) { +- argp = (char *) ALIGN(argp, alignment); +- } +- +- z = (*p_arg)->size; +-@@ -290,20 +354,147 @@ ffi_prep_incoming_args_SYSV(char *stack, +- +- ffi_status +- ffi_prep_closure_loc (ffi_closure* closure, +- ffi_cif* cif, +- void (*fun)(ffi_cif*,void*,void**,void*), +- void *user_data, +- void *codeloc) +- { +-- FFI_ASSERT (cif->abi == FFI_SYSV); +-+ void (*closure_func)(ffi_closure*) = NULL; +- +-+ if (cif->abi == FFI_SYSV) +-+ closure_func = &ffi_closure_SYSV; +-+ else if (cif->abi == FFI_VFP) +-+ closure_func = &ffi_closure_VFP; +-+ else +-+ FFI_ASSERT (0); +-+ +- FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ +-- &ffi_closure_SYSV, \ +-+ closure_func, \ +- codeloc); +- +- closure->cif = cif; +- closure->user_data = user_data; +- closure->fun = fun; +- +- return FFI_OK; +- } +-+ +-+/* Below are routines for VFP hard-float support. */ +-+ +-+static int rec_vfp_type_p (ffi_type *t, int *elt, int *elnum) +-+{ +-+ switch (t->type) +-+ { +-+ case FFI_TYPE_FLOAT: +-+ case FFI_TYPE_DOUBLE: +-+ *elt = (int) t->type; +-+ *elnum = 1; +-+ return 1; +-+ +-+ case FFI_TYPE_STRUCT_VFP_FLOAT: +-+ *elt = FFI_TYPE_FLOAT; +-+ *elnum = t->size / sizeof (float); +-+ return 1; +-+ +-+ case FFI_TYPE_STRUCT_VFP_DOUBLE: +-+ *elt = FFI_TYPE_DOUBLE; +-+ *elnum = t->size / sizeof (double); +-+ return 1; +-+ +-+ case FFI_TYPE_STRUCT:; +-+ { +-+ int base_elt = 0, total_elnum = 0; +-+ ffi_type **el = t->elements; +-+ while (*el) +-+ { +-+ int el_elt = 0, el_elnum = 0; +-+ if (! rec_vfp_type_p (*el, &el_elt, &el_elnum) +-+ || (base_elt && base_elt != el_elt) +-+ || total_elnum + el_elnum > 4) +-+ return 0; +-+ base_elt = el_elt; +-+ total_elnum += el_elnum; +-+ el++; +-+ } +-+ *elnum = total_elnum; +-+ *elt = base_elt; +-+ return 1; +-+ } +-+ default: ; +-+ } +-+ return 0; +-+} +-+ +-+static int vfp_type_p (ffi_type *t) +-+{ +-+ int elt, elnum; +-+ if (rec_vfp_type_p (t, &elt, &elnum)) +-+ { +-+ if (t->type == FFI_TYPE_STRUCT) +-+ { +-+ if (elnum == 1) +-+ t->type = elt; +-+ else +-+ t->type = (elt == FFI_TYPE_FLOAT +-+ ? FFI_TYPE_STRUCT_VFP_FLOAT +-+ : FFI_TYPE_STRUCT_VFP_DOUBLE); +-+ } +-+ return (int) t->type; +-+ } +-+ return 0; +-+} +-+ +-+static void place_vfp_arg (ffi_cif *cif, ffi_type *t) +-+{ +-+ int reg = cif->vfp_reg_free; +-+ int nregs = t->size / sizeof (float); +-+ int align = ((t->type == FFI_TYPE_STRUCT_VFP_FLOAT +-+ || t->type == FFI_TYPE_FLOAT) ? 1 : 2); +-+ /* Align register number. */ +-+ if ((reg & 1) && align == 2) +-+ reg++; +-+ while (reg + nregs <= 16) +-+ { +-+ int s, new_used = 0; +-+ for (s = reg; s < reg + nregs; s++) +-+ { +-+ new_used |= (1 << s); +-+ if (cif->vfp_used & (1 << s)) +-+ { +-+ reg += align; +-+ goto next_reg; +-+ } +-+ } +-+ /* Found regs to allocate. */ +-+ cif->vfp_used |= new_used; +-+ cif->vfp_args[cif->vfp_nargs++] = reg; +-+ +-+ /* Update vfp_reg_free. */ +-+ if (cif->vfp_used & (1 << cif->vfp_reg_free)) +-+ { +-+ reg += nregs; +-+ while (cif->vfp_used & (1 << reg)) +-+ reg += 1; +-+ cif->vfp_reg_free = reg; +-+ } +-+ return; +-+ next_reg: ; +-+ } +-+} +-+ +-+static void layout_vfp_args (ffi_cif *cif) +-+{ +-+ int i; +-+ /* Init VFP fields */ +-+ cif->vfp_used = 0; +-+ cif->vfp_nargs = 0; +-+ cif->vfp_reg_free = 0; +-+ memset (cif->vfp_args, -1, 16); /* Init to -1. */ +-+ +-+ for (i = 0; i < cif->nargs; i++) +-+ { +-+ ffi_type *t = cif->arg_types[i]; +-+ if (vfp_type_p (t)) +-+ place_vfp_arg (cif, t); +-+ } +-+} +-diff --git a/js/src/ctypes/libffi/src/arm/ffitarget.h b/js/src/ctypes/libffi/src/arm/ffitarget.h +---- a/js/src/ctypes/libffi/src/arm/ffitarget.h +-+++ b/js/src/ctypes/libffi/src/arm/ffitarget.h +-@@ -29,21 +29,35 @@ +- +- #ifndef LIBFFI_ASM +- typedef unsigned long ffi_arg; +- typedef signed long ffi_sarg; +- +- typedef enum ffi_abi { +- FFI_FIRST_ABI = 0, +- FFI_SYSV, +-+ FFI_VFP, +- FFI_LAST_ABI, +-+#ifdef __ARM_PCS_VFP +-+ FFI_DEFAULT_ABI = FFI_VFP +-+#else +- FFI_DEFAULT_ABI = FFI_SYSV +-+#endif +- } ffi_abi; +- #endif +- +-+#define FFI_EXTRA_CIF_FIELDS \ +-+ int vfp_used; \ +-+ short vfp_reg_free, vfp_nargs; \ +-+ signed char vfp_args[16] \ +-+ +-+/* Internally used. */ +-+#define FFI_TYPE_STRUCT_VFP_FLOAT (FFI_TYPE_LAST + 1) +-+#define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2) +-+ +- /* ---- Definitions for closures ----------------------------------------- */ +- +- #define FFI_CLOSURES 1 +- #define FFI_TRAMPOLINE_SIZE 20 +- #define FFI_NATIVE_RAW_API 0 +- +- #endif +- +-diff --git a/js/src/ctypes/libffi/src/arm/sysv.S b/js/src/ctypes/libffi/src/arm/sysv.S +---- a/js/src/ctypes/libffi/src/arm/sysv.S +-+++ b/js/src/ctypes/libffi/src/arm/sysv.S +-@@ -137,54 +137,52 @@ +- ldr\cond pc, [sp], #4 +- .else +- ldm\cond\dirn sp!, {\regs, pc} +- .endif +- #endif +- .endm +- +- +-- @ r0: ffi_prep_args +-+ @ r0: fn +- @ r1: &ecif +- @ r2: cif->bytes +- @ r3: fig->flags +- @ sp+0: ecif.rvalue +-- @ sp+4: fn +- +- @ This assumes we are using gas. +- ARM_FUNC_START ffi_call_SYSV +- @ Save registers +- stmfd sp!, {r0-r3, fp, lr} +- UNWIND .save {r0-r3, fp, lr} +- mov fp, sp +- +- UNWIND .setfp fp, sp +- +- @ Make room for all of the new args. +- sub sp, fp, r2 +- +- @ Place all of the ffi_prep_args in position +-- mov ip, r0 +- mov r0, sp +- @ r1 already set +- +- @ Call ffi_prep_args(stack, &ecif) +-- call_reg(ip) +-+ bl ffi_prep_args +- +- @ move first 4 parameters in registers +- ldmia sp, {r0-r3} +- +- @ and adjust stack +-- ldr ip, [fp, #8] +-- cmp ip, #16 +-- movhs ip, #16 +-- add sp, sp, ip +-+ sub lr, fp, sp @ cif->bytes == fp - sp +-+ ldr ip, [fp] @ load fn() in advance +-+ cmp lr, #16 +-+ movhs lr, #16 +-+ add sp, sp, lr +- +- @ call (fn) (...) +-- ldr ip, [fp, #28] +- call_reg(ip) +- +- @ Remove the space we pushed for the args +- mov sp, fp +- +- @ Load r2 with the pointer to storage for the return value +- ldr r2, [sp, #24] +- +-@@ -225,16 +223,111 @@ ARM_FUNC_START ffi_call_SYSV +- +- LSYM(Lepilogue): +- RETLDM "r0-r3,fp" +- +- .ffi_call_SYSV_end: +- UNWIND .fnend +- .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) +- +-+ +-+ @ r0: fn +-+ @ r1: &ecif +-+ @ r2: cif->bytes +-+ @ r3: fig->flags +-+ @ sp+0: ecif.rvalue +-+ +-+ARM_FUNC_START ffi_call_VFP +-+ @ Save registers +-+ stmfd sp!, {r0-r3, fp, lr} +-+ UNWIND .save {r0-r3, fp, lr} +-+ mov fp, sp +-+ UNWIND .setfp fp, sp +-+ +-+ @ Make room for all of the new args. +-+ sub sp, sp, r2 +-+ +-+ @ Make room for loading VFP args +-+ sub sp, sp, #64 +-+ +-+ @ Place all of the ffi_prep_args in position +-+ mov r0, sp +-+ @ r1 already set +-+ sub r2, fp, #64 @ VFP scratch space +-+ +-+ @ Call ffi_prep_args(stack, &ecif, vfp_space) +-+ bl ffi_prep_args +-+ +-+ @ Load VFP register args if needed +-+ cmp r0, #0 +-+ beq LSYM(Lbase_args) +-+ +-+ @ Load only d0 if possible +-+ cmp r0, #3 +-+ sub ip, fp, #64 +-+ flddle d0, [ip] +-+ fldmiadgt ip, {d0-d7} +-+ +-+LSYM(Lbase_args): +-+ @ move first 4 parameters in registers +-+ ldmia sp, {r0-r3} +-+ +-+ @ and adjust stack +-+ sub lr, ip, sp @ cif->bytes == (fp - 64) - sp +-+ ldr ip, [fp] @ load fn() in advance +-+ cmp lr, #16 +-+ movhs lr, #16 +-+ add sp, sp, lr +-+ +-+ @ call (fn) (...) +-+ call_reg(ip) +-+ +-+ @ Remove the space we pushed for the args +-+ mov sp, fp +-+ +-+ @ Load r2 with the pointer to storage for +-+ @ the return value +-+ ldr r2, [sp, #24] +-+ +-+ @ Load r3 with the return type code +-+ ldr r3, [sp, #12] +-+ +-+ @ If the return value pointer is NULL, +-+ @ assume no return value. +-+ cmp r2, #0 +-+ beq LSYM(Lepilogue_vfp) +-+ +-+ cmp r3, #FFI_TYPE_INT +-+ streq r0, [r2] +-+ beq LSYM(Lepilogue_vfp) +-+ +-+ cmp r3, #FFI_TYPE_SINT64 +-+ stmeqia r2, {r0, r1} +-+ beq LSYM(Lepilogue_vfp) +-+ +-+ cmp r3, #FFI_TYPE_FLOAT +-+ fstseq s0, [r2] +-+ beq LSYM(Lepilogue_vfp) +-+ +-+ cmp r3, #FFI_TYPE_DOUBLE +-+ fstdeq d0, [r2] +-+ beq LSYM(Lepilogue_vfp) +-+ +-+ cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT +-+ cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE +-+ fstmiadeq r2, {d0-d3} +-+ +-+LSYM(Lepilogue_vfp): +-+ RETLDM "r0-r3,fp" +-+ +-+.ffi_call_VFP_end: +-+ UNWIND .fnend +-+ .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP) +-+ +-+ +- /* +- unsigned int FFI_HIDDEN +- ffi_closure_SYSV_inner (closure, respp, args) +- ffi_closure *closure; +- void **respp; +- void *args; +- */ +- +-@@ -297,11 +390,73 @@ ARM_FUNC_START ffi_closure_SYSV +- ldfd f0, [sp] +- b .Lclosure_epilogue +- #endif +- +- .ffi_closure_SYSV_end: +- UNWIND .fnend +- .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) +- +-+ +-+ARM_FUNC_START ffi_closure_VFP +-+ fstmfdd sp!, {d0-d7} +-+ @ r0-r3, then d0-d7 +-+ UNWIND .pad #80 +-+ add ip, sp, #80 +-+ stmfd sp!, {ip, lr} +-+ UNWIND .save {r0, lr} +-+ add r2, sp, #72 +-+ add r3, sp, #8 +-+ .pad #72 +-+ sub sp, sp, #72 +-+ str sp, [sp, #64] +-+ add r1, sp, #64 +-+ bl ffi_closure_SYSV_inner +-+ +-+ cmp r0, #FFI_TYPE_INT +-+ beq .Lretint_vfp +-+ +-+ cmp r0, #FFI_TYPE_FLOAT +-+ beq .Lretfloat_vfp +-+ +-+ cmp r0, #FFI_TYPE_DOUBLE +-+ cmpne r0, #FFI_TYPE_LONGDOUBLE +-+ beq .Lretdouble_vfp +-+ +-+ cmp r0, #FFI_TYPE_SINT64 +-+ beq .Lretlonglong_vfp +-+ +-+ cmp r0, #FFI_TYPE_STRUCT_VFP_FLOAT +-+ beq .Lretfloat_struct_vfp +-+ +-+ cmp r0, #FFI_TYPE_STRUCT_VFP_DOUBLE +-+ beq .Lretdouble_struct_vfp +-+ +-+.Lclosure_epilogue_vfp: +-+ add sp, sp, #72 +-+ ldmfd sp, {sp, pc} +-+ +-+.Lretfloat_vfp: +-+ flds s0, [sp] +-+ b .Lclosure_epilogue_vfp +-+.Lretdouble_vfp: +-+ fldd d0, [sp] +-+ b .Lclosure_epilogue_vfp +-+.Lretint_vfp: +-+ ldr r0, [sp] +-+ b .Lclosure_epilogue_vfp +-+.Lretlonglong_vfp: +-+ ldmia sp, {r0, r1} +-+ b .Lclosure_epilogue_vfp +-+.Lretfloat_struct_vfp: +-+ fldmiad sp, {d0-d1} +-+ b .Lclosure_epilogue_vfp +-+.Lretdouble_struct_vfp: +-+ fldmiad sp, {d0-d3} +-+ b .Lclosure_epilogue_vfp +-+ +-+.ffi_closure_VFP_end: +-+ UNWIND .fnend +-+ .size CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP) +-+ +- #if defined __ELF__ && defined __linux__ +- .section .note.GNU-stack,"",%progbits +- #endif +-diff --git a/js/src/ctypes/libffi/src/x86/ffi64.c b/js/src/ctypes/libffi/src/x86/ffi64.c +---- a/js/src/ctypes/libffi/src/x86/ffi64.c +-+++ b/js/src/ctypes/libffi/src/x86/ffi64.c +-@@ -373,29 +373,29 @@ ffi_prep_cif_machdep (ffi_cif *cif) +- || gprcount + ngpr > MAX_GPR_REGS +- || ssecount + nsse > MAX_SSE_REGS) +- { +- long align = cif->arg_types[i]->alignment; +- +- if (align < 8) +- align = 8; +- +-- bytes = ALIGN(bytes, align); +-+ bytes = ALIGN (bytes, align); +- bytes += cif->arg_types[i]->size; +- } +- else +- { +- gprcount += ngpr; +- ssecount += nsse; +- } +- } +- if (ssecount) +- flags |= 1 << 11; +- cif->flags = flags; +-- cif->bytes = bytes; +-+ cif->bytes = ALIGN (bytes, 8); +- +- return FFI_OK; +- } +- +- void +- ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +- { +- enum x86_64_reg_class classes[MAX_CLASSES]; +-diff --git a/js/src/ctypes/libffi/testsuite/lib/libffi-dg.exp b/js/src/ctypes/libffi/testsuite/lib/libffi-dg.exp +---- a/js/src/ctypes/libffi/testsuite/lib/libffi-dg.exp +-+++ b/js/src/ctypes/libffi/testsuite/lib/libffi-dg.exp +-@@ -261,16 +261,66 @@ proc dg-xfail-if { args } { +- set args [lreplace $args 0 0] +- set selector "target [join [lindex $args 1]]" +- if { [dg-process-target $selector] == "S" } { +- global compiler_conditional_xfail_data +- set compiler_conditional_xfail_data $args +- } +- } +- +-+proc check-flags { args } { +-+ +-+ # The args are within another list; pull them out. +-+ set args [lindex $args 0] +-+ +-+ # The next two arguments are optional. If they were not specified, +-+ # use the defaults. +-+ if { [llength $args] == 2 } { +-+ lappend $args [list "*"] +-+ } +-+ if { [llength $args] == 3 } { +-+ lappend $args [list ""] +-+ } +-+ +-+ # If the option strings are the defaults, or the same as the +-+ # defaults, there is no need to call check_conditional_xfail to +-+ # compare them to the actual options. +-+ if { [string compare [lindex $args 2] "*"] == 0 +-+ && [string compare [lindex $args 3] "" ] == 0 } { +-+ set result 1 +-+ } else { +-+ # The target list might be an effective-target keyword, so replace +-+ # the original list with "*-*-*", since we already know it matches. +-+ set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] +-+ } +-+ +-+ return $result +-+} +-+ +-+proc dg-skip-if { args } { +-+ # Verify the number of arguments. The last two are optional. +-+ set args [lreplace $args 0 0] +-+ if { [llength $args] < 2 || [llength $args] > 4 } { +-+ error "dg-skip-if 2: need 2, 3, or 4 arguments" +-+ } +-+ +-+ # Don't bother if we're already skipping the test. +-+ upvar dg-do-what dg-do-what +-+ if { [lindex ${dg-do-what} 1] == "N" } { +-+ return +-+ } +-+ +-+ set selector [list target [lindex $args 1]] +-+ if { [dg-process-target $selector] == "S" } { +-+ if [check-flags $args] { +-+ upvar dg-do-what dg-do-what +-+ set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] +-+ } +-+ } +-+} +- +- # We need to make sure that additional_files and additional_sources +- # are both cleared out after every test. It is not enough to clear +- # them out *before* the next test run because gcc-target-compile gets +- # run directly from some .exp files (outside of any test). (Those +- # uses should eventually be eliminated.) +- +- # Because the DG framework doesn't provide a hook that is run at the +-diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c +---- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c +-+++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_double_va.c +-@@ -1,16 +1,18 @@ +- /* Area: ffi_call, closure_call +- Purpose: Test doubles passed in variable argument lists. +- Limitations: none. +- PR: none. +- Originator: Blake Chaffin 6/6/2007 */ +- +- /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +- /* { dg-output "" { xfail avr32*-*-* } } */ +-+/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */ +-+ +- #include "ffitest.h" +- +- static void +- cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, +- void** args, void* userdata __UNUSED__) +- { +- char* format = *(char**)args[0]; +- double doubleValue = *(double*)args[1]; +-diff --git a/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c b/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c +---- a/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c +-+++ b/js/src/ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c +-@@ -1,16 +1,18 @@ +- /* Area: ffi_call, closure_call +- Purpose: Test long doubles passed in variable argument lists. +- Limitations: none. +- PR: none. +- Originator: Blake Chaffin 6/6/2007 */ +- +- /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +- /* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ +-+/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */ +-+ +- #include "ffitest.h" +- +- static void +- cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, +- void** args, void* userdata __UNUSED__) +- { +- char* format = *(char**)args[0]; +- long double ldValue = *(long double*)args[1]; +diff --git a/js/src/ctypes/patches-libffi/01-bug-670719.patch b/js/src/ctypes/patches-libffi/01-bug-670719.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/01-bug-670719.patch ++++ /dev/null +@@ -1,50 +0,0 @@ +-# HG changeset patch +-# Parent e357f3f732a0f3e98f8bd4661de03c9042c5c330 +-# User Landry Breuil +-treat powerpc-*-openbsd* as powerpc-*-freebsd* +- +- +-diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +---- a/js/src/ctypes/libffi/configure +-+++ b/js/src/ctypes/libffi/configure +-@@ -11272,17 +11272,17 @@ case "$host" in +- TARGET=POWERPC; TARGETDIR=powerpc +- ;; +- powerpc-*-darwin*) +- TARGET=POWERPC_DARWIN; TARGETDIR=powerpc +- ;; +- powerpc-*-aix* | rs6000-*-aix*) +- TARGET=POWERPC_AIX; TARGETDIR=powerpc +- ;; +-- powerpc-*-freebsd*) +-+ powerpc-*-freebsd* | powerpc-*-openbsd*) +- TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc +- ;; +- powerpc*-*-rtems*) +- TARGET=POWERPC; TARGETDIR=powerpc +- ;; +- +- s390-*-* | s390x-*-*) +- TARGET=S390; TARGETDIR=s390 +-diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +---- a/js/src/ctypes/libffi/configure.ac +-+++ b/js/src/ctypes/libffi/configure.ac +-@@ -135,17 +135,17 @@ case "$host" in +- TARGET=POWERPC; TARGETDIR=powerpc +- ;; +- powerpc-*-darwin*) +- TARGET=POWERPC_DARWIN; TARGETDIR=powerpc +- ;; +- powerpc-*-aix* | rs6000-*-aix*) +- TARGET=POWERPC_AIX; TARGETDIR=powerpc +- ;; +-- powerpc-*-freebsd*) +-+ powerpc-*-freebsd* | powerpc-*-openbsd*) +- TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc +- ;; +- powerpc*-*-rtems*) +- TARGET=POWERPC; TARGETDIR=powerpc +- ;; +- +- s390-*-* | s390x-*-*) +- TARGET=S390; TARGETDIR=s390 +diff --git a/js/src/ctypes/patches-libffi/02-bug-682180.patch b/js/src/ctypes/patches-libffi/02-bug-682180.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/02-bug-682180.patch ++++ /dev/null +@@ -1,48 +0,0 @@ +-# HG changeset patch +-# Parent 5e5eb679345b4d13b8e9ee40e253a97fd665dad3 +-diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +---- a/js/src/ctypes/libffi/configure +-+++ b/js/src/ctypes/libffi/configure +-@@ -12357,17 +12357,18 @@ fi +- if test "x$libffi_cv_as_string_pseudo_op" = xyes; then +- +- $as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h +- +- fi +- fi +- +- case "$target" in +-- *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +-+ # Darwin 10 (OSX 10.6) and beyond allocate non-executable pages +-+ *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +- +- $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h +- +- ;; +- esac +- +- if test x$TARGET = xX86_64; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5 +-diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +---- a/js/src/ctypes/libffi/configure.ac +-+++ b/js/src/ctypes/libffi/configure.ac +-@@ -311,17 +311,18 @@ if test x$TARGET = xX86 || test x$TARGET +- ]) +- if test "x$libffi_cv_as_string_pseudo_op" = xyes; then +- AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1, +- [Define if your assembler supports .string.]) +- fi +- fi +- +- case "$target" in +-- *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +-+ # Darwin 10 (OSX 10.6) and beyond allocate non-executable pages +-+ *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +- AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, +- [Cannot use malloc on this target, so, we revert to +- alternative means]) +- ;; +- esac +- +- if test x$TARGET = xX86_64; then +- AC_CACHE_CHECK([assembler supports unwind section type], +diff --git a/js/src/ctypes/patches-libffi/03-bug-712594.patch b/js/src/ctypes/patches-libffi/03-bug-712594.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/03-bug-712594.patch ++++ /dev/null +@@ -1,1210 +0,0 @@ +-commit 5b9cd52784339a42e417174a55e310e214d435f9 +-Author: Anthony Green +-Date: Mon Nov 22 15:19:57 2010 -0500 +- +- win64-underscore patch +- +-diff --git a/js/src/ctypes/libffi/aclocal.m4 b/js/src/ctypes/libffi/aclocal.m4 +---- a/js/src/ctypes/libffi/aclocal.m4 +-+++ b/js/src/ctypes/libffi/aclocal.m4 +-@@ -7359,16 +7359,821 @@ func_append () +- eval "$[1]=\$$[1]\$[2]" +- } +- +- _LT_EOF +- ;; +- esac +- ]) +- +-+# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- +-+# +-+# Copyright (C) 1999-2006, 2007, 2008 Free Software Foundation, Inc. +-+# Written by Thomas Tanner, 1999 +-+# +-+# This file is free software; the Free Software Foundation gives +-+# unlimited permission to copy and/or distribute it, with or without +-+# modifications, as long as this notice is preserved. +-+ +-+# serial 17 LTDL_INIT +-+ +-+# LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE]) +-+# ------------------------------------------ +-+# DIRECTORY contains the libltdl sources. It is okay to call this +-+# function multiple times, as long as the same DIRECTORY is always given. +-+AC_DEFUN([LT_CONFIG_LTDL_DIR], +-+[AC_BEFORE([$0], [LTDL_INIT]) +-+_$0($*) +-+])# LT_CONFIG_LTDL_DIR +-+ +-+# We break this out into a separate macro, so that we can call it safely +-+# internally without being caught accidentally by the sed scan in libtoolize. +-+m4_defun([_LT_CONFIG_LTDL_DIR], +-+[dnl remove trailing slashes +-+m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$])) +-+m4_case(_LTDL_DIR, +-+ [], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.' +-+ m4_if(_ARG_DIR, [.], +-+ [], +-+ [m4_define([_LTDL_DIR], _ARG_DIR) +-+ _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])], +-+ [m4_if(_ARG_DIR, _LTDL_DIR, +-+ [], +-+ [m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])]) +-+m4_popdef([_ARG_DIR]) +-+])# _LT_CONFIG_LTDL_DIR +-+ +-+# Initialise: +-+m4_define([_LTDL_DIR], []) +-+ +-+ +-+# _LT_BUILD_PREFIX +-+# ---------------- +-+# If Autoconf is new enough, expand to `${top_build_prefix}', otherwise +-+# to `${top_builddir}/'. +-+m4_define([_LT_BUILD_PREFIX], +-+[m4_ifdef([AC_AUTOCONF_VERSION], +-+ [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]), +-+ [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX], +-+ [${top_build_prefix}], +-+ [${top_builddir}/])], +-+ [${top_build_prefix}])], +-+ [${top_builddir}/])[]dnl +-+]) +-+ +-+ +-+# LTDL_CONVENIENCE +-+# ---------------- +-+# sets LIBLTDL to the link flags for the libltdl convenience library and +-+# LTDLINCL to the include flags for the libltdl header and adds +-+# --enable-ltdl-convenience to the configure arguments. Note that +-+# AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with +-+# '${top_build_prefix}' if available, otherwise with '${top_builddir}/', +-+# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +-+# quotes!). If your package is not flat and you're not using automake, +-+# define top_build_prefix, top_builddir, and top_srcdir appropriately +-+# in your Makefiles. +-+AC_DEFUN([LTDL_CONVENIENCE], +-+[AC_BEFORE([$0], [LTDL_INIT])dnl +-+dnl Although the argument is deprecated and no longer documented, +-+dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one +-+dnl here make sure it is the same as any other declaration of libltdl's +-+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +-+dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +-+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +-+_$0() +-+])# LTDL_CONVENIENCE +-+ +-+# AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools, +-+# now we have LT_CONFIG_LTDL_DIR: +-+AU_DEFUN([AC_LIBLTDL_CONVENIENCE], +-+[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +-+_LTDL_CONVENIENCE]) +-+ +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], []) +-+ +-+ +-+# _LTDL_CONVENIENCE +-+# ----------------- +-+# Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]). +-+m4_defun([_LTDL_CONVENIENCE], +-+[case $enable_ltdl_convenience in +-+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; +-+ "") enable_ltdl_convenience=yes +-+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; +-+esac +-+LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la" +-+LTDLDEPS=$LIBLTDL +-+LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" +-+ +-+AC_SUBST([LIBLTDL]) +-+AC_SUBST([LTDLDEPS]) +-+AC_SUBST([LTDLINCL]) +-+ +-+# For backwards non-gettext consistent compatibility... +-+INCLTDL="$LTDLINCL" +-+AC_SUBST([INCLTDL]) +-+])# _LTDL_CONVENIENCE +-+ +-+ +-+# LTDL_INSTALLABLE +-+# ---------------- +-+# sets LIBLTDL to the link flags for the libltdl installable library +-+# and LTDLINCL to the include flags for the libltdl header and adds +-+# --enable-ltdl-install to the configure arguments. Note that +-+# AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl +-+# is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if +-+# available, otherwise with '${top_builddir}/', and LTDLINCL will be +-+# prefixed with '${top_srcdir}/' (note the single quotes!). If your +-+# package is not flat and you're not using automake, define top_build_prefix, +-+# top_builddir, and top_srcdir appropriately in your Makefiles. +-+# In the future, this macro may have to be called after LT_INIT. +-+AC_DEFUN([LTDL_INSTALLABLE], +-+[AC_BEFORE([$0], [LTDL_INIT])dnl +-+dnl Although the argument is deprecated and no longer documented, +-+dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one +-+dnl here make sure it is the same as any other declaration of libltdl's +-+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +-+dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +-+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +-+_$0() +-+])# LTDL_INSTALLABLE +-+ +-+# AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools, +-+# now we have LT_CONFIG_LTDL_DIR: +-+AU_DEFUN([AC_LIBLTDL_INSTALLABLE], +-+[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +-+_LTDL_INSTALLABLE]) +-+ +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], []) +-+ +-+ +-+# _LTDL_INSTALLABLE +-+# ----------------- +-+# Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]). +-+m4_defun([_LTDL_INSTALLABLE], +-+[if test -f $prefix/lib/libltdl.la; then +-+ lt_save_LDFLAGS="$LDFLAGS" +-+ LDFLAGS="-L$prefix/lib $LDFLAGS" +-+ AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes]) +-+ LDFLAGS="$lt_save_LDFLAGS" +-+ if test x"${lt_lib_ltdl-no}" = xyes; then +-+ if test x"$enable_ltdl_install" != xyes; then +-+ # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install +-+ AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install']) +-+ enable_ltdl_install=no +-+ fi +-+ elif test x"$enable_ltdl_install" = xno; then +-+ AC_MSG_WARN([libltdl not installed, but installation disabled]) +-+ fi +-+fi +-+ +-+# If configure.ac declared an installable ltdl, and the user didn't override +-+# with --disable-ltdl-install, we will install the shipped libltdl. +-+case $enable_ltdl_install in +-+ no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no" +-+ LIBLTDL="-lltdl" +-+ LTDLDEPS= +-+ LTDLINCL= +-+ ;; +-+ *) enable_ltdl_install=yes +-+ ac_configure_args="$ac_configure_args --enable-ltdl-install" +-+ LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la" +-+ LTDLDEPS=$LIBLTDL +-+ LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" +-+ ;; +-+esac +-+ +-+AC_SUBST([LIBLTDL]) +-+AC_SUBST([LTDLDEPS]) +-+AC_SUBST([LTDLINCL]) +-+ +-+# For backwards non-gettext consistent compatibility... +-+INCLTDL="$LTDLINCL" +-+AC_SUBST([INCLTDL]) +-+])# LTDL_INSTALLABLE +-+ +-+ +-+# _LTDL_MODE_DISPATCH +-+# ------------------- +-+m4_define([_LTDL_MODE_DISPATCH], +-+[dnl If _LTDL_DIR is `.', then we are configuring libltdl itself: +-+m4_if(_LTDL_DIR, [], +-+ [], +-+ dnl if _LTDL_MODE was not set already, the default value is `subproject': +-+ [m4_case(m4_default(_LTDL_MODE, [subproject]), +-+ [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR) +-+ _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])], +-+ [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])], +-+ [recursive], [], +-+ [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl +-+dnl Be careful not to expand twice: +-+m4_define([$0], []) +-+])# _LTDL_MODE_DISPATCH +-+ +-+ +-+# _LT_LIBOBJ(MODULE_NAME) +-+# ----------------------- +-+# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead +-+# of into LIBOBJS. +-+AC_DEFUN([_LT_LIBOBJ], [ +-+ m4_pattern_allow([^_LT_LIBOBJS$]) +-+ _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +-+])# _LT_LIBOBJS +-+ +-+ +-+# LTDL_INIT([OPTIONS]) +-+# -------------------- +-+# Clients of libltdl can use this macro to allow the installer to +-+# choose between a shipped copy of the ltdl sources or a preinstalled +-+# version of the library. If the shipped ltdl sources are not in a +-+# subdirectory named libltdl, the directory name must be given by +-+# LT_CONFIG_LTDL_DIR. +-+AC_DEFUN([LTDL_INIT], +-+[dnl Parse OPTIONS +-+_LT_SET_OPTIONS([$0], [$1]) +-+ +-+dnl We need to keep our own list of libobjs separate from our parent project, +-+dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +-+dnl we look for our own LIBOBJs. +-+m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +-+m4_pushdef([AC_LIBSOURCES]) +-+ +-+dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: +-+m4_if(_LTDL_MODE, [], +-+ [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) +-+ m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], +-+ [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) +-+ +-+AC_ARG_WITH([included_ltdl], +-+ [AS_HELP_STRING([--with-included-ltdl], +-+ [use the GNU ltdl sources included here])]) +-+ +-+if test "x$with_included_ltdl" != xyes; then +-+ # We are not being forced to use the included libltdl sources, so +-+ # decide whether there is a useful installed version we can use. +-+ AC_CHECK_HEADER([ltdl.h], +-+ [AC_CHECK_DECL([lt_dlinterface_register], +-+ [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], +-+ [with_included_ltdl=no], +-+ [with_included_ltdl=yes])], +-+ [with_included_ltdl=yes], +-+ [AC_INCLUDES_DEFAULT +-+ #include ])], +-+ [with_included_ltdl=yes], +-+ [AC_INCLUDES_DEFAULT] +-+ ) +-+fi +-+ +-+dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE +-+dnl was called yet, then for old times' sake, we assume libltdl is in an +-+dnl eponymous directory: +-+AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) +-+ +-+AC_ARG_WITH([ltdl_include], +-+ [AS_HELP_STRING([--with-ltdl-include=DIR], +-+ [use the ltdl headers installed in DIR])]) +-+ +-+if test -n "$with_ltdl_include"; then +-+ if test -f "$with_ltdl_include/ltdl.h"; then : +-+ else +-+ AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) +-+ fi +-+else +-+ with_ltdl_include=no +-+fi +-+ +-+AC_ARG_WITH([ltdl_lib], +-+ [AS_HELP_STRING([--with-ltdl-lib=DIR], +-+ [use the libltdl.la installed in DIR])]) +-+ +-+if test -n "$with_ltdl_lib"; then +-+ if test -f "$with_ltdl_lib/libltdl.la"; then : +-+ else +-+ AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) +-+ fi +-+else +-+ with_ltdl_lib=no +-+fi +-+ +-+case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in +-+ ,yes,no,no,) +-+ m4_case(m4_default(_LTDL_TYPE, [convenience]), +-+ [convenience], [_LTDL_CONVENIENCE], +-+ [installable], [_LTDL_INSTALLABLE], +-+ [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) +-+ ;; +-+ ,no,no,no,) +-+ # If the included ltdl is not to be used, then use the +-+ # preinstalled libltdl we found. +-+ AC_DEFINE([HAVE_LTDL], [1], +-+ [Define this if a modern libltdl is already installed]) +-+ LIBLTDL=-lltdl +-+ LTDLDEPS= +-+ LTDLINCL= +-+ ;; +-+ ,no*,no,*) +-+ AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) +-+ ;; +-+ *) with_included_ltdl=no +-+ LIBLTDL="-L$with_ltdl_lib -lltdl" +-+ LTDLDEPS= +-+ LTDLINCL="-I$with_ltdl_include" +-+ ;; +-+esac +-+INCLTDL="$LTDLINCL" +-+ +-+# Report our decision... +-+AC_MSG_CHECKING([where to find libltdl headers]) +-+AC_MSG_RESULT([$LTDLINCL]) +-+AC_MSG_CHECKING([where to find libltdl library]) +-+AC_MSG_RESULT([$LIBLTDL]) +-+ +-+_LTDL_SETUP +-+ +-+dnl restore autoconf definition. +-+m4_popdef([AC_LIBOBJ]) +-+m4_popdef([AC_LIBSOURCES]) +-+ +-+AC_CONFIG_COMMANDS_PRE([ +-+ _ltdl_libobjs= +-+ _ltdl_ltlibobjs= +-+ if test -n "$_LT_LIBOBJS"; then +-+ # Remove the extension. +-+ _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' +-+ for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do +-+ _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" +-+ _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" +-+ done +-+ fi +-+ AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) +-+ AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +-+]) +-+ +-+# Only expand once: +-+m4_define([LTDL_INIT]) +-+])# LTDL_INIT +-+ +-+# Old names: +-+AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) +-+AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) +-+AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LIB_LTDL], []) +-+dnl AC_DEFUN([AC_WITH_LTDL], []) +-+dnl AC_DEFUN([LT_WITH_LTDL], []) +-+ +-+ +-+# _LTDL_SETUP +-+# ----------- +-+# Perform all the checks necessary for compilation of the ltdl objects +-+# -- including compiler checks and header checks. This is a public +-+# interface mainly for the benefit of libltdl's own configure.ac, most +-+# other users should call LTDL_INIT instead. +-+AC_DEFUN([_LTDL_SETUP], +-+[AC_REQUIRE([AC_PROG_CC])dnl +-+AC_REQUIRE([LT_SYS_MODULE_EXT])dnl +-+AC_REQUIRE([LT_SYS_MODULE_PATH])dnl +-+AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl +-+AC_REQUIRE([LT_LIB_DLLOAD])dnl +-+AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +-+AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl +-+AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl +-+AC_REQUIRE([gl_FUNC_ARGZ])dnl +-+ +-+m4_require([_LT_CHECK_OBJDIR])dnl +-+m4_require([_LT_HEADER_DLFCN])dnl +-+m4_require([_LT_CHECK_DLPREOPEN])dnl +-+m4_require([_LT_DECL_SED])dnl +-+ +-+dnl Don't require this, or it will be expanded earlier than the code +-+dnl that sets the variables it relies on: +-+_LT_ENABLE_INSTALL +-+ +-+dnl _LTDL_MODE specific code must be called at least once: +-+_LTDL_MODE_DISPATCH +-+ +-+# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +-+# the user used. This is so that ltdl.h can pick up the parent projects +-+# config.h file, The first file in AC_CONFIG_HEADERS must contain the +-+# definitions required by ltdl.c. +-+# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). +-+AC_CONFIG_COMMANDS_PRE([dnl +-+m4_pattern_allow([^LT_CONFIG_H$])dnl +-+m4_ifset([AH_HEADER], +-+ [LT_CONFIG_H=AH_HEADER], +-+ [m4_ifset([AC_LIST_HEADERS], +-+ [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], +-+ [])])]) +-+AC_SUBST([LT_CONFIG_H]) +-+ +-+AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], +-+ [], [], [AC_INCLUDES_DEFAULT]) +-+ +-+AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) +-+AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) +-+ +-+AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) +-+ +-+name=ltdl +-+LTDLOPEN=`eval "\\$ECHO \"$libname_spec\""` +-+AC_SUBST([LTDLOPEN]) +-+])# _LTDL_SETUP +-+ +-+ +-+# _LT_ENABLE_INSTALL +-+# ------------------ +-+m4_define([_LT_ENABLE_INSTALL], +-+[AC_ARG_ENABLE([ltdl-install], +-+ [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])]) +-+ +-+case ,${enable_ltdl_install},${enable_ltdl_convenience} in +-+ *yes*) ;; +-+ *) enable_ltdl_convenience=yes ;; +-+esac +-+ +-+m4_ifdef([AM_CONDITIONAL], +-+[AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno) +-+ AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)]) +-+])# _LT_ENABLE_INSTALL +-+ +-+ +-+# LT_SYS_DLOPEN_DEPLIBS +-+# --------------------- +-+AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], +-+[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-+AC_CACHE_CHECK([whether deplibs are loaded by dlopen], +-+ [lt_cv_sys_dlopen_deplibs], +-+ [# PORTME does your system automatically load deplibs for dlopen? +-+ # or its logical equivalent (e.g. shl_load for HP-UX < 11) +-+ # For now, we just catch OSes we know something about -- in the +-+ # future, we'll try test this programmatically. +-+ lt_cv_sys_dlopen_deplibs=unknown +-+ case $host_os in +-+ aix3*|aix4.1.*|aix4.2.*) +-+ # Unknown whether this is true for these versions of AIX, but +-+ # we want this `case' here to explicitly catch those versions. +-+ lt_cv_sys_dlopen_deplibs=unknown +-+ ;; +-+ aix[[4-9]]*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ amigaos*) +-+ case $host_cpu in +-+ powerpc) +-+ lt_cv_sys_dlopen_deplibs=no +-+ ;; +-+ esac +-+ ;; +-+ darwin*) +-+ # Assuming the user has installed a libdl from somewhere, this is true +-+ # If you are looking for one http://www.opendarwin.org/projects/dlcompat +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ freebsd* | dragonfly*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ gnu* | linux* | k*bsd*-gnu) +-+ # GNU and its variants, using gnu ld.so (Glibc) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ hpux10*|hpux11*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ interix*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ irix[[12345]]*|irix6.[[01]]*) +-+ # Catch all versions of IRIX before 6.2, and indicate that we don't +-+ # know how it worked for any of those versions. +-+ lt_cv_sys_dlopen_deplibs=unknown +-+ ;; +-+ irix*) +-+ # The case above catches anything before 6.2, and it's known that +-+ # at 6.2 and later dlopen does load deplibs. +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ netbsd*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ openbsd*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ osf[[1234]]*) +-+ # dlopen did load deplibs (at least at 4.x), but until the 5.x series, +-+ # it did *not* use an RPATH in a shared library to find objects the +-+ # library depends on, so we explicitly say `no'. +-+ lt_cv_sys_dlopen_deplibs=no +-+ ;; +-+ osf5.0|osf5.0a|osf5.1) +-+ # dlopen *does* load deplibs and with the right loader patch applied +-+ # it even uses RPATH in a shared library to search for shared objects +-+ # that the library depends on, but there's no easy way to know if that +-+ # patch is installed. Since this is the case, all we can really +-+ # say is unknown -- it depends on the patch being installed. If +-+ # it is, this changes to `yes'. Without it, it would be `no'. +-+ lt_cv_sys_dlopen_deplibs=unknown +-+ ;; +-+ osf*) +-+ # the two cases above should catch all versions of osf <= 5.1. Read +-+ # the comments above for what we know about them. +-+ # At > 5.1, deplibs are loaded *and* any RPATH in a shared library +-+ # is used to find them so we can finally say `yes'. +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ qnx*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ solaris*) +-+ lt_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +-+ libltdl_cv_sys_dlopen_deplibs=yes +-+ ;; +-+ esac +-+ ]) +-+if test "$lt_cv_sys_dlopen_deplibs" != yes; then +-+ AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], +-+ [Define if the OS needs help to load dependent libraries for dlopen().]) +-+fi +-+])# LT_SYS_DLOPEN_DEPLIBS +-+ +-+# Old name: +-+AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], []) +-+ +-+ +-+# LT_SYS_MODULE_EXT +-+# ----------------- +-+AC_DEFUN([LT_SYS_MODULE_EXT], +-+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +-+AC_CACHE_CHECK([which extension is used for runtime loadable modules], +-+ [libltdl_cv_shlibext], +-+[ +-+module=yes +-+eval libltdl_cv_shlibext=$shrext_cmds +-+ ]) +-+if test -n "$libltdl_cv_shlibext"; then +-+ m4_pattern_allow([LT_MODULE_EXT])dnl +-+ AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], +-+ [Define to the extension used for runtime loadable modules, say, ".so".]) +-+fi +-+])# LT_SYS_MODULE_EXT +-+ +-+# Old name: +-+AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LTDL_SHLIBEXT], []) +-+ +-+ +-+# LT_SYS_MODULE_PATH +-+# ------------------ +-+AC_DEFUN([LT_SYS_MODULE_PATH], +-+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +-+AC_CACHE_CHECK([which variable specifies run-time module search path], +-+ [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) +-+if test -n "$lt_cv_module_path_var"; then +-+ m4_pattern_allow([LT_MODULE_PATH_VAR])dnl +-+ AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], +-+ [Define to the name of the environment variable that determines the run-time module search path.]) +-+fi +-+])# LT_SYS_MODULE_PATH +-+ +-+# Old name: +-+AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LTDL_SHLIBPATH], []) +-+ +-+ +-+# LT_SYS_DLSEARCH_PATH +-+# -------------------- +-+AC_DEFUN([LT_SYS_DLSEARCH_PATH], +-+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +-+AC_CACHE_CHECK([for the default library search path], +-+ [lt_cv_sys_dlsearch_path], +-+ [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) +-+if test -n "$lt_cv_sys_dlsearch_path"; then +-+ sys_dlsearch_path= +-+ for dir in $lt_cv_sys_dlsearch_path; do +-+ if test -z "$sys_dlsearch_path"; then +-+ sys_dlsearch_path="$dir" +-+ else +-+ sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" +-+ fi +-+ done +-+ m4_pattern_allow([LT_DLSEARCH_PATH])dnl +-+ AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], +-+ [Define to the system default library search path.]) +-+fi +-+])# LT_SYS_DLSEARCH_PATH +-+ +-+# Old name: +-+AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], []) +-+ +-+ +-+# _LT_CHECK_DLPREOPEN +-+# ------------------- +-+m4_defun([_LT_CHECK_DLPREOPEN], +-+[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +-+AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen], +-+ [libltdl_cv_preloaded_symbols], +-+ [if test -n "$lt_cv_sys_global_symbol_pipe"; then +-+ libltdl_cv_preloaded_symbols=yes +-+ else +-+ libltdl_cv_preloaded_symbols=no +-+ fi +-+ ]) +-+if test x"$libltdl_cv_preloaded_symbols" = xyes; then +-+ AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1], +-+ [Define if libtool can extract symbol lists from object files.]) +-+fi +-+])# _LT_CHECK_DLPREOPEN +-+ +-+ +-+# LT_LIB_DLLOAD +-+# ------------- +-+AC_DEFUN([LT_LIB_DLLOAD], +-+[m4_pattern_allow([^LT_DLLOADERS$]) +-+LT_DLLOADERS= +-+AC_SUBST([LT_DLLOADERS]) +-+ +-+AC_LANG_PUSH([C]) +-+ +-+LIBADD_DLOPEN= +-+AC_SEARCH_LIBS([dlopen], [dl], +-+ [AC_DEFINE([HAVE_LIBDL], [1], +-+ [Define if you have the libdl library or equivalent.]) +-+ if test "$ac_cv_search_dlopen" != "none required" ; then +-+ LIBADD_DLOPEN="-ldl" +-+ fi +-+ libltdl_cv_lib_dl_dlopen="yes" +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], +-+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H +-+# include +-+#endif +-+ ]], [[dlopen(0, 0);]])], +-+ [AC_DEFINE([HAVE_LIBDL], [1], +-+ [Define if you have the libdl library or equivalent.]) +-+ libltdl_cv_func_dlopen="yes" +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], +-+ [AC_CHECK_LIB([svld], [dlopen], +-+ [AC_DEFINE([HAVE_LIBDL], [1], +-+ [Define if you have the libdl library or equivalent.]) +-+ LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) +-+if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes +-+then +-+ lt_save_LIBS="$LIBS" +-+ LIBS="$LIBS $LIBADD_DLOPEN" +-+ AC_CHECK_FUNCS([dlerror]) +-+ LIBS="$lt_save_LIBS" +-+fi +-+AC_SUBST([LIBADD_DLOPEN]) +-+ +-+LIBADD_SHL_LOAD= +-+AC_CHECK_FUNC([shl_load], +-+ [AC_DEFINE([HAVE_SHL_LOAD], [1], +-+ [Define if you have the shl_load function.]) +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], +-+ [AC_CHECK_LIB([dld], [shl_load], +-+ [AC_DEFINE([HAVE_SHL_LOAD], [1], +-+ [Define if you have the shl_load function.]) +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" +-+ LIBADD_SHL_LOAD="-ldld"])]) +-+AC_SUBST([LIBADD_SHL_LOAD]) +-+ +-+case $host_os in +-+darwin[[1567]].*) +-+# We only want this for pre-Mac OS X 10.4. +-+ AC_CHECK_FUNC([_dyld_func_lookup], +-+ [AC_DEFINE([HAVE_DYLD], [1], +-+ [Define if you have the _dyld_func_lookup function.]) +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) +-+ ;; +-+beos*) +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" +-+ ;; +-+cygwin* | mingw* | os2* | pw32*) +-+ AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" +-+ ;; +-+esac +-+ +-+AC_CHECK_LIB([dld], [dld_link], +-+ [AC_DEFINE([HAVE_DLD], [1], +-+ [Define if you have the GNU dld library.]) +-+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) +-+AC_SUBST([LIBADD_DLD_LINK]) +-+ +-+m4_pattern_allow([^LT_DLPREOPEN$]) +-+LT_DLPREOPEN= +-+if test -n "$LT_DLLOADERS" +-+then +-+ for lt_loader in $LT_DLLOADERS; do +-+ LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " +-+ done +-+ AC_DEFINE([HAVE_LIBDLLOADER], [1], +-+ [Define if libdlloader will be built on this platform]) +-+fi +-+AC_SUBST([LT_DLPREOPEN]) +-+ +-+dnl This isn't used anymore, but set it for backwards compatibility +-+LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" +-+AC_SUBST([LIBADD_DL]) +-+ +-+AC_LANG_POP +-+])# LT_LIB_DLLOAD +-+ +-+# Old name: +-+AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LTDL_DLLIB], []) +-+ +-+ +-+# LT_SYS_SYMBOL_USCORE +-+# -------------------- +-+# does the compiler prefix global symbols with an underscore? +-+AC_DEFUN([LT_SYS_SYMBOL_USCORE], +-+[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +-+AC_CACHE_CHECK([for _ prefix in compiled symbols], +-+ [lt_cv_sys_symbol_underscore], +-+ [lt_cv_sys_symbol_underscore=no +-+ cat > conftest.$ac_ext <<_LT_EOF +-+void nm_test_func(){} +-+int main(){nm_test_func;return 0;} +-+_LT_EOF +-+ if AC_TRY_EVAL(ac_compile); then +-+ # Now try to grab the symbols. +-+ ac_nlist=conftest.nm +-+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then +-+ # See whether the symbols have a leading underscore. +-+ if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then +-+ lt_cv_sys_symbol_underscore=yes +-+ else +-+ if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then +-+ : +-+ else +-+ echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD +-+ fi +-+ fi +-+ else +-+ echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD +-+ fi +-+ else +-+ echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD +-+ cat conftest.c >&AS_MESSAGE_LOG_FD +-+ fi +-+ rm -rf conftest* +-+ ]) +-+ sys_symbol_underscore=$lt_cv_sys_symbol_underscore +-+ AC_SUBST([sys_symbol_underscore]) +-+])# LT_SYS_SYMBOL_USCORE +-+ +-+# Old name: +-+AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], []) +-+ +-+ +-+# LT_FUNC_DLSYM_USCORE +-+# -------------------- +-+AC_DEFUN([LT_FUNC_DLSYM_USCORE], +-+[AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +-+if test x"$lt_cv_sys_symbol_underscore" = xyes; then +-+ if test x"$libltdl_cv_func_dlopen" = xyes || +-+ test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then +-+ AC_CACHE_CHECK([whether we have to add an underscore for dlsym], +-+ [libltdl_cv_need_uscore], +-+ [libltdl_cv_need_uscore=unknown +-+ save_LIBS="$LIBS" +-+ LIBS="$LIBS $LIBADD_DLOPEN" +-+ _LT_TRY_DLOPEN_SELF( +-+ [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], +-+ [], [libltdl_cv_need_uscore=cross]) +-+ LIBS="$save_LIBS" +-+ ]) +-+ fi +-+fi +-+ +-+if test x"$libltdl_cv_need_uscore" = xyes; then +-+ AC_DEFINE([NEED_USCORE], [1], +-+ [Define if dlsym() requires a leading underscore in symbol names.]) +-+fi +-+])# LT_FUNC_DLSYM_USCORE +-+ +-+# Old name: +-+AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE]) +-+dnl aclocal-1.4 backwards compatibility: +-+dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], []) +-+ +- # Helper functions for option handling. -*- Autoconf -*- +- # +- # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +- # Written by Gary V. Vaughan, 2004 +- # +- # This file is free software; the Free Software Foundation gives +- # unlimited permission to copy and/or distribute it, with or without +- # modifications, as long as this notice is preserved. +-diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +---- a/js/src/ctypes/libffi/configure +-+++ b/js/src/ctypes/libffi/configure +-@@ -747,16 +747,17 @@ am__EXEEXT_TRUE +- LTLIBOBJS +- LIBOBJS +- toolexeclibdir +- toolexecdir +- FFI_DEBUG_FALSE +- FFI_DEBUG_TRUE +- TARGETDIR +- TARGET +-+sys_symbol_underscore +- HAVE_LONG_DOUBLE +- ALLOCA +- PA64_HPUX_FALSE +- PA64_HPUX_TRUE +- PA_HPUX_FALSE +- PA_HPUX_TRUE +- PA_LINUX_FALSE +- PA_LINUX_TRUE +-@@ -5045,23 +5046,23 @@ test -z "$NM" && NM=nm +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +- $as_echo_n "checking the name lister ($NM) interface... " >&6; } +- if test "${lt_cv_nm_interface+set}" = set; then : +- $as_echo_n "(cached) " >&6 +- else +- lt_cv_nm_interface="BSD nm" +- echo "int some_variable = 0;" > conftest.$ac_ext +-- (eval echo "\"\$as_me:5053: $ac_compile\"" >&5) +-+ (eval echo "\"\$as_me:5054: $ac_compile\"" >&5) +- (eval "$ac_compile" 2>conftest.err) +- cat conftest.err >&5 +-- (eval echo "\"\$as_me:5056: $NM \\\"conftest.$ac_objext\\\"\"" >&5) +-+ (eval echo "\"\$as_me:5057: $NM \\\"conftest.$ac_objext\\\"\"" >&5) +- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) +- cat conftest.err >&5 +-- (eval echo "\"\$as_me:5059: output\"" >&5) +-+ (eval echo "\"\$as_me:5060: output\"" >&5) +- cat conftest.out >&5 +- if $GREP 'External.*some_variable' conftest.out > /dev/null; then +- lt_cv_nm_interface="MS dumpbin" +- fi +- rm -f conftest* +- fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +- $as_echo "$lt_cv_nm_interface" >&6; } +-@@ -6257,17 +6258,17 @@ ia64-*-hpux*) +- HPUX_IA64_MODE="64" +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +- *-*-irix6*) +- # Find out which ABI we are using. +-- echo '#line 6265 "configure"' > conftest.$ac_ext +-+ echo '#line 6266 "configure"' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$lt_cv_prog_gnu_ld" = yes; then +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +-@@ -7783,21 +7784,21 @@ else +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +-- (eval echo "\"\$as_me:7791: $lt_compile\"" >&5) +-+ (eval echo "\"\$as_me:7792: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +-- echo "$as_me:7795: \$? = $ac_status" >&5 +-+ echo "$as_me:7796: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_rtti_exceptions=yes +- fi +-@@ -8122,21 +8123,21 @@ else +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +-- (eval echo "\"\$as_me:8130: $lt_compile\"" >&5) +-+ (eval echo "\"\$as_me:8131: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +-- echo "$as_me:8134: \$? = $ac_status" >&5 +-+ echo "$as_me:8135: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_pic_works=yes +- fi +-@@ -8227,21 +8228,21 @@ else +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +-- (eval echo "\"\$as_me:8235: $lt_compile\"" >&5) +-+ (eval echo "\"\$as_me:8236: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +-- echo "$as_me:8239: \$? = $ac_status" >&5 +-+ echo "$as_me:8240: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o=yes +-@@ -8282,21 +8283,21 @@ else +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +-- (eval echo "\"\$as_me:8290: $lt_compile\"" >&5) +-+ (eval echo "\"\$as_me:8291: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +-- echo "$as_me:8294: \$? = $ac_status" >&5 +-+ echo "$as_me:8295: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o=yes +-@@ -10652,17 +10653,17 @@ if test "${lt_cv_dlopen_self+set}" = set +- $as_echo_n "(cached) " >&6 +- else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self=cross +- else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext <<_LT_EOF +--#line 10660 "configure" +-+#line 10661 "configure" +- #include "confdefs.h" +- +- #if HAVE_DLFCN_H +- #include +- #endif +- +- #include +- +-@@ -10748,17 +10749,17 @@ if test "${lt_cv_dlopen_self_static+set} +- $as_echo_n "(cached) " >&6 +- else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self_static=cross +- else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext <<_LT_EOF +--#line 10756 "configure" +-+#line 10757 "configure" +- #include "confdefs.h" +- +- #if HAVE_DLFCN_H +- #include +- #endif +- +- #include +- +-@@ -12356,16 +12357,71 @@ fi +- $as_echo "$libffi_cv_as_string_pseudo_op" >&6; } +- if test "x$libffi_cv_as_string_pseudo_op" = xyes; then +- +- $as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h +- +- fi +- fi +- +-+if test x$TARGET = xX86_WIN64; then +-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5 +-+$as_echo_n "checking for _ prefix in compiled symbols... " >&6; } +-+if test "${lt_cv_sys_symbol_underscore+set}" = set; then : +-+ $as_echo_n "(cached) " >&6 +-+else +-+ lt_cv_sys_symbol_underscore=no +-+ cat > conftest.$ac_ext <<_LT_EOF +-+void nm_test_func(){} +-+int main(){nm_test_func;return 0;} +-+_LT_EOF +-+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +-+ (eval $ac_compile) 2>&5 +-+ ac_status=$? +-+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +-+ test $ac_status = 0; }; then +-+ # Now try to grab the symbols. +-+ ac_nlist=conftest.nm +-+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5 +-+ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5 +-+ ac_status=$? +-+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +-+ test $ac_status = 0; } && test -s "$ac_nlist"; then +-+ # See whether the symbols have a leading underscore. +-+ if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then +-+ lt_cv_sys_symbol_underscore=yes +-+ else +-+ if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then +-+ : +-+ else +-+ echo "configure: cannot find nm_test_func in $ac_nlist" >&5 +-+ fi +-+ fi +-+ else +-+ echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5 +-+ fi +-+ else +-+ echo "configure: failed program was:" >&5 +-+ cat conftest.c >&5 +-+ fi +-+ rm -rf conftest* +-+ +-+fi +-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5 +-+$as_echo "$lt_cv_sys_symbol_underscore" >&6; } +-+ sys_symbol_underscore=$lt_cv_sys_symbol_underscore +-+ +-+ +-+ if test "x$sys_symbol_underscore" = xyes; then +-+ +-+$as_echo "#define SYMBOL_UNDERSCORE 1" >>confdefs.h +-+ +-+ fi +-+fi +-+ +- case "$target" in +- # Darwin 10 (OSX 10.6) and beyond allocate non-executable pages +- *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +- +- $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h +- +- ;; +- esac +-diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +---- a/js/src/ctypes/libffi/configure.ac +-+++ b/js/src/ctypes/libffi/configure.ac +-@@ -310,16 +310,23 @@ if test x$TARGET = xX86 || test x$TARGET +- [libffi_cv_as_string_pseudo_op=no]) +- ]) +- if test "x$libffi_cv_as_string_pseudo_op" = xyes; then +- AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1, +- [Define if your assembler supports .string.]) +- fi +- fi +- +-+if test x$TARGET = xX86_WIN64; then +-+ LT_SYS_SYMBOL_USCORE +-+ if test "x$sys_symbol_underscore" = xyes; then +-+ AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) +-+ fi +-+fi +-+ +- case "$target" in +- # Darwin 10 (OSX 10.6) and beyond allocate non-executable pages +- *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +- AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, +- [Cannot use malloc on this target, so, we revert to +- alternative means]) +- ;; +- esac +-diff --git a/js/src/ctypes/libffi/src/x86/win64.S b/js/src/ctypes/libffi/src/x86/win64.S +---- a/js/src/ctypes/libffi/src/x86/win64.S +-+++ b/js/src/ctypes/libffi/src/x86/win64.S +-@@ -227,32 +227,40 @@ ret_void$: +- xor rax, rax +- +- lea rsp, QWORD PTR [rbp+16] +- pop rbp +- ret 0 +- ffi_call_win64 ENDP +- _TEXT ENDS +- END +--#else +-+ +-+#else +-+ +-+#ifdef SYMBOL_UNDERSCORE +-+#define SYMBOL_NAME(name) _##name +-+#else +-+#define SYMBOL_NAME(name) name +-+#endif +-+ +- .text +- +--.extern _ffi_closure_win64_inner +-+.extern SYMBOL_NAME(ffi_closure_win64_inner) +- +- # ffi_closure_win64 will be called with these registers set: +- # rax points to 'closure' +- # r11 contains a bit mask that specifies which of the +- # first four parameters are float or double +- # +- # It must move the parameters passed in registers to their stack location, +- # call ffi_closure_win64_inner for the actual work, then return the result. +- # +- .balign 16 +-- .globl _ffi_closure_win64 +--_ffi_closure_win64: +-+ .globl SYMBOL_NAME(ffi_closure_win64) +-+SYMBOL_NAME(ffi_closure_win64): +- # copy register arguments onto stack +- test $1,%r11 +- jne .Lfirst_is_float +- mov %rcx, 8(%rsp) +- jmp .Lsecond +- .Lfirst_is_float: +- movlpd %xmm0, 8(%rsp) +- +-@@ -282,27 +290,27 @@ END +- +- .Ldone: +- #.ALLOCSTACK 40 +- sub $40, %rsp +- #.ENDPROLOG +- mov %rax, %rcx # context is first parameter +- mov %rsp, %rdx # stack is second parameter +- add $48, %rdx # point to start of arguments +-- mov $_ffi_closure_win64_inner, %rax +-+ mov $SYMBOL_NAME(ffi_closure_win64_inner), %rax +- callq *%rax # call the real closure function +- add $40, %rsp +- movq %rax, %xmm0 # If the closure returned a float, +- # ffi_closure_win64_inner wrote it to rax +- retq +- .ffi_closure_win64_end: +- +- .balign 16 +-- .globl _ffi_call_win64 +--_ffi_call_win64: +-+ .globl SYMBOL_NAME(ffi_call_win64) +-+SYMBOL_NAME(ffi_call_win64): +- # copy registers onto stack +- mov %r9,32(%rsp) +- mov %r8,24(%rsp) +- mov %rdx,16(%rsp) +- mov %rcx,8(%rsp) +- #.PUSHREG rbp +- push %rbp +- #.ALLOCSTACK 48 +diff --git a/js/src/ctypes/patches-libffi/04-bug-756740.patch b/js/src/ctypes/patches-libffi/04-bug-756740.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/04-bug-756740.patch ++++ /dev/null +@@ -1,44 +0,0 @@ +-diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +---- a/js/src/ctypes/libffi/configure +-+++ b/js/src/ctypes/libffi/configure +-@@ -11251,17 +11251,17 @@ case "$host" in +- +- m68k-*-*) +- TARGET=M68K; TARGETDIR=m68k +- ;; +- +- mips-sgi-irix5.* | mips-sgi-irix6.*) +- TARGET=MIPS; TARGETDIR=mips +- ;; +-- mips*-*-linux*) +-+ mips*-*linux*) +- # Support 128-bit long double for NewABI. +- HAVE_LONG_DOUBLE='defined(__mips64)' +- TARGET=MIPS; TARGETDIR=mips +- ;; +- +- moxie-*-*) +- TARGET=MOXIE; TARGETDIR=moxie +- ;; +-diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +---- a/js/src/ctypes/libffi/configure.ac +-+++ b/js/src/ctypes/libffi/configure.ac +-@@ -113,17 +113,17 @@ case "$host" in +- +- m68k-*-*) +- TARGET=M68K; TARGETDIR=m68k +- ;; +- +- mips-sgi-irix5.* | mips-sgi-irix6.*) +- TARGET=MIPS; TARGETDIR=mips +- ;; +-- mips*-*-linux*) +-+ mips*-*linux*) +- # Support 128-bit long double for NewABI. +- HAVE_LONG_DOUBLE='defined(__mips64)' +- TARGET=MIPS; TARGETDIR=mips +- ;; +- +- moxie-*-*) +- TARGET=MOXIE; TARGETDIR=moxie +- ;; +diff --git a/js/src/ctypes/patches-libffi/05-bug-644136.patch b/js/src/ctypes/patches-libffi/05-bug-644136.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/05-bug-644136.patch ++++ /dev/null +@@ -1,31 +0,0 @@ +-# HG changeset patch +-# User Siarhei Siamashka +-# Date 1314529402 -3600 +-# Node ID 0be4a94258c28b97a7e6e87b099359c759941b22 +-# Parent f1cf848b1ff22bad8980b673cc4410a21c8bdf28 +-Bug 644136 - Add missing fpu directive to fix libffi build on ARM hardfloat systems; r=bsmedberg +- +-diff --git a/js/src/ctypes/libffi/src/arm/sysv.S b/js/src/ctypes/libffi/src/arm/sysv.S +---- a/js/src/ctypes/libffi/src/arm/sysv.S +-+++ b/js/src/ctypes/libffi/src/arm/sysv.S +-@@ -224,16 +224,20 @@ ARM_FUNC_START ffi_call_SYSV +- LSYM(Lepilogue): +- RETLDM "r0-r3,fp" +- +- .ffi_call_SYSV_end: +- UNWIND .fnend +- .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) +- +- +-+/* Below are VFP hard-float ABI call and closure implementations. +-+ Add VFP FPU directive here. */ +-+ .fpu vfp +-+ +- @ r0: fn +- @ r1: &ecif +- @ r2: cif->bytes +- @ r3: fig->flags +- @ sp+0: ecif.rvalue +- +- ARM_FUNC_START ffi_call_VFP +- @ Save registers +diff --git a/js/src/ctypes/patches-libffi/06-bug-778414.patch b/js/src/ctypes/patches-libffi/06-bug-778414.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/06-bug-778414.patch ++++ /dev/null +@@ -1,99 +0,0 @@ +-diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +---- a/js/src/ctypes/libffi/configure +-+++ b/js/src/ctypes/libffi/configure +-@@ -12422,26 +12422,42 @@ case "$target" in +- *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +- +- $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h +- +- ;; +- esac +- +- if test x$TARGET = xX86_64; then +-- { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5 +--$as_echo_n "checking assembler supports unwind section type... " >&6; } +-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking toolchain supports unwind section type" >&5 +-+$as_echo_n "checking toolchain supports unwind section type... " >&6; } +- if test "${libffi_cv_as_x86_64_unwind_section_type+set}" = set; then : +- $as_echo_n "(cached) " >&6 +- else +- +-- libffi_cv_as_x86_64_unwind_section_type=yes +-- echo '.section .eh_frame,"a",@unwind' > conftest.s +-- if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then +-- libffi_cv_as_x86_64_unwind_section_type=no +-+ cat > conftest1.s << EOF +-+.text +-+.globl foo +-+foo: +-+jmp bar +-+.section .eh_frame,"a",@unwind +-+bar: +-+EOF +-+ +-+ cat > conftest2.c << EOF +-+extern void foo(); +-+int main(){foo();} +-+EOF +-+ +-+ libffi_cv_as_x86_64_unwind_section_type=no +-+ # we ensure that we can compile _and_ link an assembly file containing an @unwind section +-+ # since the compiler can support it and not the linker (ie old binutils) +-+ if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \ +-+ $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then +-+ libffi_cv_as_x86_64_unwind_section_type=yes +- fi +- +- fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_64_unwind_section_type" >&5 +- $as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; } +- if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then +- +- $as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h +-diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +---- a/js/src/ctypes/libffi/configure.ac +-+++ b/js/src/ctypes/libffi/configure.ac +-@@ -327,22 +327,38 @@ case "$target" in +- *-apple-darwin1* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) +- AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, +- [Cannot use malloc on this target, so, we revert to +- alternative means]) +- ;; +- esac +- +- if test x$TARGET = xX86_64; then +-- AC_CACHE_CHECK([assembler supports unwind section type], +-+ AC_CACHE_CHECK([toolchain supports unwind section type], +- libffi_cv_as_x86_64_unwind_section_type, [ +-- libffi_cv_as_x86_64_unwind_section_type=yes +-- echo '.section .eh_frame,"a",@unwind' > conftest.s +-- if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then +-- libffi_cv_as_x86_64_unwind_section_type=no +-+ cat > conftest1.s << EOF +-+.text +-+.globl foo +-+foo: +-+jmp bar +-+.section .eh_frame,"a",@unwind +-+bar: +-+EOF +-+ +-+ cat > conftest2.c << EOF +-+extern void foo(); +-+int main(){foo();} +-+EOF +-+ +-+ libffi_cv_as_x86_64_unwind_section_type=no +-+ # we ensure that we can compile _and_ link an assembly file containing an @unwind section +-+ # since the compiler can support it and not the linker (ie old binutils) +-+ if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \ +-+ $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then +-+ libffi_cv_as_x86_64_unwind_section_type=yes +- fi +- ]) +- if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then +- AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1, +- [Define if your assembler supports unwind section type.]) +- fi +- fi +- +diff --git a/js/src/ctypes/patches-libffi/07-bug-928381.patch b/js/src/ctypes/patches-libffi/07-bug-928381.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/07-bug-928381.patch ++++ /dev/null +@@ -1,31 +0,0 @@ +-# HG changeset patch +-# User Landry Breuil +-# Date 1382105758 -7200 +-# Fri Oct 18 16:15:58 2013 +0200 +-# Node ID 5f82dae8c495a7fddf5ed935eb2a8be7f47b9bd8 +-# Parent d50df2233e95f4d45b35eddbfbe84bcdda6a11e2 +-Bug 928381 - ctypes/libffi: Fix stack alignment on *BSD/i386 r=glandium +- +-diff --git a/js/src/ctypes/libffi/src/x86/freebsd.S b/js/src/ctypes/libffi/src/x86/freebsd.S +---- a/js/src/ctypes/libffi/src/x86/freebsd.S +-+++ b/js/src/ctypes/libffi/src/x86/freebsd.S +-@@ -44,16 +44,19 @@ ffi_call_SYSV: +- pushl %ebp +- .LCFI0: +- movl %esp,%ebp +- .LCFI1: +- /* Make room for all of the new args. */ +- movl 16(%ebp),%ecx +- subl %ecx,%esp +- +-+ /* Align the stack pointer to 16-bytes */ +-+ andl $0xfffffff0, %esp +-+ +- movl %esp,%eax +- +- /* Place all of the ffi_prep_args in position */ +- pushl 12(%ebp) +- pushl %eax +- call *8(%ebp) +- +- /* Return stack to previous state and call the function */ +diff --git a/js/src/ctypes/patches-libffi/08-bug-928390.patch b/js/src/ctypes/patches-libffi/08-bug-928390.patch +deleted file mode 100644 +--- a/js/src/ctypes/patches-libffi/08-bug-928390.patch ++++ /dev/null +@@ -1,135 +0,0 @@ +-# HG changeset patch +-# Parent e5f7246bf2158ac88b3e0727811925c467226d2e +-# User Landry Breuil +-Bug 928390: Partially backport libffi upstream 049d8386ff for OpenBSD/mips/hppa. r=glandium +- +-diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure +---- a/js/src/ctypes/libffi/configure +-+++ b/js/src/ctypes/libffi/configure +-@@ -11208,17 +11208,17 @@ case "$host" in +- cris-*-*) +- TARGET=LIBFFI_CRIS; TARGETDIR=cris +- ;; +- +- frv-*-*) +- TARGET=FRV; TARGETDIR=frv +- ;; +- +-- hppa*-*-linux* | parisc*-*-linux*) +-+ hppa*-*-linux* | hppa*-*-openbsd* | parisc*-*-linux*) +- TARGET=PA_LINUX; TARGETDIR=pa +- ;; +- hppa*64-*-hpux*) +- TARGET=PA64_HPUX; TARGETDIR=pa +- ;; +- hppa*-*-hpux*) +- TARGET=PA_HPUX; TARGETDIR=pa +- ;; +-@@ -11251,17 +11251,17 @@ case "$host" in +- +- m68k-*-*) +- TARGET=M68K; TARGETDIR=m68k +- ;; +- +- mips-sgi-irix5.* | mips-sgi-irix6.*) +- TARGET=MIPS; TARGETDIR=mips +- ;; +-- mips*-*linux*) +-+ mips*-*linux* | mips*-*-openbsd*) +- # Support 128-bit long double for NewABI. +- HAVE_LONG_DOUBLE='defined(__mips64)' +- TARGET=MIPS; TARGETDIR=mips +- ;; +- +- moxie-*-*) +- TARGET=MOXIE; TARGETDIR=moxie +- ;; +-diff --git a/js/src/ctypes/libffi/configure.ac b/js/src/ctypes/libffi/configure.ac +---- a/js/src/ctypes/libffi/configure.ac +-+++ b/js/src/ctypes/libffi/configure.ac +-@@ -70,17 +70,17 @@ case "$host" in +- cris-*-*) +- TARGET=LIBFFI_CRIS; TARGETDIR=cris +- ;; +- +- frv-*-*) +- TARGET=FRV; TARGETDIR=frv +- ;; +- +-- hppa*-*-linux* | parisc*-*-linux*) +-+ hppa*-*-linux* | hppa*-*-openbsd* | parisc*-*-linux*) +- TARGET=PA_LINUX; TARGETDIR=pa +- ;; +- hppa*64-*-hpux*) +- TARGET=PA64_HPUX; TARGETDIR=pa +- ;; +- hppa*-*-hpux*) +- TARGET=PA_HPUX; TARGETDIR=pa +- ;; +-@@ -113,17 +113,17 @@ case "$host" in +- +- m68k-*-*) +- TARGET=M68K; TARGETDIR=m68k +- ;; +- +- mips-sgi-irix5.* | mips-sgi-irix6.*) +- TARGET=MIPS; TARGETDIR=mips +- ;; +-- mips*-*linux*) +-+ mips*-*linux* | mips*-*-openbsd*) +- # Support 128-bit long double for NewABI. +- HAVE_LONG_DOUBLE='defined(__mips64)' +- TARGET=MIPS; TARGETDIR=mips +- ;; +- +- moxie-*-*) +- TARGET=MOXIE; TARGETDIR=moxie +- ;; +-diff --git a/js/src/ctypes/libffi/src/mips/ffi.c b/js/src/ctypes/libffi/src/mips/ffi.c +---- a/js/src/ctypes/libffi/src/mips/ffi.c +-+++ b/js/src/ctypes/libffi/src/mips/ffi.c +-@@ -32,17 +32,21 @@ +- +- #ifdef __GNUC__ +- # if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) +- # define USE__BUILTIN___CLEAR_CACHE 1 +- # endif +- #endif +- +- #ifndef USE__BUILTIN___CLEAR_CACHE +--#include +-+# if defined(__OpenBSD__) +-+# include +-+# else +-+# include +-+# endif +- #endif +- +- #ifdef FFI_DEBUG +- # define FFI_MIPS_STOP_HERE() ffi_stop_here() +- #else +- # define FFI_MIPS_STOP_HERE() do {} while(0) +- #endif +- +-diff --git a/js/src/ctypes/libffi/src/mips/ffitarget.h b/js/src/ctypes/libffi/src/mips/ffitarget.h +---- a/js/src/ctypes/libffi/src/mips/ffitarget.h +-+++ b/js/src/ctypes/libffi/src/mips/ffitarget.h +-@@ -24,17 +24,17 @@ +- +- ----------------------------------------------------------------------- */ +- +- #ifndef LIBFFI_TARGET_H +- #define LIBFFI_TARGET_H +- +- #ifdef linux +- # include +--#else +-+#elif !defined(__OpenBSD__) +- # include +- #endif +- # ifndef _ABIN32 +- # define _ABIN32 _MIPS_SIM_NABI32 +- # endif +- # ifndef _ABI64 +- # define _ABI64 _MIPS_SIM_ABI64 +- # endif + diff --git a/mozilla-aarch64-bmo-962488.patch b/mozilla-aarch64-bmo-962488.patch new file mode 100644 index 0000000..cfd05d6 --- /dev/null +++ b/mozilla-aarch64-bmo-962488.patch @@ -0,0 +1,80 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1393440196 18000 +# Node ID 6a46f53ad944b44385398822d7bcf7621a785d91 +# Parent 0aa56e2a5f816a30da48701f73d03060ee9692b2 +Bug 962488 - Update double-conversion for proper AArch64 support. r=froydnj + +Fix imported from upstream repository: +https://code.google.com/p/double-conversion/source/detail?r=4e24bb31bcc76d6d218f3056b4c24a109d367561 + +diff --git a/mfbt/double-conversion/fix-aarch64-macro.patch b/mfbt/double-conversion/fix-aarch64-macro.patch +new file mode 100644 +--- /dev/null ++++ b/mfbt/double-conversion/fix-aarch64-macro.patch +@@ -0,0 +1,23 @@ ++Backport from upstream. ++ ++https://code.google.com/p/double-conversion/source/detail?r=4e24bb31bcc76d6d218f3056b4c24a109d367561 ++ ++--- ++ mfbt/double-conversion/utils.h | 2 +- ++ 1 file changed, 1 insertion(+), 1 deletion(-) ++ ++--- a/mfbt/double-conversion/utils.h +++++ b/mfbt/double-conversion/utils.h ++@@ -58,11 +58,11 @@ ++ defined(__mips__) || \ ++ defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \ ++ defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ ++ defined(__SH4__) || defined(__alpha__) || \ ++ defined(_MIPS_ARCH_MIPS32R2) || \ ++- defined(_AARCH64EL_) +++ defined(__AARCH64EL__) ++ #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 ++ #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) ++ #if defined(_WIN32) ++ // Windows uses a 64bit wide floating point stack. ++ #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 +diff --git a/mfbt/double-conversion/update.sh b/mfbt/double-conversion/update.sh +--- a/mfbt/double-conversion/update.sh ++++ b/mfbt/double-conversion/update.sh +@@ -15,9 +15,12 @@ cp $1/src/*.h ./ + + # Source + cp $1/src/*.cc ./ + + patch -p3 < add-mfbt-api-markers.patch + patch -p3 < use-StandardInteger.patch + patch -p3 < use-mozilla-assertions.patch + patch -p3 < use-static_assert.patch +-patch -p3 < ToPrecision-exponential.patch +\ No newline at end of file ++patch -p3 < ToPrecision-exponential.patch ++ ++# Merged upstream, part of 2.0.1 version ++patch -p3 < fix-aarch64-macro.patch +diff --git a/mfbt/double-conversion/utils.h b/mfbt/double-conversion/utils.h +--- a/mfbt/double-conversion/utils.h ++++ b/mfbt/double-conversion/utils.h +@@ -55,17 +55,17 @@ + #if defined(_M_X64) || defined(__x86_64__) || \ + defined(__ARMEL__) || defined(__avr32__) || \ + defined(__hppa__) || defined(__ia64__) || \ + defined(__mips__) || \ + defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \ + defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ + defined(__SH4__) || defined(__alpha__) || \ + defined(_MIPS_ARCH_MIPS32R2) || \ +- defined(_AARCH64EL_) ++ defined(__AARCH64EL__) + #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 + #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) + #if defined(_WIN32) + // Windows uses a 64bit wide floating point stack. + #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 + #else + #undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS + #endif // _WIN32 + diff --git a/mozilla-aarch64-bmo-963023.patch b/mozilla-aarch64-bmo-963023.patch new file mode 100644 index 0000000..c0104d8 --- /dev/null +++ b/mozilla-aarch64-bmo-963023.patch @@ -0,0 +1,115 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1392217668 18000 +# Node ID 4e9b713f435ade266a68a8d7ba08aad65c3fa6c5 +# Parent 282b6e88f9d4c2367a72836f6f9efeab2aadaa58 +Bug 963023 - AArch64 support for libevent. r=froydnj + +diff --git a/ipc/chromium/src/third_party/libevent-use-non-deprecated-syscalls.patch b/ipc/chromium/src/third_party/libevent-use-non-deprecated-syscalls.patch +new file mode 100644 +--- /dev/null ++++ b/ipc/chromium/src/third_party/libevent-use-non-deprecated-syscalls.patch +@@ -0,0 +1,43 @@ ++--- ++ ipc/chromium/src/third_party/libevent/epoll_sub.c | 13 +++++++++++++ ++ 1 file changed, 13 insertions(+) ++ ++--- mozilla-central.orig/ipc/chromium/src/third_party/libevent/epoll_sub.c +++++ mozilla-central/ipc/chromium/src/third_party/libevent/epoll_sub.c ++@@ -29,15 +29,24 @@ ++ #include ++ #include ++ #include ++ #include ++ #include +++#include ++ ++ int ++ epoll_create(int size) ++ { +++#if !defined(__NR_epoll_create) && defined(__NR_epoll_create1) +++ if (size <= 0) { +++ errno = EINVAL; +++ return -1; +++ } +++ return (syscall(__NR_epoll_create1, 0)); +++#else ++ return (syscall(__NR_epoll_create, size)); +++#endif ++ } ++ ++ int ++ epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) ++ { ++@@ -46,7 +55,11 @@ epoll_ctl(int epfd, int op, int fd, stru ++ } ++ ++ int ++ epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) ++ { +++#if !defined(__NR_epoll_wait) && defined(__NR_epoll_pwait) +++ return (syscall(__NR_epoll_pwait, epfd, events, maxevents, timeout, NULL, 0)); +++#else ++ return (syscall(__NR_epoll_wait, epfd, events, maxevents, timeout)); +++#endif ++ } +diff --git a/ipc/chromium/src/third_party/libevent/README.mozilla b/ipc/chromium/src/third_party/libevent/README.mozilla +--- a/ipc/chromium/src/third_party/libevent/README.mozilla ++++ b/ipc/chromium/src/third_party/libevent/README.mozilla +@@ -8,8 +8,10 @@ android/event2/event-config.h + + These files are taken from libevent-2.0.21-stable built on the development environment indicated by the first path component. You have to run "./configure" and "make" to get all of the pre-processing done. The file can then be found in "include/event2/". + + 2. This is ugly, prepare yourself. OS X has a weird problem with how the "TAILQ_END(head)" is used, causing a linking error. Just replace all use of the "TAILQ_END(head)" macro with "NULL". + + 3. Apply "add mac-arc4random-buf.patch", which removes some bad OS X compatibility code. This will allow libevent to compile on all supported versions of OS X. + + 4. Apply "openbsd-no-arc4random_addrandom.patch", which fixes the build on OpenBSD (which doesnt provide arc4random_addrandom anymore, see #931354) ++ ++5. Apply "libevent-use-non-deprecated-syscalls.patch", which fixes the build on AArch64 architecture (which does not provide deprecated syscalls) +diff --git a/ipc/chromium/src/third_party/libevent/epoll_sub.c b/ipc/chromium/src/third_party/libevent/epoll_sub.c +--- a/ipc/chromium/src/third_party/libevent/epoll_sub.c ++++ b/ipc/chromium/src/third_party/libevent/epoll_sub.c +@@ -26,27 +26,40 @@ + */ + #include + + #include + #include + #include + #include + #include ++#include + + int + epoll_create(int size) + { ++#if !defined(__NR_epoll_create) && defined(__NR_epoll_create1) ++ if (size <= 0) { ++ errno = EINVAL; ++ return -1; ++ } ++ return (syscall(__NR_epoll_create1, 0)); ++#else + return (syscall(__NR_epoll_create, size)); ++#endif + } + + int + epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) + { + + return (syscall(__NR_epoll_ctl, epfd, op, fd, event)); + } + + int + epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) + { ++#if !defined(__NR_epoll_wait) && defined(__NR_epoll_pwait) ++ return (syscall(__NR_epoll_pwait, epfd, events, maxevents, timeout, NULL, 0)); ++#else + return (syscall(__NR_epoll_wait, epfd, events, maxevents, timeout)); ++#endif + } + diff --git a/mozilla-aarch64-bmo-963024.patch b/mozilla-aarch64-bmo-963024.patch new file mode 100644 index 0000000..de0806a --- /dev/null +++ b/mozilla-aarch64-bmo-963024.patch @@ -0,0 +1,517 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1393440196 18000 +# Node ID d56b5c1a557348d4ac14a4d1ea7a5b5d240e3647 +# Parent 6a46f53ad944b44385398822d7bcf7621a785d91 +Bug 963024 - AArch64 support for XPCOM. r=froydnj + +diff --git a/xpcom/reflect/xptcall/src/md/unix/moz.build b/xpcom/reflect/xptcall/src/md/unix/moz.build +--- a/xpcom/reflect/xptcall/src/md/unix/moz.build ++++ b/xpcom/reflect/xptcall/src/md/unix/moz.build +@@ -144,16 +144,23 @@ if CONFIG['OS_ARCH'] == 'NetBSD': + if CONFIG['OS_TEST'] in ('amiga', 'atari', 'hp300', 'mac68k', 'mvme68k', + 'next68k', 'sun3', 'sun3x', 'x68k'): + SOURCES += [ + 'xptcinvoke_netbsd_m68k.cpp', + 'xptcstubs_netbsd_m68k.cpp' + ] + + if CONFIG['OS_ARCH'] == 'Linux': ++ if CONFIG['OS_TEST'] == 'aarch64': ++ SOURCES += [ ++ 'xptcinvoke_aarch64.cpp', ++ 'xptcinvoke_asm_aarch64.s', ++ 'xptcstubs_aarch64.cpp', ++ 'xptcstubs_asm_aarch64.s', ++ ] + if CONFIG['OS_TEST'] == 'm68k': + SOURCES += [ + 'xptcinvoke_linux_m68k.cpp', + 'xptcstubs_linux_m68k.cpp', + ] + if CONFIG['OS_TEST'].find('mips') != -1: + if CONFIG['OS_TEST'].find('mips64') != -1: + SOURCES += [ +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_aarch64.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_aarch64.cpp +new file mode 100644 +--- /dev/null ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_aarch64.cpp +@@ -0,0 +1,136 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++/* Platform specific code to invoke XPCOM methods on native objects */ ++ ++#include "xptcprivate.h" ++ ++#if !defined(__aarch64__) ++#error "This code is for Linux AArch64 only." ++#endif ++ ++ ++/* "Procedure Call Standard for the ARM 64-bit Architecture" document, sections ++ * "5.4 Parameter Passing" and "6.1.2 Procedure Calling" contain all the ++ * needed information. ++ * ++ * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf ++ */ ++ ++#ifndef __AARCH64EL__ ++#error "Only little endian compatibility was tested" ++#endif ++ ++/* ++ * Allocation of integer function arguments initially to registers r1-r7 ++ * and then to stack. Handling of 'that' argument which goes to register r0 ++ * is handled separately and does not belong here. ++ * ++ * 'ireg_args' - pointer to the current position in the buffer, ++ * corresponding to the register arguments ++ * 'stack_args' - pointer to the current position in the buffer, ++ * corresponding to the arguments on stack ++ * 'end' - pointer to the end of the registers argument ++ * buffer. ++ */ ++static inline void alloc_word(uint64_t* &ireg_args, ++ uint64_t* &stack_args, ++ uint64_t* end, ++ uint64_t data) ++{ ++ if (ireg_args < end) { ++ *ireg_args = data; ++ ireg_args++; ++ } else { ++ *stack_args = data; ++ stack_args++; ++ } ++} ++ ++static inline void alloc_double(double* &freg_args, ++ uint64_t* &stack_args, ++ double* end, ++ double data) ++{ ++ if (freg_args < end) { ++ *freg_args = data; ++ freg_args++; ++ } else { ++ memcpy(stack_args, &data, sizeof(data)); ++ stack_args++; ++ } ++} ++ ++static inline void alloc_float(double* &freg_args, ++ uint64_t* &stack_args, ++ double* end, ++ float data) ++{ ++ if (freg_args < end) { ++ memcpy(freg_args, &data, sizeof(data)); ++ freg_args++; ++ } else { ++ memcpy(stack_args, &data, sizeof(data)); ++ stack_args++; ++ } ++} ++ ++ ++extern "C" void ++invoke_copy_to_stack(uint64_t* stk, uint64_t *end, ++ uint32_t paramCount, nsXPTCVariant* s) ++{ ++ uint64_t *ireg_args = stk; ++ uint64_t *ireg_end = ireg_args + 8; ++ double *freg_args = (double *)ireg_end; ++ double *freg_end = freg_args + 8; ++ uint64_t *stack_args = (uint64_t *)freg_end; ++ ++ // leave room for 'that' argument in x0 ++ ++ireg_args; ++ ++ for (uint32_t i = 0; i < paramCount; i++, s++) { ++ if (s->IsPtrData()) { ++ alloc_word(ireg_args, stack_args, ireg_end, (uint64_t)s->ptr); ++ continue; ++ } ++ // According to the ABI, integral types that are smaller than 8 bytes ++ // are to be passed in 8-byte registers or 8-byte stack slots. ++ switch (s->type) { ++ case nsXPTType::T_FLOAT: ++ alloc_float(freg_args, stack_args, freg_end, s->val.f); ++ break; ++ case nsXPTType::T_DOUBLE: ++ alloc_double(freg_args, stack_args, freg_end, s->val.d); ++ break; ++ case nsXPTType::T_I8: alloc_word(ireg_args, stk, end, s->val.i8); break; ++ case nsXPTType::T_I16: alloc_word(ireg_args, stk, end, s->val.i16); break; ++ case nsXPTType::T_I32: alloc_word(ireg_args, stk, end, s->val.i32); break; ++ case nsXPTType::T_I64: alloc_word(ireg_args, stk, end, s->val.i64); break; ++ case nsXPTType::T_U8: alloc_word(ireg_args, stk, end, s->val.u8); break; ++ case nsXPTType::T_U16: alloc_word(ireg_args, stk, end, s->val.u16); break; ++ case nsXPTType::T_U32: alloc_word(ireg_args, stk, end, s->val.u32); break; ++ case nsXPTType::T_U64: alloc_word(ireg_args, stk, end, s->val.u64); break; ++ case nsXPTType::T_BOOL: alloc_word(ireg_args, stk, end, s->val.b); break; ++ case nsXPTType::T_CHAR: alloc_word(ireg_args, stk, end, s->val.c); break; ++ case nsXPTType::T_WCHAR: alloc_word(ireg_args, stk, end, s->val.wc); break; ++ default: ++ // all the others are plain pointer types ++ alloc_word(ireg_args, stack_args, ireg_end, ++ reinterpret_cast(s->val.p)); ++ break; ++ } ++ } ++} ++ ++extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, ++ uint32_t paramCount, nsXPTCVariant* params); ++ ++EXPORT_XPCOM_API(nsresult) ++NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, ++ uint32_t paramCount, nsXPTCVariant* params) ++{ ++ return _NS_InvokeByIndex(that, methodIndex, paramCount, params); ++} +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_aarch64.s b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_aarch64.s +new file mode 100644 +--- /dev/null ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_aarch64.s +@@ -0,0 +1,67 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++ .section ".text" ++ .globl _NS_InvokeByIndex ++ .type _NS_InvokeByIndex,@function ++ ++/* ++ * _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, ++ * uint32_t paramCount, nsXPTCVariant* params) ++ */ ++ ++_NS_InvokeByIndex: ++ # set up frame ++ stp x29, x30, [sp,#-32]! ++ mov x29, sp ++ stp x19, x20, [sp,#16] ++ ++ # save methodIndex across function calls ++ mov w20, w1 ++ ++ # end of stack area passed to invoke_copy_to_stack ++ mov x1, sp ++ ++ # assume 8 bytes of stack for each argument with 16-byte alignment ++ add w19, w2, #1 ++ and w19, w19, #0xfffffffe ++ sub sp, sp, w19, uxth #3 ++ ++ # temporary place to store args passed in r0-r7,v0-v7 ++ sub sp, sp, #128 ++ ++ # save 'that' on stack ++ str x0, [sp] ++ ++ # start of stack area passed to invoke_copy_to_stack ++ mov x0, sp ++ bl invoke_copy_to_stack ++ ++ # load arguments passed in r0-r7 ++ ldp x6, x7, [sp, #48] ++ ldp x4, x5, [sp, #32] ++ ldp x2, x3, [sp, #16] ++ ldp x0, x1, [sp],#64 ++ ++ # load arguments passed in v0-v7 ++ ldp d6, d7, [sp, #48] ++ ldp d4, d5, [sp, #32] ++ ldp d2, d3, [sp, #16] ++ ldp d0, d1, [sp],#64 ++ ++ # call the method ++ ldr x16, [x0] ++ add x16, x16, w20, uxth #3 ++ ldr x16, [x16] ++ blr x16 ++ ++ add sp, sp, w19, uxth #3 ++ ldp x19, x20, [sp,#16] ++ ldp x29, x30, [sp],#32 ++ ret ++ ++ .size _NS_InvokeByIndex, . - _NS_InvokeByIndex ++ ++ +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_aarch64.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_aarch64.cpp +new file mode 100644 +--- /dev/null ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_aarch64.cpp +@@ -0,0 +1,219 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#include "xptcprivate.h" ++#include "xptiprivate.h" ++ ++#ifndef __AARCH64EL__ ++#error "Only little endian compatibility was tested" ++#endif ++ ++/* ++ * This is for AArch64 ABI ++ * ++ * When we're called, the "gp" registers are stored in gprData and ++ * the "fp" registers are stored in fprData. Each array has 8 regs ++ * but first reg in gprData is a placeholder for 'self'. ++ */ ++extern "C" nsresult ++PrepareAndDispatch(nsXPTCStubBase* self, uint32_t methodIndex, uint64_t* args, ++ uint64_t *gprData, double *fprData) ++{ ++#define PARAM_BUFFER_COUNT 16 ++#define PARAM_GPR_COUNT 8 ++#define PARAM_FPR_COUNT 8 ++ ++ nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT]; ++ nsXPTCMiniVariant* dispatchParams = NULL; ++ const nsXPTMethodInfo* info; ++ nsresult result = NS_ERROR_FAILURE; ++ ++ NS_ASSERTION(self,"no self"); ++ ++ self->mEntry->GetMethodInfo(uint16_t(methodIndex), &info); ++ NS_ASSERTION(info,"no method info"); ++ ++ uint32_t paramCount = info->GetParamCount(); ++ ++ // setup variant array pointer ++ if (paramCount > PARAM_BUFFER_COUNT) { ++ dispatchParams = new nsXPTCMiniVariant[paramCount]; ++ } else { ++ dispatchParams = paramBuffer; ++ } ++ NS_ASSERTION(dispatchParams,"no place for params"); ++ ++ uint64_t* ap = args; ++ uint32_t next_gpr = 1; // skip first arg which is 'self' ++ uint32_t next_fpr = 0; ++ for (uint32_t i = 0; i < paramCount; i++) { ++ const nsXPTParamInfo& param = info->GetParam(i); ++ const nsXPTType& type = param.GetType(); ++ nsXPTCMiniVariant* dp = &dispatchParams[i]; ++ ++ if (param.IsOut() || !type.IsArithmetic()) { ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.p = (void*)gprData[next_gpr++]; ++ } else { ++ dp->val.p = (void*)*ap++; ++ } ++ continue; ++ } ++ ++ switch (type) { ++ case nsXPTType::T_I8: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.i8 = (int8_t)gprData[next_gpr++]; ++ } else { ++ dp->val.i8 = (int8_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_I16: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.i16 = (int16_t)gprData[next_gpr++]; ++ } else { ++ dp->val.i16 = (int16_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_I32: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.i32 = (int32_t)gprData[next_gpr++]; ++ } else { ++ dp->val.i32 = (int32_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_I64: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.i64 = (int64_t)gprData[next_gpr++]; ++ } else { ++ dp->val.i64 = (int64_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_U8: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.u8 = (uint8_t)gprData[next_gpr++]; ++ } else { ++ dp->val.u8 = (uint8_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_U16: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.u16 = (uint16_t)gprData[next_gpr++]; ++ } else { ++ dp->val.u16 = (uint16_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_U32: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.u32 = (uint32_t)gprData[next_gpr++]; ++ } else { ++ dp->val.u32 = (uint32_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_U64: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.u64 = (uint64_t)gprData[next_gpr++]; ++ } else { ++ dp->val.u64 = (uint64_t)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_FLOAT: ++ if (next_fpr < PARAM_FPR_COUNT) { ++ memcpy(&dp->val.f, &fprData[next_fpr++], sizeof(dp->val.f)); ++ } else { ++ memcpy(&dp->val.f, ap++, sizeof(dp->val.f)); ++ } ++ break; ++ ++ case nsXPTType::T_DOUBLE: ++ if (next_fpr < PARAM_FPR_COUNT) { ++ memcpy(&dp->val.d, &fprData[next_fpr++], sizeof(dp->val.d)); ++ } else { ++ memcpy(&dp->val.d, ap++, sizeof(dp->val.d)); ++ } ++ break; ++ ++ case nsXPTType::T_BOOL: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.b = (bool)gprData[next_gpr++]; ++ } else { ++ dp->val.b = (bool)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_CHAR: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.c = (char)gprData[next_gpr++]; ++ } else { ++ dp->val.c = (char)*ap++; ++ } ++ break; ++ ++ case nsXPTType::T_WCHAR: ++ if (next_gpr < PARAM_GPR_COUNT) { ++ dp->val.wc = (wchar_t)gprData[next_gpr++]; ++ } else { ++ dp->val.wc = (wchar_t)*ap++; ++ } ++ break; ++ ++ default: ++ NS_ASSERTION(0, "bad type"); ++ break; ++ } ++ } ++ ++ result = self->mOuter->CallMethod((uint16_t)methodIndex, info, dispatchParams); ++ ++ if (dispatchParams != paramBuffer) { ++ delete [] dispatchParams; ++ } ++ ++ return result; ++} ++ ++// Load w17 with the constant 'n' and branch to SharedStub(). ++# define STUB_ENTRY(n) \ ++ __asm__ ( \ ++ ".section \".text\" \n\t" \ ++ ".align 2\n\t" \ ++ ".if "#n" < 10 \n\t" \ ++ ".globl _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \ ++ ".hidden _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \ ++ ".type _ZN14nsXPTCStubBase5Stub"#n"Ev,@function \n\n" \ ++ "_ZN14nsXPTCStubBase5Stub"#n"Ev: \n\t" \ ++ ".elseif "#n" < 100 \n\t" \ ++ ".globl _ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \ ++ ".hidden _ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \ ++ ".type _ZN14nsXPTCStubBase6Stub"#n"Ev,@function \n\n" \ ++ "_ZN14nsXPTCStubBase6Stub"#n"Ev: \n\t" \ ++ ".elseif "#n" < 1000 \n\t" \ ++ ".globl _ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \ ++ ".hidden _ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \ ++ ".type _ZN14nsXPTCStubBase7Stub"#n"Ev,@function \n\n" \ ++ "_ZN14nsXPTCStubBase7Stub"#n"Ev: \n\t" \ ++ ".else \n\t" \ ++ ".err \"stub number "#n" >= 1000 not yet supported\"\n" \ ++ ".endif \n\t" \ ++ "mov w17,#"#n" \n\t" \ ++ "b SharedStub \n" \ ++); ++ ++#define SENTINEL_ENTRY(n) \ ++ nsresult nsXPTCStubBase::Sentinel##n() \ ++{ \ ++ NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \ ++ return NS_ERROR_NOT_IMPLEMENTED; \ ++} ++ ++#include "xptcstubsdef.inc" +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_aarch64.s b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_aarch64.s +new file mode 100644 +--- /dev/null ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_aarch64.s +@@ -0,0 +1,39 @@ ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ ++ .set NGPREGS,8 ++ .set NFPREGS,8 ++ ++ .section ".text" ++ .globl SharedStub ++ .hidden SharedStub ++ .type SharedStub,@function ++SharedStub: ++ stp x29, x30, [sp,#-16]! ++ mov x29, sp ++ ++ sub sp, sp, #8*(NGPREGS+NFPREGS) ++ stp x0, x1, [sp, #64+(0*8)] ++ stp x2, x3, [sp, #64+(2*8)] ++ stp x4, x5, [sp, #64+(4*8)] ++ stp x6, x7, [sp, #64+(6*8)] ++ stp d0, d1, [sp, #(0*8)] ++ stp d2, d3, [sp, #(2*8)] ++ stp d4, d5, [sp, #(4*8)] ++ stp d6, d7, [sp, #(6*8)] ++ ++ # methodIndex passed from stub ++ mov w1, w17 ++ ++ add x2, sp, #16+(8*(NGPREGS+NFPREGS)) ++ add x3, sp, #8*NFPREGS ++ add x4, sp, #0 ++ ++ bl PrepareAndDispatch ++ ++ add sp, sp, #8*(NGPREGS+NFPREGS) ++ ldp x29, x30, [sp],#16 ++ ret ++ ++ .size SharedStub, . - SharedStub + diff --git a/mozilla-aarch64-bmo-963027.patch b/mozilla-aarch64-bmo-963027.patch new file mode 100644 index 0000000..59ef330 --- /dev/null +++ b/mozilla-aarch64-bmo-963027.patch @@ -0,0 +1,29 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1392218661 18000 +# Node ID 38fca44b6b86e2f12535900e2084f0378217570f +# Parent 8858624d813a6200b059590c146cf774fc16ff38 +Bug 963027 - AArch64 support for WebRTC. r=derf + +Index: mozilla/media/webrtc/trunk/webrtc/typedefs.h +=================================================================== +--- mozilla.orig/media/webrtc/trunk/webrtc/typedefs.h ++++ mozilla/media/webrtc/trunk/webrtc/typedefs.h +@@ -113,6 +113,16 @@ + #define WEBRTC_ARCH_32_BITS 1 + #define WEBRTC_ARCH_BIG_ENDIAN + #define WEBRTC_BIG_ENDIAN ++#elif defined(__aarch64__) ++#define WEBRTC_ARCH_AARCH64 1 ++#define WEBRTC_ARCH_64_BITS 1 ++#if defined(__AARCH64EL__) ++#define WEBRTC_ARCH_LITTLE_ENDIAN ++#define WEBRTC_LITTLE_ENDIAN ++#elif defined(__AARCH64EB__) ++#define WEBRTC_ARCH_BIG_ENDIAN ++#define WEBRTC_BIG_ENDIAN ++#endif + #elif defined(__alpha__) + #define WEBRTC_ARCH_ALPHA 1 + #define WEBRTC_ARCH_64_BITS 1 diff --git a/mozilla-aarch64-bmo-963028.patch b/mozilla-aarch64-bmo-963028.patch new file mode 100644 index 0000000..343072f --- /dev/null +++ b/mozilla-aarch64-bmo-963028.patch @@ -0,0 +1,54 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1390512871 18000 +# Node ID feaf8bd56a82749f5d0d8869b7c0a1c01e300362 +# Parent 2a082f03cd1d64c8bfff9641284f2dc23617f806 +Bug 963028 - AArch64 support for jemalloc. r=froydnj + +diff --git a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in +--- a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in ++++ b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in +@@ -283,16 +283,19 @@ static const bool config_ivsalloc = + # define LG_QUANTUM 4 + # endif + # ifdef __SH4__ + # define LG_QUANTUM 4 + # endif + # ifdef __tile__ + # define LG_QUANTUM 4 + # endif ++# ifdef __aarch64__ ++# define LG_QUANTUM 4 ++# endif + # ifndef LG_QUANTUM + # error "No LG_QUANTUM definition for architecture; specify via CPPFLAGS" + # endif + #endif + + #define QUANTUM ((size_t)(1U << LG_QUANTUM)) + #define QUANTUM_MASK (QUANTUM - 1) + +diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c +--- a/memory/mozjemalloc/jemalloc.c ++++ b/memory/mozjemalloc/jemalloc.c +@@ -1097,17 +1097,17 @@ static unsigned ncpus; + /* + * VM page size. It must divide the runtime CPU page size or the code + * will abort. + * Platform specific page size conditions copied from js/public/HeapAPI.h + */ + #if (defined(SOLARIS) || defined(__FreeBSD__)) && \ + (defined(__sparc) || defined(__sparcv9) || defined(__ia64)) + #define pagesize_2pow ((size_t) 13) +-#elif defined(__powerpc64__) ++#elif defined(__powerpc64__) || defined(__aarch64__) + #define pagesize_2pow ((size_t) 16) + #else + #define pagesize_2pow ((size_t) 12) + #endif + #define pagesize ((size_t) 1 << pagesize_2pow) + #define pagesize_mask (pagesize - 1) + + /* Various quantum-related settings. */ + diff --git a/mozilla-aarch64-bmo-963029.patch b/mozilla-aarch64-bmo-963029.patch new file mode 100644 index 0000000..9cb3289 --- /dev/null +++ b/mozilla-aarch64-bmo-963029.patch @@ -0,0 +1,43 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1390512871 18000 +# Node ID 89e06a821ad5986035de99c8bc1f9d7a99541b2a +# Parent feaf8bd56a82749f5d0d8869b7c0a1c01e300362 +Bug 963029 - AArch64 support for MFBT. r=froydnj + +Index: mozilla/mfbt/Endian.h +=================================================================== +--- mozilla.orig/mfbt/Endian.h ++++ mozilla/mfbt/Endian.h +@@ -121,14 +121,14 @@ + #elif defined(__sparc) || defined(__sparc__) || \ + defined(_POWER) || defined(__hppa) || \ + defined(_MIPSEB) || defined(__ARMEB__) || \ +- defined(__s390__) || \ ++ defined(__s390__) || defined(__AARCH64EB__) || \ + (defined(__sh__) && defined(__LITTLE_ENDIAN__)) || \ + (defined(__ia64) && defined(__BIG_ENDIAN__)) + # define MOZ_BIG_ENDIAN 1 + #elif defined(__i386) || defined(__i386__) || \ + defined(__x86_64) || defined(__x86_64__) || \ + defined(_MIPSEL) || defined(__ARMEL__) || \ +- defined(__alpha__) || \ ++ defined(__alpha__) || defined(__AARCH64EL__) || \ + (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ + (defined(__ia64) && !defined(__BIG_ENDIAN__)) + # define MOZ_LITTLE_ENDIAN 1 +Index: mozilla/mfbt/tests/TestPoisonArea.cpp +=================================================================== +--- mozilla.orig/mfbt/tests/TestPoisonArea.cpp ++++ mozilla/mfbt/tests/TestPoisonArea.cpp +@@ -161,6 +161,9 @@ + #elif defined __s390__ + #define RETURN_INSTR 0x07fe0000 /* br %r14 */ + ++#elif defined __aarch64__ ++#define RETURN_INSTR 0xd65f03c0 /* ret */ ++ + #elif defined __ia64 + struct ia64_instr { uint32_t i[4]; }; + static const ia64_instr _return_instr = diff --git a/mozilla-aarch64-bmo-963030.patch b/mozilla-aarch64-bmo-963030.patch new file mode 100644 index 0000000..7df9681 --- /dev/null +++ b/mozilla-aarch64-bmo-963030.patch @@ -0,0 +1,32 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1391033256 18000 +# Node ID 8a76622ce10d83a9dd070b968367efd8e73dc7cc +# Parent d890e603d751c465f2a0e2d2221e033b32afe4a9 +Bug 963030 - AArch64 support for IPC. r=bsmedberg + +diff --git a/ipc/chromium/src/build/build_config.h b/ipc/chromium/src/build/build_config.h +--- a/ipc/chromium/src/build/build_config.h ++++ b/ipc/chromium/src/build/build_config.h +@@ -97,16 +97,19 @@ + #define ARCH_CPU_S390X 1 + #define ARCH_CPU_64_BITS 1 + #elif defined(__s390__) + #define ARCH_CPU_S390 1 + #define ARCH_CPU_32_BITS 1 + #elif defined(__alpha__) + #define ARCH_CPU_ALPHA 1 + #define ARCH_CPU_64_BITS 1 ++#elif defined(__aarch64__) ++#define ARCH_CPU_AARCH64 1 ++#define ARCH_CPU_64_BITS 1 + #else + #error Please add support for your architecture in build/build_config.h + #endif + + // Type detection for wchar_t. + #if defined(OS_WIN) + #define WCHAR_T_IS_UTF16 + #else + diff --git a/mozilla-aarch64-bmo-963031.patch b/mozilla-aarch64-bmo-963031.patch new file mode 100644 index 0000000..c80d45a --- /dev/null +++ b/mozilla-aarch64-bmo-963031.patch @@ -0,0 +1,30 @@ + +# HG changeset patch +# User Marcin Juszkiewicz +# Date 1390828707 18000 +# Node ID 01c406c513473eef5c98940ba8d3040c456044d8 +# Parent b781647898f4a82e6cdeeb907ebbc402545698db +Bug 963031 - AArch support for Graphics. r=doublec + +diff --git a/gfx/ycbcr/chromium_types.h b/gfx/ycbcr/chromium_types.h +--- a/gfx/ycbcr/chromium_types.h ++++ b/gfx/ycbcr/chromium_types.h +@@ -41,13 +41,17 @@ typedef uint32_t uint32; + #elif defined(__sparc) + #define ARCH_CPU_SPARC_FAMILY 1 + #define ARCH_CPU_SPARC 1 + #define ARCH_CPU_32_BITS 1 + #elif defined(__sparcv9) + #define ARCH_CPU_SPARC_FAMILY 1 + #define ARCH_CPU_SPARC 1 + #define ARCH_CPU_64_BITS 1 ++#elif defined(__aarch64__) ++#define ARCH_CPU_AARCH64_FAMILY 1 ++#define ARCH_CPU_AARCH64 1 ++#define ARCH_CPU_64_BITS 1 + #else + #warning Please add support for your architecture in chromium_types.h + #endif + + #endif // GFX_CHROMIUMTYPES_H +