prepare Aurora 30
authorWolfgang Rosenauer <wr@rosenauer.org>
Thu, 17 Apr 2014 23:33:07 +0200
changeset 718 6cb1ac7cd223
parent 716 cef565f1c325
child 719 8d80a56bb0a8
prepare Aurora 30 - rebasing and removing obsolete stuff - no build tested yet
MozillaFirefox/MozillaFirefox.changes
MozillaFirefox/MozillaFirefox.spec
MozillaFirefox/create-tar.sh
MozillaFirefox/mozilla-aarch64-bmo-962488.patch
MozillaFirefox/mozilla-aarch64-bmo-963023.patch
MozillaFirefox/mozilla-aarch64-bmo-963024.patch
MozillaFirefox/mozilla-aarch64-bmo-963027.patch
MozillaFirefox/mozilla-ppc64-xpcom.patch
MozillaFirefox/mozilla-ppc64le-javascript.patch
MozillaFirefox/mozilla-ppc64le-libffi.patch
MozillaFirefox/mozilla-ppc64le-mfbt.patch
MozillaFirefox/mozilla-ppc64le-webrtc.patch
MozillaFirefox/mozilla-ppc64le-xpcom.patch
firefox-branded-icons.patch
firefox-kde.patch
mozilla-aarch64-bmo-962488.patch
mozilla-aarch64-bmo-963023.patch
mozilla-aarch64-bmo-963024.patch
mozilla-aarch64-bmo-963027.patch
mozilla-kde.patch
mozilla-language.patch
mozilla-ppc64-xpcom.patch
mozilla-ppc64le-javascript.patch
mozilla-ppc64le-libffi.patch
mozilla-ppc64le-mfbt.patch
mozilla-ppc64le-webrtc.patch
mozilla-ppc64le-xpcom.patch
mozilla-preferences.patch
mozilla-shared-nss-db.patch
series
--- a/MozillaFirefox/MozillaFirefox.changes	Mon Apr 14 09:09:11 2014 +0200
+++ b/MozillaFirefox/MozillaFirefox.changes	Thu Apr 17 23:33:07 2014 +0200
@@ -1,7 +1,16 @@
 -------------------------------------------------------------------
-Sun Apr 13 15:34:58 UTC 2014 - wr@rosenauer.org
-
-- update to Firefox 29beta7
+Thu Apr 17 21:28:05 UTC 2014 - wr@rosenauer.org
+
+- update to Aurora 30 (20140417)
+  * rebased patches
+  * removed obsolete patches
+- requires NSPR 4.10.4
+- enabled GStreamer 1.0 usage
+
+-------------------------------------------------------------------
+Thu Apr 17 20:41:36 UTC 2014 - wr@rosenauer.org
+
+- update to Firefox 29beta8
   * rebased patches
   * removed obsolete patches
 - requires NSS 3.16
--- a/MozillaFirefox/MozillaFirefox.spec	Mon Apr 14 09:09:11 2014 +0200
+++ b/MozillaFirefox/MozillaFirefox.spec	Thu Apr 17 23:33:07 2014 +0200
@@ -17,14 +17,14 @@
 #
 
 
-%define major 28
-%define mainver %major.99
-%define update_channel beta
+%define major 29
+%define mainver %major.98
+%define update_channel aurora
 
 %if %suse_version > 1220
 %define gstreamer_ver 0.10
 %else
-%define gstreamer_ver 0.10
+%define gstreamer_ver 1.0
 %endif
 
 Name:           MozillaFirefox
@@ -51,7 +51,7 @@
 %else
 BuildRequires:  wireless-tools
 %endif
-BuildRequires:  mozilla-nspr-devel >= 4.10.3
+BuildRequires:  mozilla-nspr-devel >= 4.10.4
 BuildRequires:  mozilla-nss-devel >= 3.16
 BuildRequires:  nss-shared-helper-devel
 BuildRequires:  pkgconfig(libpulse)
@@ -59,13 +59,13 @@
 BuildRequires:  pkgconfig(gstreamer-%gstreamer_ver)
 BuildRequires:  pkgconfig(gstreamer-app-%gstreamer_ver)
 BuildRequires:  pkgconfig(gstreamer-plugins-base-%gstreamer_ver)
-Requires:       libgstreamer-0_10-0
-Recommends:     gstreamer-0_10-fluendo-mp3
-Recommends:     gstreamer-0_10-plugins-ffmpeg
+Requires:       libgstreamer-1_0
+Recommends:     gstreamer-fluendo-mp3
+#Recommends:     gstreamer-0_10-plugins-ffmpeg
 %endif
 Version:        %{mainver}
 Release:        0
-%define         releasedate 2014041300
+%define         releasedate 2014041700
 Provides:       firefox = %{mainver}
 Provides:       firefox = %{version}-%{release}
 Provides:       web_browser
@@ -108,19 +108,8 @@
 Patch12:        mozilla-arm-disable-edsp.patch
 Patch13:        mozilla-ppc.patch
 Patch14:        mozilla-libproxy-compat.patch
-Patch15:        mozilla-ppc64le-build.patch
-Patch16:        mozilla-ppc64le-javascript.patch
-Patch17:        mozilla-ppc64le-libffi.patch
-Patch18:        mozilla-ppc64le-mfbt.patch
-Patch19:        mozilla-ppc64le-webrtc.patch
-Patch20:        mozilla-ppc64le-xpcom.patch
-Patch21:        mozilla-ppc64-xpcom.patch
 # Gecko/Toolkit AArch64 Porting
 Patch30:        mozilla-aarch64-bmo-810631.patch
-Patch31:        mozilla-aarch64-bmo-962488.patch
-Patch32:        mozilla-aarch64-bmo-963027.patch
-Patch33:        mozilla-aarch64-bmo-963023.patch
-Patch34:        mozilla-aarch64-bmo-963024.patch
 
 # Firefox/browser
 Patch100:       firefox-browser-css.patch
@@ -262,18 +251,7 @@
 %patch12 -p1
 %patch13 -p1
 %patch14 -p1
-#%patch15 -p1
-%patch16 -p1
-%patch17 -p1
-%patch18 -p1
-%patch19 -p1
-%patch20 -p1
-%patch21 -p1
 %patch30 -p1
-%patch31 -p1
-%patch32 -p1
-%patch33 -p1
-%patch34 -p1
 
 # Firefox
 #%patch100 -p1
--- a/MozillaFirefox/create-tar.sh	Mon Apr 14 09:09:11 2014 +0200
+++ b/MozillaFirefox/create-tar.sh	Thu Apr 17 23:33:07 2014 +0200
@@ -1,9 +1,9 @@
 #!/bin/bash
 
-CHANNEL="beta"
+CHANNEL="aurora"
 BRANCH="releases/mozilla-$CHANNEL"
-RELEASE_TAG="FIREFOX_29_0b7_RELEASE"
-VERSION="28.99"
+RELEASE_TAG="default"
+VERSION="29.98"
 
 # mozilla
 if [ -d mozilla ]; then
--- a/MozillaFirefox/mozilla-aarch64-bmo-962488.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-aarch64-bmo-962488.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-aarch64-bmo-963023.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-aarch64-bmo-963023.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-aarch64-bmo-963024.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-aarch64-bmo-963024.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-aarch64-bmo-963027.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-aarch64-bmo-963027.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-ppc64-xpcom.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-ppc64-xpcom.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-ppc64le-javascript.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-ppc64le-javascript.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-ppc64le-libffi.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-ppc64le-libffi.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-ppc64le-mfbt.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-ppc64le-mfbt.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-ppc64le-webrtc.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-ppc64le-webrtc.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-ppc64le-xpcom.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-ppc64le-xpcom.patch
\ No newline at end of file
--- a/firefox-branded-icons.patch	Mon Apr 14 09:09:11 2014 +0200
+++ b/firefox-branded-icons.patch	Thu Apr 17 23:33:07 2014 +0200
@@ -1,10 +1,10 @@
 # HG changeset patch
-# Parent 5defe7bd2f041c227fe4a65f8a90e6cc42a9a339
+# Parent ab6659ccbfbbfed31bce1bcd696a820069b9d7c0
 
 diff --git a/browser/app/Makefile.in b/browser/app/Makefile.in
 --- a/browser/app/Makefile.in
 +++ b/browser/app/Makefile.in
-@@ -133,16 +133,21 @@ GARBAGE += $(addprefix $(FINAL_TARGET)/d
+@@ -76,16 +76,21 @@ GARBAGE += $(addprefix $(FINAL_TARGET)/d
  endif
  
  ifdef MOZ_WIDGET_GTK
@@ -29,7 +29,7 @@
 diff --git a/browser/branding/official/Makefile.in b/browser/branding/official/Makefile.in
 --- a/browser/branding/official/Makefile.in
 +++ b/browser/branding/official/Makefile.in
-@@ -42,18 +42,21 @@ BRANDING_FILES := \
+@@ -36,18 +36,21 @@ BRANDING_FILES := \
  	document.icns \
  	dsstore \
  	$(NULL)
@@ -47,14 +47,14 @@
  	$(NULL)
  endif
  
- ifeq ($(OS_ARCH),OS2)
- BRANDING_FILES := \
- 	firefox-os2.ico \
- 	document-os2.ico \
+ BRANDING_DEST := $(DIST)/branding
+ BRANDING_TARGET := export
+ INSTALL_TARGETS += BRANDING
+ 
 diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
 --- a/browser/installer/package-manifest.in
 +++ b/browser/installer/package-manifest.in
-@@ -571,18 +571,21 @@
+@@ -611,18 +611,21 @@
  @BINPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
  @BINPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png
  @BINPATH@/chrome/toolkit@JAREXT@
--- a/firefox-kde.patch	Mon Apr 14 09:09:11 2014 +0200
+++ b/firefox-kde.patch	Thu Apr 17 23:33:07 2014 +0200
@@ -411,14 +411,9 @@
 +        <image class="sync-panel-icon"/>
 +        <vbox class="sync-panel-inner">
 +          <description id="sync-start-panel-title"
-+                       value="&syncStartPanel.heading;"/>
-+          <description id="sync-start-panel-subtitle">
-+#ifdef XP_UNIX
-+            &syncStartPanel.subTitleUnix;
-+#else
-+            &syncStartPanel.subTitle;
-+#endif
-+          </description>
++                       value="&syncStartPanel2.heading;"/>
++          <description id="sync-start-panel-subtitle"
++                       value="&syncStartPanel2.subTitle;"/>
 +        </vbox>
 +      </hbox>
 +    </panel>
@@ -508,7 +503,12 @@
 +      </hbox>
 +    </hbox>
 +#ifdef XP_MACOSX
-+    <hbox id="titlebar-fullscreen-button"/>
++    <!-- OS X does not natively support RTL for its titlebar items, so we prevent this secondary
++         buttonbox from reversing order in RTL by forcing an LTR direction. -->
++    <hbox id="titlebar-secondary-buttonbox" dir="ltr">
++      <hbox class="private-browsing-indicator"/>
++      <hbox id="titlebar-fullscreen-button"/>
++    </hbox>
 +#endif
 +  </hbox>
 +</vbox>
@@ -612,8 +612,8 @@
 +                     cui-areatype="toolbar"
 +                     tooltiptext="&closeTab.label;"/>
 +
-+#ifdef XP_WIN
-+      <hbox class="private-browsing-indicator" skipintoolbarset="true" ordinal="1000"/>
++#if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT)
++      <hbox class="private-browsing-indicator" skipintoolbarset="true"/>
 +#endif
 +#ifdef CAN_DRAW_IN_TITLEBAR
 +      <hbox class="titlebar-placeholder" type="caption-buttons"
@@ -709,6 +709,8 @@
 +                <image id="mixed-content-blocked-notification-icon" class="notification-anchor-icon" role="button"/>
 +                <image id="webRTC-shareDevices-notification-icon" class="notification-anchor-icon" role="button"/>
 +                <image id="webRTC-sharingDevices-notification-icon" class="notification-anchor-icon" role="button"/>
++                <image id="webRTC-shareMicrophone-notification-icon" class="notification-anchor-icon" role="button"/>
++                <image id="webRTC-sharingMicrophone-notification-icon" class="notification-anchor-icon" role="button"/>
 +                <image id="pointerLock-notification-icon" class="notification-anchor-icon" role="button"/>
 +                <image id="servicesInstall-notification-icon" class="notification-anchor-icon" role="button"/>
 +              </box>
@@ -1106,7 +1108,6 @@
 +                        command="Social:ToggleNotifications"
 +                        label="&social.toggleNotifications.label;"
 +                        accesskey="&social.toggleNotifications.accesskey;"/>
-+              <menuitem class="social-toggle-menuitem" command="Social:Toggle"/>
 +              <menuseparator/>
 +              <menuseparator class="social-provider-menu" hidden="true"/>
 +              <menuitem class="social-addons-menuitem" command="Social:Addons"
@@ -1191,15 +1192,14 @@
 +  <svg:svg height="0">
 +#include tab-shape.inc.svg
 +
-+#ifndef XP_UNIX
-+    <svg:clipPath id="windows-keyhole-forward-clip-path" clipPathUnits="userSpaceOnUse">
-+      <svg:path d="M 0,0 a 16 16 0 0 1 0,24 l 10000,0 l 0,-24 l -10000,0 z"/>
++#ifndef XP_MACOSX
++    <svg:clipPath id="keyhole-forward-clip-path" clipPathUnits="objectBoundingBox">
++      <svg:path d="m 0,0 c .3,.25 .3,.75, 0,1 l 1,0 0,-1 z"/>
 +    </svg:clipPath>
-+    <svg:clipPath id="windows-urlbar-back-button-clip-path" clipPathUnits="userSpaceOnUse">
-+      <svg:path d="M -1,1 a 16 16 0 0 1 0,24 l 10000,0 l 0,-24 l -10000,0 z"/>
++    <svg:clipPath id="urlbar-back-button-clip-path" clipPathUnits="userSpaceOnUse">
++      <svg:path d="m 0,-5 l 0,7.8 c 2.5,3.2 4,6.2 4,10.2 c 0,4 -1.5,7 -4,10 l 0,22l10000,0 l 0,-50 l -10000,0 z"/>
 +    </svg:clipPath>
-+#endif
-+#ifdef XP_MACOSX
++#else
 +    <svg:clipPath id="osx-keyhole-forward-clip-path" clipPathUnits="userSpaceOnUse">
 +      <svg:path d="M 0,0 a 16 16 0 0 1 0,24 l 10000,0 l 0,-24 l -10000,0 z"/>
 +    </svg:clipPath>
@@ -1801,7 +1801,7 @@
 diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
 --- a/browser/installer/package-manifest.in
 +++ b/browser/installer/package-manifest.in
-@@ -654,19 +654,21 @@
+@@ -641,19 +641,21 @@
  @BINPATH@/defaults/autoconfig/prefcalls.js
  @BINPATH@/browser/defaults/profile/prefs.js
  
--- a/mozilla-aarch64-bmo-962488.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-
-# HG changeset patch
-# User Marcin Juszkiewicz <mjuszkiewicz@redhat.com>
-# 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
-
--- a/mozilla-aarch64-bmo-963023.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-
-# HG changeset patch
-# User Marcin Juszkiewicz <mjuszkiewicz@redhat.com>
-# 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 <sys/param.h>
-+ #include <sys/types.h>
-+ #include <sys/syscall.h>
-+ #include <sys/epoll.h>
-+ #include <unistd.h>
-++#include <errno.h>
-+
-+ 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 <stdint.h>
- 
- #include <sys/param.h>
- #include <sys/types.h>
- #include <sys/syscall.h>
- #include <sys/epoll.h>
- #include <unistd.h>
-+#include <errno.h>
- 
- 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
- }
-
--- a/mozilla-aarch64-bmo-963024.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,517 +0,0 @@
-
-# HG changeset patch
-# User Marcin Juszkiewicz <mjuszkiewicz@redhat.com>
-# 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<uint64_t>(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
-
--- a/mozilla-aarch64-bmo-963027.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-
-# HG changeset patch
-# User Marcin Juszkiewicz <mjuszkiewicz@redhat.com>
-# 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
--- a/mozilla-kde.patch	Mon Apr 14 09:09:11 2014 +0200
+++ b/mozilla-kde.patch	Thu Apr 17 23:33:07 2014 +0200
@@ -44,7 +44,7 @@
  #include "prefread.h"
  #include "prefapi_private_data.h"
  
-@@ -1113,16 +1114,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char 
+@@ -1119,16 +1120,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char 
  
  static nsresult pref_LoadPrefsInDirList(const char *listId)
  {
@@ -79,7 +79,7 @@
      return NS_OK;
  
    bool hasMore;
-@@ -1138,17 +1157,17 @@ static nsresult pref_LoadPrefsInDirList(
+@@ -1144,17 +1163,17 @@ static nsresult pref_LoadPrefsInDirList(
  
      nsAutoCString leaf;
      path->GetNativeLeafName(leaf);
@@ -98,7 +98,7 @@
  {
    nsZipItemPtr<char> manifest(jarReader, name, true);
    NS_ENSURE_TRUE(manifest.Buffer(), NS_ERROR_NOT_AVAILABLE);
-@@ -1242,28 +1261,40 @@ static nsresult pref_InitInitialObjects(
+@@ -1248,26 +1267,38 @@ static nsresult pref_InitInitialObjects(
    /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */
    static const char* specialFiles[] = {
  #if defined(XP_MACOSX)
@@ -113,8 +113,6 @@
  #elif defined(_AIX)
      , "aix.js"
  #endif
- #elif defined(XP_OS2)
-     "os2pref.js"
  #elif defined(XP_BEOS)
      "beos.js"
  #endif
@@ -184,21 +182,21 @@
 diff --git a/toolkit/components/downloads/Makefile.in b/toolkit/components/downloads/Makefile.in
 --- a/toolkit/components/downloads/Makefile.in
 +++ b/toolkit/components/downloads/Makefile.in
-@@ -4,9 +4,10 @@
+@@ -1,9 +1,9 @@
+ #
+ # 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 $(topsrcdir)/config/rules.mk
  
- CXXFLAGS += $(TK_CFLAGS) -DGOOGLE_PROTOBUF_NO_RTTI
- 
- LOCAL_INCLUDES += \
-   -I$(srcdir)/../protobuf \
-+  -I$(topsrcdir)/toolkit/xre \
-   $(NULL)
+ CXXFLAGS += $(TK_CFLAGS)
+-
++LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre
 diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/components/downloads/nsDownloadManager.cpp
 --- a/toolkit/components/downloads/nsDownloadManager.cpp
 +++ b/toolkit/components/downloads/nsDownloadManager.cpp
-@@ -41,16 +41,20 @@
+@@ -42,16 +42,20 @@
  #ifdef XP_WIN
  #include <shlobj.h>
  #include "nsWindowsHelpers.h"
@@ -219,7 +217,7 @@
  #include "AndroidBridge.h"
  using namespace mozilla::widget::android;
  #endif
-@@ -2687,16 +2691,25 @@ nsDownload::SetState(DownloadState aStat
+@@ -2695,16 +2699,25 @@ nsDownload::SetState(DownloadState aStat
        nsCOMPtr<nsIPrefBranch> pref(do_GetService(NS_PREFSERVICE_CONTRACTID));
  
        // Master pref to control this function.
@@ -245,7 +243,7 @@
          int64_t goat = PR_Now() - mStartTime;
          showTaskbarAlert = goat > alertIntervalUSec;
  
-@@ -2724,19 +2737,20 @@ nsDownload::SetState(DownloadState aStat
+@@ -2732,19 +2745,20 @@ nsDownload::SetState(DownloadState aStat
                // because if it is, they'll click open the download manager and
                // the items they downloaded will have been removed.
                alerts->ShowAlertNotification(
@@ -270,7 +268,7 @@
 diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn
 --- a/toolkit/content/jar.mn
 +++ b/toolkit/content/jar.mn
-@@ -55,29 +55,33 @@ toolkit.jar:
+@@ -56,29 +56,33 @@ toolkit.jar:
     content/global/viewZoomOverlay.js          (viewZoomOverlay.js)
  *+ content/global/bindings/autocomplete.xml    (widgets/autocomplete.xml)
     content/global/bindings/browser.xml         (widgets/browser.xml)
@@ -308,7 +306,7 @@
 new file mode 100644
 --- /dev/null
 +++ b/toolkit/content/widgets/dialog-kde.xml
-@@ -0,0 +1,451 @@
+@@ -0,0 +1,449 @@
 +<?xml version="1.0"?>
 +<!-- 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
@@ -728,8 +726,6 @@
 +    </implementation>
 +    
 +    <handlers>
-+      <handler event="keypress" keycode="VK_ENTER"
-+               group="system" action="this._hitEnter(event);"/>
 +      <handler event="keypress" keycode="VK_RETURN"
 +               group="system" action="this._hitEnter(event);"/>
 +      <handler event="keypress" keycode="VK_ESCAPE" group="system">
@@ -2197,14 +2193,14 @@
 diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build
 --- a/toolkit/xre/moz.build
 +++ b/toolkit/xre/moz.build
-@@ -45,17 +45,19 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'qt
+@@ -43,17 +43,19 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'qt
+     GENERATED_SOURCES += [
+         'moc_nsNativeAppSupportQt.cpp',
+     ]
+     SOURCES += [
          'nsNativeAppSupportQt.cpp',
          'nsQAppInstance.cpp',
      ]
- elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'os2':
-     SOURCES += [
-         'nsNativeAppSupportOS2.cpp',
-     ]
  elif CONFIG['MOZ_ENABLE_GTK']:
 +    EXPORTS += ['nsKDEUtils.h']
      UNIFIED_SOURCES += [
@@ -2617,7 +2613,7 @@
 diff --git a/uriloader/exthandler/Makefile.in b/uriloader/exthandler/Makefile.in
 --- a/uriloader/exthandler/Makefile.in
 +++ b/uriloader/exthandler/Makefile.in
-@@ -19,9 +19,10 @@ endif
+@@ -6,9 +6,10 @@
  ifdef MOZ_ENABLE_DBUS
  OS_INCLUDES   += $(TK_CFLAGS) $(MOZ_DBUS_CFLAGS)
  endif
@@ -2631,7 +2627,7 @@
 diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
 --- a/uriloader/exthandler/moz.build
 +++ b/uriloader/exthandler/moz.build
-@@ -81,17 +81,19 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'coco
+@@ -80,17 +80,19 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'coco
  else:
      # These files can't be built in unified mode because they force NSPR logging.
      SOURCES += [
@@ -3440,10 +3436,10 @@
 diff --git a/xpcom/components/Makefile.in b/xpcom/components/Makefile.in
 --- a/xpcom/components/Makefile.in
 +++ b/xpcom/components/Makefile.in
-@@ -14,9 +14,10 @@ LOCAL_INCLUDES	= \
- 	-I$(topsrcdir)/chrome/src \
- 	-I$(topsrcdir)/modules/libjar \
- 	$(NULL)
+@@ -2,9 +2,10 @@
+ # 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 $(topsrcdir)/config/rules.mk
  
@@ -3583,19 +3579,6 @@
  
      if (directive->regfunc) {
        if (GeckoProcessType_Default != XRE_GetProcessType())
-diff --git a/xpcom/io/Makefile.in b/xpcom/io/Makefile.in
---- a/xpcom/io/Makefile.in
-+++ b/xpcom/io/Makefile.in
-@@ -1,8 +1,8 @@
- # 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/.
- 
- MOZILLA_INTERNAL_API = 1
- include $(topsrcdir)/config/rules.mk
- 
--LOCAL_INCLUDES	+= -I..
-+LOCAL_INCLUDES	+= -I.. -I$(topsrcdir)/toolkit/xre
 diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
 --- a/xpcom/io/nsLocalFileUnix.cpp
 +++ b/xpcom/io/nsLocalFileUnix.cpp
@@ -3617,7 +3600,7 @@
  #include "prmem.h"
  #include "plbase64.h"
  
-@@ -1811,46 +1812,52 @@ nsLocalFile::SetPersistentDescriptor(con
+@@ -1813,46 +1814,52 @@ nsLocalFile::SetPersistentDescriptor(con
      return InitWithNativePath(aPersistentDescriptor);
  #endif
  }
@@ -3684,7 +3667,7 @@
        return rv;
      }
      return NS_ERROR_FAILURE;
-@@ -1858,16 +1865,23 @@ nsLocalFile::Reveal()
+@@ -1860,16 +1867,23 @@ nsLocalFile::Reveal()
      return NS_ERROR_FAILURE;
  #endif
  }
--- a/mozilla-language.patch	Mon Apr 14 09:09:11 2014 +0200
+++ b/mozilla-language.patch	Thu Apr 17 23:33:07 2014 +0200
@@ -1,12 +1,12 @@
 # HG changeset patch
 # User Wolfgang Rosenauer <wr@rosenauer.org>
-# Parent df748bfc0eaca6dedf086cfd7167392416bfae27
+# Parent 13eb644c1216aed92b29dbc63fc26ce66f98c66c
 Bug 583793 - Firefox interface language set to LANG, ignores LANGUAGE
 
 diff --git a/intl/locale/src/nsLocaleService.cpp b/intl/locale/src/nsLocaleService.cpp
 --- a/intl/locale/src/nsLocaleService.cpp
 +++ b/intl/locale/src/nsLocaleService.cpp
-@@ -127,16 +127,17 @@ nsLocaleService::nsLocaleService(void)
+@@ -122,16 +122,17 @@ nsLocaleService::nsLocaleService(void)
      nsRefPtr<nsLocale> resultLocale(new nsLocale());
      NS_ENSURE_TRUE_VOID(resultLocale);
  
@@ -24,7 +24,7 @@
  
      for( i = 0; i < LocaleListLength; i++ ) {
          nsresult result;
-@@ -155,16 +156,21 @@ nsLocaleService::nsLocaleService(void)
+@@ -150,16 +151,21 @@ nsLocaleService::nsLocaleService(void)
              } else {
                  CopyASCIItoUTF16(lang, platformLocale);
                  result = nsPosixLocale::GetXPLocale(lang, xpLocale);
@@ -45,4 +45,4 @@
      mApplicationLocale = do_QueryInterface(resultLocale);
         
  #endif // XP_UNIX
- #ifdef XP_OS2
+ 
--- a/mozilla-ppc64-xpcom.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.S
-===================================================================
---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.S
-+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.S
-@@ -41,6 +41,11 @@ SharedStub:
-         .section ".text"
-         .align 2
-         .globl SharedStub
-+        # Make the symbol hidden so that the branch from the stub does
-+        # not go via a PLT.  This is not only better for performance,
-+        # but may be necessary to avoid linker errors since there is
-+        # no place to restore the TOC register in a sibling call.
-+        .hidden SharedStub
-         .section ".opd","aw"
-         .align 3
- 
--- a/mozilla-ppc64le-javascript.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-# HG changeset patch
-# Parent e6f9fc7c1611990ed9fdafd3ff19c79fd356a1d6
-# User Ulrich Weigand <uweigand@de.ibm.com>
-Bug 976648 - powerpc64le-linux support - JavaScript build/config
-
-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
-@@ -160,26 +160,32 @@
- /* WTF_CPU_PPC - PowerPC 32-bit */
- #if   defined(__ppc__)     \
-     || defined(__PPC__)     \
-     || defined(__powerpc__) \
-     || defined(__powerpc)   \
-     || defined(__POWERPC__) \
-     || defined(_M_PPC)      \
-     || defined(__PPC)
-+#if !defined(__ppc64__) && !defined(__PPC64__)
- #define WTF_CPU_PPC 1
-+#endif
-+#if !defined(__LITTLE_ENDIAN__)
- #define WTF_CPU_BIG_ENDIAN 1
- #endif
-+#endif
- 
- /* WTF_CPU_PPC64 - PowerPC 64-bit */
- #if   defined(__ppc64__) \
-     || defined(__PPC64__)
- #define WTF_CPU_PPC64 1
-+#if !defined(__LITTLE_ENDIAN__)
- #define WTF_CPU_BIG_ENDIAN 1
- #endif
-+#endif
- 
- /* WTF_CPU_SH4 - SuperH SH-4 */
- #if defined(__SH4__)
- #define WTF_CPU_SH4 1
- #endif
- 
- /* WTF_CPU_SPARC32 - SPARC 32-bit */
- #if defined(__sparc) && !defined(__arch64__) || defined(__sparcv8)
-diff --git a/js/src/configure.in b/js/src/configure.in
---- a/js/src/configure.in
-+++ b/js/src/configure.in
-@@ -923,17 +923,17 @@ esac
- 
- # Only set CPU_ARCH if we recognize the value of OS_TEST
- 
- case "$OS_TEST" in
- *86 | i86pc)
-     CPU_ARCH=x86
-     ;;
- 
--powerpc64 | ppc64)
-+powerpc64 | ppc64 | powerpc64le | ppc64le)
-     CPU_ARCH=ppc64
-     ;;
- 
- powerpc | ppc | rs6000)
-     CPU_ARCH=ppc
-     ;;
- 
- Alpha | alpha | ALPHA)
-diff --git a/js/src/jscpucfg.h b/js/src/jscpucfg.h
---- a/js/src/jscpucfg.h
-+++ b/js/src/jscpucfg.h
-@@ -22,17 +22,17 @@
- 
- # ifdef __WATCOMC__
- #  define HAVE_VA_LIST_AS_ARRAY 1
- # endif
- 
- # define IS_LITTLE_ENDIAN 1
- # undef  IS_BIG_ENDIAN
- 
--#elif defined(__APPLE__)
-+#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__)
- # if __LITTLE_ENDIAN__
- #  define IS_LITTLE_ENDIAN 1
- #  undef  IS_BIG_ENDIAN
- # elif __BIG_ENDIAN__
- #  undef  IS_LITTLE_ENDIAN
- #  define IS_BIG_ENDIAN 1
- # endif
- 
-@@ -84,18 +84,17 @@
- #  if defined(_STACK_GROWS_UPWARD)
- #   define JS_STACK_GROWTH_DIRECTION (1)
- #  elif defined(_STACK_GROWS_DOWNWARD)
- #   define JS_STACK_GROWTH_DIRECTION (-1)
- #  endif
- # endif
- 
- #elif defined(__sparc) || defined(__sparc__) || \
--      defined(_POWER) || defined(__powerpc__) || \
--      defined(__ppc__) || defined(__hppa) || \
-+      defined(_POWER) || defined(__hppa) || \
-       defined(_MIPSEB) || defined(_BIG_ENDIAN)
- /* IA64 running HP-UX will have _BIG_ENDIAN defined.
-  * IA64 running Linux will have endian.h and be handled above.
-  */
- # undef IS_LITTLE_ENDIAN
- # define IS_BIG_ENDIAN 1
- 
- #else /* !defined(__sparc) && !defined(__sparc__) && ... */
--- a/mozilla-ppc64le-libffi.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3206 +0,0 @@
-# HG changeset patch
-# Parent 16cf73a02802e3b4a77ccd77794346441638e2a7
-# User Ulrich Weigand <uweigand@de.ibm.com>
-Bug 976648 - powerpc64le-linux support - libffi backport
-
-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
-@@ -1277,31 +1277,34 @@ ia64-*-hpux*)
- 	  LD="${LD-ld} -64"
- 	  ;;
-       esac
-     fi
-   fi
-   rm -rf conftest*
-   ;;
- 
--x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-+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"
- 	    ;;
--	  ppc64-*linux*|powerpc64-*linux*)
-+	  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"
- 	    ;;
-@@ -1310,17 +1313,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
-       *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"
- 	    ;;
--	  ppc*-*linux*|powerpc*-*linux*)
-+	  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"
- 	    ;;
-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
-@@ -6293,17 +6293,17 @@ ia64-*-hpux*)
- 	  LD="${LD-ld} -64"
- 	  ;;
-       esac
-     fi
-   fi
-   rm -rf conftest*
-   ;;
- 
--x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-+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 { { 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
-@@ -6311,17 +6311,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
-       *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"
- 	    ;;
--	  ppc64-*linux*|powerpc64-*linux*)
-+	  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"
- 	    ;;
-@@ -6330,17 +6333,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
-       *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"
- 	    ;;
--	  ppc*-*linux*|powerpc*-*linux*)
-+	  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"
- 	    ;;
-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
-@@ -1262,31 +1262,34 @@ ia64-*-hpux*)
- 	  LD="${LD-ld} -64"
- 	  ;;
-       esac
-     fi
-   fi
-   rm -rf conftest*
-   ;;
- 
--x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-+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"
- 	    ;;
--	  ppc64-*linux*|powerpc64-*linux*)
-+	  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"
- 	    ;;
-@@ -1295,17 +1298,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
-       *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"
- 	    ;;
--	  ppc*-*linux*|powerpc*-*linux*)
-+	  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"
- 	    ;;
-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,12 +1,14 @@
- /* -----------------------------------------------------------------------
--   ffi.c - Copyright (c) 1998 Geoffrey Keating
--   Copyright (C) 2007, 2008 Free Software Foundation, Inc
--   Copyright (C) 2008 Red Hat, Inc
-+   ffi.c - 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
-@@ -34,42 +36,39 @@
- 
- 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_SYSV_SMST_R4     = 1 << (31-26), /* use r4 for FFI_SYSV 8 byte
--					   structs.  */
--  FLAG_SYSV_SMST_R3     = 1 << (31-25), /* use r3 for FFI_SYSV 4 byte
--					   structs.  */
--  /* Bits (31-24) through (31-19) store shift value for SMST */
- 
-   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.  */
--unsigned int NUM_GPR_ARG_REGISTERS = 8;
-+#define ASM_NEEDS_REGISTERS 4
-+#define NUM_GPR_ARG_REGISTERS 8
- #ifndef __NO_FPRS__
--unsigned int NUM_FPR_ARG_REGISTERS = 8;
--#else
--unsigned int NUM_FPR_ARG_REGISTERS = 0;
-+# define NUM_FPR_ARG_REGISTERS 8
- #endif
- 
--enum { ASM_NEEDS_REGISTERS = 4 };
--
- /* 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
-@@ -108,100 +107,119 @@ ffi_prep_args_SYSV (extended_cif *ecif, 
-   /* '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, ii MAYBE_UNUSED;
-+  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;
- 
--  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
--    NUM_FPR_ARG_REGISTERS = 0;
--
-   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) (char *) stack & 0xF) == 0);
--  FFI_ASSERT (((unsigned) copy_space.c & 0xF) == 0);
--  FFI_ASSERT (((unsigned) stacktop.c & 0xF) == 0);
-+  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++)
-     {
--      switch ((*ptr)->type)
--	{
-+      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.  */
--	  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
--	    goto soft_float_prep;
- 	  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.  */
--	  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
--	    goto soft_double_prep;
- 	  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++;
-@@ -213,53 +231,16 @@ ffi_prep_args_SYSV (extended_cif *ecif, 
- 	  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:
--	  if ((ecif->cif->abi != FFI_LINUX)
--		&& (ecif->cif->abi != FFI_LINUX_SOFT_FLOAT))
--	    goto do_struct;
--	  /* 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.  */
--	  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
--	    {
--	      unsigned int int_tmp = (*p_argv.ui)[0];
--	      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;
--		  next_arg.u++;
--		  for (ii = 1; ii < 4; ii++)
--		    {
--		      int_tmp = (*p_argv.ui)[ii];
--		      *next_arg.u = int_tmp;
--		      next_arg.u++;
--		    }
--		}
--	      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;
--	    }
--	  else
--	    {
- 	      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++;
-@@ -275,23 +256,50 @@ ffi_prep_args_SYSV (extended_cif *ecif, 
- 		{
- 		  *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:
--	soft_double_prep:
- 	  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++;
-@@ -314,19 +322,16 @@ ffi_prep_args_SYSV (extended_cif *ecif, 
- 		  gpr_base.u++;
- 		}
- 	      *gpr_base.ll++ = **p_argv.ll;
- 	    }
- 	  intarg_count += 2;
- 	  break;
- 
- 	case FFI_TYPE_STRUCT:
--#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
--	do_struct:
--#endif
- 	  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);
-@@ -344,45 +349,91 @@ ffi_prep_args_SYSV (extended_cif *ecif, 
- 	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:
--	soft_float_prep:
- 
- 	  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;
-+    }
-+}
-+#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	|
-@@ -418,141 +469,216 @@ ffi_prep_args64 (extended_cif *ecif, uns
-   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;
--  int fparg_count;
-+  unsigned int fparg_count;
- 
--  int i, words;
-+  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;
-+#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;
--  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
--       i > 0;
--       i--, ptr++, p_argv.v++)
-+  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;
--	  *next_arg.f = (float) double_tmp;
-+	  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;
--	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
--	    *fpr_base.d++ = double_tmp;
- 	  fparg_count++;
- 	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
- 	  break;
- 
- 	case FFI_TYPE_DOUBLE:
- 	  double_tmp = **p_argv.d;
--	  *next_arg.d = double_tmp;
-+	  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;
--	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
--	    *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];
--	  *next_arg.d = double_tmp;
-+	  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;
--	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
--	    *fpr_base.d++ = double_tmp;
- 	  fparg_count++;
- 	  double_tmp = (*p_argv.d)[1];
--	  *next_arg.d = double_tmp;
-+	  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;
--	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
--	    *fpr_base.d++ = double_tmp;
- 	  fparg_count++;
- 	  FFI_ASSERT (__LDBL_MANT_DIG__ == 106);
- 	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
- 	  break;
- #endif
- 
- 	case FFI_TYPE_STRUCT:
--	  words = ((*ptr)->size + 7) / 8;
--	  if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul)
-+#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)
- 	    {
--	      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;
-+	      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
- 	    {
--	      char *where = next_arg.c;
-+	      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;
- 
--	      /* Structures with size less than eight bytes are passed
--		 left-padded.  */
--	      if ((*ptr)->size < 8)
--		where += 8 - (*ptr)->size;
--
--	      memcpy (where, *p_argv.c, (*ptr)->size);
--	      next_arg.ul += words;
--	      if (next_arg.ul == gpr_end.ul)
--		next_arg.ul = rest.ul;
-+#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;
-@@ -586,53 +712,55 @@ ffi_prep_args64 (extended_cif *ecif, uns
-   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 */
--ffi_status
--ffi_prep_cif_machdep (ffi_cif *cif)
-+static ffi_status
-+ffi_prep_cif_machdep_core (ffi_cif *cif)
- {
-   /* All this is for the SYSV and LINUX64 ABI.  */
--  int i;
-   ffi_type **ptr;
-   unsigned bytes;
--  int fparg_count = 0, intarg_count = 0;
--  unsigned flags = 0;
-+  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;
- 
--  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--    NUM_FPR_ARG_REGISTERS = 0;
--
-+  /* The machine-independent calculation of cif->bytes doesn't work
-+     for us.  Redo the calculation.  */
-   if (cif->abi != FFI_LINUX64)
-     {
--      /* All the machine-independent calculation of cif->bytes will be wrong.
--	 Redo the calculation for SYSV.  */
--
-       /* 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;
-@@ -641,71 +769,93 @@ ffi_prep_cif_machdep (ffi_cif *cif)
-      - 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:
--      if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64
--	&& cif->abi != FFI_LINUX_SOFT_FLOAT)
--	goto byref;
-       flags |= FLAG_RETURNS_128BITS;
-       /* Fall through.  */
- #endif
-     case FFI_TYPE_DOUBLE:
-       flags |= FLAG_RETURNS_64BITS;
-       /* Fall through.  */
-     case FFI_TYPE_FLOAT:
--      /* With FFI_LINUX_SOFT_FLOAT no fp registers are used.  */
--      if (cif->abi != FFI_LINUX_SOFT_FLOAT)
--	flags |= FLAG_RETURNS_FP;
-+      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:
--      if (cif->abi == FFI_SYSV)
-+      /*
-+       * 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)
- 	{
--	  /* 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.  */
--
--	  /* Treat structs with size <= 8 bytes.  */
--	  if (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;
--	      /* These structs are returned in r3. We pack the type and the
--		 precalculated shift value (needed in the sysv.S) into flags.
--		 The same applies for the structs returned in r3/r4.  */
--	      if (size <= 4)
--		{
--		  flags |= FLAG_SYSV_SMST_R3;
--		  flags |= 8 * (4 - size) << 8;
--		  break;
--		}
--	      /* These structs are returned in r3 and r4. See above.   */
--	      if  (size <= 8)
--		{
--		  flags |= FLAG_SYSV_SMST_R3 | FLAG_SYSV_SMST_R4;
--		  flags |= 8 * (8 - size) << 8;
--		  break;
--		}
-+	      break;
- 	    }
- 	}
--#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
--    byref:
- #endif
-       intarg_count++;
-       flags |= FLAG_RETVAL_REFERENCE;
-       /* Fall through.  */
-     case FFI_TYPE_VOID:
-       flags |= FLAG_RETURNS_NOTHING;
-       break;
- 
-@@ -717,218 +867,334 @@ ffi_prep_cif_machdep (ffi_cif *cif)
-   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++)
-       {
--	switch ((*ptr)->type)
--	  {
-+	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:
--	    /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32.  */
--	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--	      goto soft_float_cif;
- 	    fparg_count++;
- 	    /* floating singles are not 8-aligned on stack */
- 	    break;
- 
- #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- 	  case FFI_TYPE_LONGDOUBLE:
--	    if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
--	      goto do_struct;
--	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--	      {
--		if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3
--		  || intarg_count < NUM_GPR_ARG_REGISTERS)
--		  /* A long double in FFI_LINUX_SOFT_FLOAT can use only
--		     a set of four consecutive gprs. If we have not enough,
--		     we have to adjust the intarg_count value.  */
--		  intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count;
--		intarg_count += 4;
--		break;
--	      }
--	    else
--	      fparg_count++;
-+	    fparg_count++;
- 	    /* Fall thru */
- #endif
- 	  case FFI_TYPE_DOUBLE:
--	    /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64.  */
--	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--	      goto soft_double_cif;
- 	    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:
--	  soft_double_cif:
- 	    /* '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:
--#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
--	  do_struct:
--#endif
- 	    /* 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).  */
- 
--	  default:
--	  soft_float_cif:
-+	  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:
--	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--	      intarg_count += 4;
--	    else
--	      {
--		fparg_count += 2;
--		intarg_count += 2;
--	      }
-+	    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;
- 
--	  default:
-+	  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_prep_cif_machdep_var (ffi_cif *cif,
-+			  unsigned int nfixedargs,
-+			  unsigned int ntotalargs MAYBE_UNUSED)
-+{
-+  cif->nfixedargs = nfixedargs;
-+#if _CALL_ELF == 2
-+  if (cif->abi == FFI_LINUX64)
-+    cif->flags |= FLAG_ARG_NEEDS_PSAVE;
-+#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.
-+   */
-+  unsigned long smst_buffer[8];
-   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;
--
-+  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;
- #else
-     case FFI_LINUX64:
-       ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn);
-       break;
- #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)
-+	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
-+	memcpy (rvalue, smst_buffer, rsize);
-+    }
- }
- 
- 
--#ifndef POWERPC64
-+#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;"
-@@ -942,26 +1208,48 @@ flush_icache (char *wraddr, char *xaddr,
- 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];
- 
--  FFI_ASSERT (cif->abi == FFI_LINUX64);
-+  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
- #else
-   unsigned int *tramp;
- 
--  FFI_ASSERT (cif->abi == FFI_GCC_SYSV || cif->abi == FFI_SYSV);
-+  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 <trampoline_initial+0x10> */
-   tramp[4] = 0x7d6802a6;  /*   mflr    r11 */
-   tramp[5] = 0x7c0803a6;  /*   mtlr    r0 */
-   tramp[6] = 0x800b0000;  /*   lwz     r0,0(r11) */
-   tramp[7] = 0x816b0004;  /*   lwz     r11,4(r11) */
-@@ -1006,110 +1294,215 @@ ffi_closure_helper_SYSV (ffi_closure *cl
-   /* 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;
--  long             nf;   /* number of floating registers already used */
--  long             ng;   /* number of general registers already used */
--  ffi_cif *        cif;
--  double           temp;
--  unsigned         size;
-+#ifndef __NO_FPRS__
-+  long             nf = 0;   /* number of floating registers already used */
-+#endif
-+  long             ng = 0;   /* number of general registers already used */
- 
--  cif = closure->cif;
-+  ffi_cif *cif = closure->cif;
-+  unsigned       size     = cif->rtype->size;
-+  unsigned short rtypenum = cif->rtype->type;
-+
-   avalue = alloca (cif->nargs * sizeof (void *));
--  size = cif->rtype->size;
- 
--  nf = 0;
--  ng = 0;
-+  /* 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 ((cif->rtype->type == FFI_TYPE_STRUCT
--       && !((cif->abi == FFI_SYSV) && (size <= 8)))
--#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
--      || (cif->rtype->type == FFI_TYPE_LONGDOUBLE
--	  && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
--#endif
--      )
--    {
-+  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)
--    {
--      switch (arg_types[i]->type)
--	{
-+  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:
--	soft_float_closure:
- 	  /* 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:
--#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
--	do_struct:
--#endif
- 	  /* 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++;
- 	    }
-@@ -1117,17 +1510,16 @@ ffi_closure_helper_SYSV (ffi_closure *cl
- 	    {
- 	      avalue[i] = (void *) *pst;
- 	      pst++;
- 	    }
- 	  break;
- 
- 	case FFI_TYPE_SINT64:
- 	case FFI_TYPE_UINT64:
--	soft_double_closure:
- 	  /* 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.
-@@ -1149,277 +1541,239 @@ ffi_closure_helper_SYSV (ffi_closure *cl
- 	      if (((long) pst) & 4)
- 		pst++;
- 	      avalue[i] = pst;
- 	      pst += 2;
- 	      ng = 8;
- 	    }
- 	  break;
- 
--	case FFI_TYPE_FLOAT:
--	  /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32.  */
--	  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--	    goto soft_float_closure;
--	  /* 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)
--	    {
--	      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:
--	  /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64.  */
--	  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--	    goto soft_double_closure;
--	  /* 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 (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
--	    goto do_struct;
--	  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--	    { /* 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;
--		}
--	      break;
--	    }
--	  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
--
- 	default:
--	  FFI_ASSERT (0);
-+		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 && cif->rtype->type == FFI_TYPE_STRUCT
--      && size <= 8)
-+  if (cif->abi == FFI_SYSV && rtypenum == FFI_TYPE_STRUCT && size <= 8)
-     return (FFI_SYSV_TYPE_SMALL_STRUCT - 1) + size;
--#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
--  else if (cif->rtype->type == FFI_TYPE_LONGDOUBLE
--	   && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
--    return FFI_TYPE_STRUCT;
--#endif
--  /* With FFI_LINUX_SOFT_FLOAT floats and doubles are handled like UINT32
--     respectivley UINT64.  */
--  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
--    {
--      switch (cif->rtype->type)
--	{
--	case FFI_TYPE_FLOAT:
--	  return FFI_TYPE_UINT32;
--	  break;
--	case FFI_TYPE_DOUBLE:
--	  return FFI_TYPE_UINT64;
--	  break;
--#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
--	case FFI_TYPE_LONGDOUBLE:
--	  return FFI_TYPE_UINT128;
--	  break;
--#endif
--	default:
--	  return cif->rtype->type;
--	}
--    }
--  else
--    {
--      return cif->rtype->type;
--    }
-+  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;
--  long i, avn;
-+  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)
-+  /* 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:
--	  /* 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;
-+#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
--	    avalue[i] = pst;
-+	    {
-+#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)
-+	  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)
-+	  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)
-+	  if (pfr + 1 < end_pfr && i + 1 < nfixedargs)
- 	    {
- 	      avalue[i] = pfr;
- 	      pfr += 2;
- 	    }
- 	  else
- 	    {
--	      if (pfr < end_pfr)
-+	      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;
- 	    }
-@@ -1433,10 +1787,19 @@ ffi_closure_helper_LINUX64 (ffi_closure 
- 
-       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/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
-@@ -1,11 +1,13 @@
- /* -----------------------------------------------------------------*-C-*-
--   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
--   Copyright (C) 2007, 2008 Free Software Foundation, Inc
-+   ffitarget.h - Copyright (c) 2012  Anthony Green
-+                 Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc
-+                 Copyright (c) 1996-2003  Red Hat, Inc.
-+
-    Target configuration macros for PowerPC.
- 
-    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
-@@ -23,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 ----------------------------------- */
- 
- #if defined (POWERPC) && defined (__powerpc64__)	/* linux64 */
- #ifndef POWERPC64
- #define POWERPC64
- #endif
- #elif defined (POWERPC_DARWIN) && defined (__ppc64__)	/* Darwin */
- #ifndef POWERPC64
-@@ -52,28 +58,24 @@ typedef enum ffi_abi {
-   FFI_FIRST_ABI = 0,
- 
- #ifdef POWERPC
-   FFI_SYSV,
-   FFI_GCC_SYSV,
-   FFI_LINUX64,
-   FFI_LINUX,
-   FFI_LINUX_SOFT_FLOAT,
--# ifdef POWERPC64
-+# 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,
- # else
--#  if (!defined(__NO_FPRS__) && (__LDBL_MANT_DIG__ == 106))
--  FFI_DEFAULT_ABI = FFI_LINUX,
--#  else
--#   ifdef __NO_FPRS__
--  FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT,
--#   else
-   FFI_DEFAULT_ABI = FFI_GCC_SYSV,
--#   endif
--#  endif
- # endif
- #endif
- 
- #ifdef POWERPC_AIX
-   FFI_AIX,
-   FFI_DARWIN,
-   FFI_DEFAULT_ABI = FFI_AIX,
- #endif
-@@ -96,32 +98,45 @@ typedef enum ffi_abi {
-   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)
-+# define FFI_TARGET_SPECIFIC_VARIADIC 1
-+# define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs
-+#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.  */
- #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2)
- 
--#if defined(POWERPC64) || defined(POWERPC_AIX)
--#define FFI_TRAMPOLINE_SIZE 24
--#else /* POWERPC || POWERPC_AIX */
--#define FFI_TRAMPOLINE_SIZE 40
-+/* 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
-+# 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 {
-     void * code_pointer;	/* Pointer to ffi_closure_ASM */
-     void * toc;			/* TOC */
-     void * static_chain;	/* Pointer to closure */
-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
-@@ -25,56 +25,86 @@
-    DEALINGS IN THE SOFTWARE.
-    ----------------------------------------------------------------------- */
- 
- #define LIBFFI_ASM
- #include <fficonfig.h>
- #include <ffi.h>
- 
- #ifdef __powerpc64__
--	.hidden	ffi_call_LINUX64, .ffi_call_LINUX64
--	.globl	ffi_call_LINUX64, .ffi_call_LINUX64
-+	.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
-+# else
- 	.section	".opd","aw"
- 	.align	3
- ffi_call_LINUX64:
-+#  ifdef _CALL_LINUX
-+	.quad	.L.ffi_call_LINUX64,.TOC.@tocbase,0
-+	.type	ffi_call_LINUX64,@function
-+	.text
-+.L.ffi_call_LINUX64:
-+#  else
-+	.hidden	.ffi_call_LINUX64
-+	.globl	.ffi_call_LINUX64
- 	.quad	.ffi_call_LINUX64,.TOC.@tocbase,0
- 	.size	ffi_call_LINUX64,24
- 	.type	.ffi_call_LINUX64,@function
- 	.text
- .ffi_call_LINUX64:
-+#  endif
-+# endif
- .LFB1:
- 	mflr	%r0
- 	std	%r28, -32(%r1)
- 	std	%r29, -24(%r1)
- 	std	%r30, -16(%r1)
- 	std	%r31, -8(%r1)
- 	std	%r0, 16(%r1)
- 
- 	mr	%r28, %r1	/* our AP.  */
- .LCFI0:
- 	stdux	%r1, %r1, %r4
- 	mr	%r31, %r5	/* flags, */
- 	mr	%r30, %r6	/* rvalue, */
- 	mr	%r29, %r7	/* function address.  */
-+/* Save toc pointer, not for the ffi_prep_args64 call, but for the later
-+   bctrl function call.  */
-+# if _CALL_ELF == 2
-+	std	%r2, 24(%r1)
-+# else
- 	std	%r2, 40(%r1)
-+# endif
- 
- 	/* Call ffi_prep_args64.  */
- 	mr	%r4, %r1
-+# if defined _CALL_LINUX || _CALL_ELF == 2
-+	bl	ffi_prep_args64
-+# else
- 	bl	.ffi_prep_args64
-+# endif
- 
--	ld	%r0, 0(%r29)
-+# if _CALL_ELF == 2
-+	mr	%r12, %r29
-+# else
-+	ld	%r12, 0(%r29)
- 	ld	%r2, 8(%r29)
- 	ld	%r11, 16(%r29)
--
-+# 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	%r0
-+	mtctr	%r12
- 	/* Load all those argument registers.  */
- 	ld	%r3, -32-(8*8)(%r28)
- 	ld	%r4, -32-(7*8)(%r28)
- 	ld	%r5, -32-(6*8)(%r28)
- 	ld	%r6, -32-(5*8)(%r28)
- 	bf-	5, 1f
- 	ld	%r7, -32-(4*8)(%r28)
- 	ld	%r8, -32-(3*8)(%r28)
-@@ -99,50 +129,93 @@ 1:
- 	lfd	%f13, -32-(9*8)(%r28)
- 2:
- 
- 	/* Make the call.  */
- 	bctrl
- 
- 	/* This must follow the call immediately, the unwinder
- 	   uses this to find out if r2 has been saved or not.  */
-+# if _CALL_ELF == 2
-+	ld	%r2, 24(%r1)
-+# else
- 	ld	%r2, 40(%r1)
-+# endif
- 
- 	/* Now, deal with the return value.  */
- 	mtcrf	0x01, %r31
--	bt-	30, .Ldone_return_value
--	bt-	29, .Lfp_return_value
-+	bt	31, .Lstruct_return_value
-+	bt	30, .Ldone_return_value
-+	bt	29, .Lfp_return_value
- 	std	%r3, 0(%r30)
- 	/* Fall through...  */
- 
- .Ldone_return_value:
- 	/* Restore the registers we used and return.  */
- 	mr	%r1, %r28
- 	ld	%r0, 16(%r28)
--	ld	%r28, -32(%r1)
-+	ld	%r28, -32(%r28)
- 	mtlr	%r0
- 	ld	%r29, -24(%r1)
- 	ld	%r30, -16(%r1)
- 	ld	%r31, -8(%r1)
- 	blr
- 
- .Lfp_return_value:
- 	bf	28, .Lfloat_return_value
- 	stfd	%f1, 0(%r30)
- 	mtcrf	0x02, %r31 /* cr6  */
- 	bf	27, .Ldone_return_value
- 	stfd	%f2, 8(%r30)
- 	b	.Ldone_return_value
- .Lfloat_return_value:
- 	stfs	%f1, 0(%r30)
- 	b	.Ldone_return_value
-+
-+.Lstruct_return_value:
-+	bf	29, .Lsmall_struct
-+	bf	28, .Lfloat_homog_return_value
-+	stfd	%f1, 0(%r30)
-+	stfd	%f2, 8(%r30)
-+	stfd	%f3, 16(%r30)
-+	stfd	%f4, 24(%r30)
-+	stfd	%f5, 32(%r30)
-+	stfd	%f6, 40(%r30)
-+	stfd	%f7, 48(%r30)
-+	stfd	%f8, 56(%r30)
-+	b	.Ldone_return_value
-+
-+.Lfloat_homog_return_value:
-+	stfs	%f1, 0(%r30)
-+	stfs	%f2, 4(%r30)
-+	stfs	%f3, 8(%r30)
-+	stfs	%f4, 12(%r30)
-+	stfs	%f5, 16(%r30)
-+	stfs	%f6, 20(%r30)
-+	stfs	%f7, 24(%r30)
-+	stfs	%f8, 28(%r30)
-+	b	.Ldone_return_value
-+
-+.Lsmall_struct:
-+	std	%r3, 0(%r30)
-+	std	%r4, 8(%r30)
-+	b	.Ldone_return_value
-+
- .LFE1:
- 	.long	0
- 	.byte	0,12,0,1,128,4,0,0
-+# if _CALL_ELF == 2
-+	.size	ffi_call_LINUX64,.-ffi_call_LINUX64
-+# else
-+#  ifdef _CALL_LINUX
-+	.size	ffi_call_LINUX64,.-.L.ffi_call_LINUX64
-+#  else
- 	.size	.ffi_call_LINUX64,.-.ffi_call_LINUX64
-+#  endif
-+# endif
- 
- 	.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
- 	.ascii "zR\0"	 # CIE Augmentation
-@@ -175,13 +248,13 @@ 2:
- 	.byte	0x9e	 # DW_CFA_offset, column 0x1e
- 	.uleb128 0x2
- 	.byte	0x9d	 # DW_CFA_offset, column 0x1d
- 	.uleb128 0x3
- 	.byte	0x9c	 # DW_CFA_offset, column 0x1c
- 	.uleb128 0x4
- 	.align 3
- .LEFDE1:
-+
-+# if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
-+	.section	.note.GNU-stack,"",@progbits
-+# endif
- #endif
--
--#if defined __ELF__ && defined __linux__
--	.section	.note.GNU-stack,"",@progbits
--#endif
-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
-@@ -27,179 +27,330 @@
- #define LIBFFI_ASM
- #include <fficonfig.h>
- #include <ffi.h>
- 
- 	.file	"linux64_closure.S"
- 
- #ifdef __powerpc64__
- 	FFI_HIDDEN (ffi_closure_LINUX64)
--	FFI_HIDDEN (.ffi_closure_LINUX64)
--	.globl  ffi_closure_LINUX64, .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
-+# else
- 	.section        ".opd","aw"
- 	.align  3
- ffi_closure_LINUX64:
-+#  ifdef _CALL_LINUX
-+	.quad   .L.ffi_closure_LINUX64,.TOC.@tocbase,0
-+	.type   ffi_closure_LINUX64,@function
-+	.text
-+.L.ffi_closure_LINUX64:
-+#  else
-+	FFI_HIDDEN (.ffi_closure_LINUX64)
-+	.globl  .ffi_closure_LINUX64
- 	.quad   .ffi_closure_LINUX64,.TOC.@tocbase,0
- 	.size   ffi_closure_LINUX64,24
- 	.type   .ffi_closure_LINUX64,@function
- 	.text
- .ffi_closure_LINUX64:
-+#  endif
-+# endif
-+
-+# if _CALL_ELF == 2
-+#  32 byte special reg save area + 64 byte parm save area
-+#  + 64 byte retval area + 13*8 fpr save area + round to 16
-+#  define STACKFRAME 272
-+#  define PARMSAVE 32
-+#  define RETVAL PARMSAVE+64
-+# else
-+#  48 bytes special reg save area + 64 bytes parm save area
-+#  + 16 bytes retval area + 13*8 bytes fpr save area + round to 16
-+#  define STACKFRAME 240
-+#  define PARMSAVE 48
-+#  define RETVAL PARMSAVE+64
-+# endif
-+
- .LFB1:
--	# save general regs into parm save area
--	std	%r3, 48(%r1)
--	std	%r4, 56(%r1)
--	std	%r5, 64(%r1)
--	std	%r6, 72(%r1)
-+# if _CALL_ELF == 2
-+	ld	%r12, FFI_TRAMPOLINE_SIZE(%r11)		# closure->cif
- 	mflr	%r0
-+	lwz	%r12, 28(%r12)				# cif->flags
-+	mtcrf	0x40, %r12
-+	addi	%r12, %r1, PARMSAVE
-+	bt	7, .Lparmsave
-+	# Our caller has not allocated a parameter save area.
-+	# We need to allocate one here and use it to pass gprs to
-+	# ffi_closure_helper_LINUX64.
-+	addi	%r12, %r1, -STACKFRAME+PARMSAVE
-+.Lparmsave:
-+	std	%r0, 16(%r1)
-+	# Save general regs into parm save area
-+	std	%r3, 0(%r12)
-+	std	%r4, 8(%r12)
-+	std	%r5, 16(%r12)
-+	std	%r6, 24(%r12)
-+	std	%r7, 32(%r12)
-+	std	%r8, 40(%r12)
-+	std	%r9, 48(%r12)
-+	std	%r10, 56(%r12)
- 
--	std	%r7, 80(%r1)
--	std	%r8, 88(%r1)
--	std	%r9, 96(%r1)
--	std	%r10, 104(%r1)
-+	# load up the pointer to the parm save area
-+	mr	%r5, %r12
-+# else
-+	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)
-+	std	%r8, PARMSAVE+40(%r1)
-+	std	%r9, PARMSAVE+48(%r1)
-+	std	%r10, PARMSAVE+56(%r1)
-+
- 	std	%r0, 16(%r1)
- 
--	# mandatory 48 bytes special reg save area + 64 bytes parm save area
--	# + 16 bytes retval area + 13*8 bytes fpr save area + round to 16
--	stdu	%r1, -240(%r1)
-+	# load up the pointer to the parm save area
-+	addi	%r5, %r1, PARMSAVE
-+# endif
-+
-+	# next save fpr 1 to fpr 13
-+	stfd	%f1, -104+(0*8)(%r1)
-+	stfd	%f2, -104+(1*8)(%r1)
-+	stfd	%f3, -104+(2*8)(%r1)
-+	stfd	%f4, -104+(3*8)(%r1)
-+	stfd	%f5, -104+(4*8)(%r1)
-+	stfd	%f6, -104+(5*8)(%r1)
-+	stfd	%f7, -104+(6*8)(%r1)
-+	stfd	%f8, -104+(7*8)(%r1)
-+	stfd	%f9, -104+(8*8)(%r1)
-+	stfd	%f10, -104+(9*8)(%r1)
-+	stfd	%f11, -104+(10*8)(%r1)
-+	stfd	%f12, -104+(11*8)(%r1)
-+	stfd	%f13, -104+(12*8)(%r1)
-+
-+	# load up the pointer to the saved fpr registers */
-+	addi	%r6, %r1, -104
-+
-+	# load up the pointer to the result storage
-+	addi	%r4, %r1, -STACKFRAME+RETVAL
-+
-+	stdu	%r1, -STACKFRAME(%r1)
- .LCFI0:
- 
--	# next save fpr 1 to fpr 13
--	stfd  %f1, 128+(0*8)(%r1)
--	stfd  %f2, 128+(1*8)(%r1)
--	stfd  %f3, 128+(2*8)(%r1)
--	stfd  %f4, 128+(3*8)(%r1)
--	stfd  %f5, 128+(4*8)(%r1)
--	stfd  %f6, 128+(5*8)(%r1)
--	stfd  %f7, 128+(6*8)(%r1)
--	stfd  %f8, 128+(7*8)(%r1)
--	stfd  %f9, 128+(8*8)(%r1)
--	stfd  %f10, 128+(9*8)(%r1)
--	stfd  %f11, 128+(10*8)(%r1)
--	stfd  %f12, 128+(11*8)(%r1)
--	stfd  %f13, 128+(12*8)(%r1)
--
--	# set up registers for the routine that actually does the work
- 	# get the context pointer from the trampoline
--	mr %r3, %r11
--
--	# now load up the pointer to the result storage
--	addi %r4, %r1, 112
--
--	# now load up the pointer to the parameter save area
--	# in the previous frame
--	addi %r5, %r1, 240 + 48
--
--	# now load up the pointer to the saved fpr registers */
--	addi %r6, %r1, 128
-+	mr	%r3, %r11
- 
- 	# make the call
-+# if defined _CALL_LINUX || _CALL_ELF == 2
-+	bl ffi_closure_helper_LINUX64
-+# else
- 	bl .ffi_closure_helper_LINUX64
-+# endif
- .Lret:
- 
- 	# 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
-+	ld %r0, STACKFRAME+16(%r1)
-+	cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT
-+	bge .Lsmall
- 	mflr %r4		# move address of .Lret to r4
- 	sldi %r3, %r3, 4	# now multiply return type by 16
- 	addi %r4, %r4, .Lret_type0 - .Lret
--	ld %r0, 240+16(%r1)
- 	add %r3, %r3, %r4	# add contents of table to table address
- 	mtctr %r3
- 	bctr			# jump to it
- 
- # 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
- 
- .Lret_type0:
- # case FFI_TYPE_VOID
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- 	nop
- # case FFI_TYPE_INT
--	lwa %r3, 112+4(%r1)
-+# ifdef __LITTLE_ENDIAN__
-+	lwa %r3, RETVAL+0(%r1)
-+# else
-+	lwa %r3, RETVAL+4(%r1)
-+# endif
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_FLOAT
--	lfs %f1, 112+0(%r1)
-+	lfs %f1, RETVAL+0(%r1)
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_DOUBLE
--	lfd %f1, 112+0(%r1)
-+	lfd %f1, RETVAL+0(%r1)
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_LONGDOUBLE
--	lfd %f1, 112+0(%r1)
-+	lfd %f1, RETVAL+0(%r1)
- 	mtlr %r0
--	lfd %f2, 112+8(%r1)
-+	lfd %f2, RETVAL+8(%r1)
- 	b .Lfinish
- # case FFI_TYPE_UINT8
--	lbz %r3, 112+7(%r1)
-+# ifdef __LITTLE_ENDIAN__
-+	lbz %r3, RETVAL+0(%r1)
-+# else
-+	lbz %r3, RETVAL+7(%r1)
-+# endif
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_SINT8
--	lbz %r3, 112+7(%r1)
-+# ifdef __LITTLE_ENDIAN__
-+	lbz %r3, RETVAL+0(%r1)
-+# else
-+	lbz %r3, RETVAL+7(%r1)
-+# endif
- 	extsb %r3,%r3
- 	mtlr %r0
- 	b .Lfinish
- # case FFI_TYPE_UINT16
--	lhz %r3, 112+6(%r1)
-+# ifdef __LITTLE_ENDIAN__
-+	lhz %r3, RETVAL+0(%r1)
-+# else
-+	lhz %r3, RETVAL+6(%r1)
-+# endif
- 	mtlr %r0
- .Lfinish:
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_SINT16
--	lha %r3, 112+6(%r1)
-+# ifdef __LITTLE_ENDIAN__
-+	lha %r3, RETVAL+0(%r1)
-+# else
-+	lha %r3, RETVAL+6(%r1)
-+# endif
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_UINT32
--	lwz %r3, 112+4(%r1)
-+# ifdef __LITTLE_ENDIAN__
-+	lwz %r3, RETVAL+0(%r1)
-+# else
-+	lwz %r3, RETVAL+4(%r1)
-+# endif
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_SINT32
--	lwa %r3, 112+4(%r1)
-+# ifdef __LITTLE_ENDIAN__
-+	lwa %r3, RETVAL+0(%r1)
-+# else
-+	lwa %r3, RETVAL+4(%r1)
-+# endif
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_UINT64
--	ld %r3, 112+0(%r1)
-+	ld %r3, RETVAL+0(%r1)
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_SINT64
--	ld %r3, 112+0(%r1)
-+	ld %r3, RETVAL+0(%r1)
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- # case FFI_TYPE_STRUCT
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
- 	nop
- # case FFI_TYPE_POINTER
--	ld %r3, 112+0(%r1)
-+	ld %r3, RETVAL+0(%r1)
- 	mtlr %r0
--	addi %r1, %r1, 240
-+	addi %r1, %r1, STACKFRAME
- 	blr
--# esac
-+# case FFI_V2_TYPE_FLOAT_HOMOG
-+	lfs %f1, RETVAL+0(%r1)
-+	lfs %f2, RETVAL+4(%r1)
-+	lfs %f3, RETVAL+8(%r1)
-+	b .Lmorefloat
-+# case FFI_V2_TYPE_DOUBLE_HOMOG
-+	lfd %f1, RETVAL+0(%r1)
-+	lfd %f2, RETVAL+8(%r1)
-+	lfd %f3, RETVAL+16(%r1)
-+	lfd %f4, RETVAL+24(%r1)
-+	mtlr %r0
-+	lfd %f5, RETVAL+32(%r1)
-+	lfd %f6, RETVAL+40(%r1)
-+	lfd %f7, RETVAL+48(%r1)
-+	lfd %f8, RETVAL+56(%r1)
-+	addi %r1, %r1, STACKFRAME
-+	blr
-+.Lmorefloat:
-+	lfs %f4, RETVAL+12(%r1)
-+	mtlr %r0
-+	lfs %f5, RETVAL+16(%r1)
-+	lfs %f6, RETVAL+20(%r1)
-+	lfs %f7, RETVAL+24(%r1)
-+	lfs %f8, RETVAL+28(%r1)
-+	addi %r1, %r1, STACKFRAME
-+	blr
-+.Lsmall:
-+# ifdef __LITTLE_ENDIAN__
-+	ld %r3,RETVAL+0(%r1)
-+	mtlr %r0
-+	ld %r4,RETVAL+8(%r1)
-+	addi %r1, %r1, STACKFRAME
-+	blr
-+# else
-+	# A struct smaller than a dword is returned in the low bits of r3
-+	# ie. right justified.  Larger structs are passed left justified
-+	# in r3 and r4.  The return value area on the stack will have
-+	# the structs as they are usually stored in memory.
-+	cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes?
-+	neg %r5, %r3
-+	ld %r3,RETVAL+0(%r1)
-+	blt .Lsmalldown
-+	mtlr %r0
-+	ld %r4,RETVAL+8(%r1)
-+	addi %r1, %r1, STACKFRAME
-+	blr
-+.Lsmalldown:
-+	addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7
-+	mtlr %r0
-+	sldi %r5, %r5, 3
-+	addi %r1, %r1, STACKFRAME
-+	srd %r3, %r3, %r5
-+	blr
-+# endif
-+
- .LFE1:
- 	.long	0
- 	.byte	0,12,0,1,128,0,0,0
-+# if _CALL_ELF == 2
-+	.size	ffi_closure_LINUX64,.-ffi_closure_LINUX64
-+# else
-+#  ifdef _CALL_LINUX
-+	.size	ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64
-+#  else
- 	.size	.ffi_closure_LINUX64,.-.ffi_closure_LINUX64
-+#  endif
-+# endif
- 
- 	.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
- 	.ascii "zR\0"	 # CIE Augmentation
-@@ -218,19 +369,19 @@ ffi_closure_LINUX64:
- .LASFDE1:
- 	.4byte	.LASFDE1-.Lframe1	 # FDE CIE offset
- 	.8byte	.LFB1-.	 # FDE initial location
- 	.8byte	.LFE1-.LFB1	 # FDE address range
- 	.uleb128 0x0	 # Augmentation size
- 	.byte	0x2	 # DW_CFA_advance_loc1
- 	.byte	.LCFI0-.LFB1
- 	.byte	0xe	 # DW_CFA_def_cfa_offset
--	.uleb128 240
-+	.uleb128 STACKFRAME
- 	.byte	0x11	 # DW_CFA_offset_extended_sf
- 	.uleb128 0x41
- 	.sleb128 -2
- 	.align 3
- .LEFDE1:
-+
-+# if defined __ELF__ && defined __linux__
-+	.section	.note.GNU-stack,"",@progbits
-+# endif
- #endif
--
--#if defined __ELF__ && defined __linux__
--	.section	.note.GNU-stack,"",@progbits
--#endif
-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
-@@ -117,53 +117,88 @@ ENTRY(ffi_closure_SYSV)
- # case FFI_TYPE_INT
- 	lwz %r3,112+0(%r1)
- 	mtlr %r0
- .Lfinish:
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_TYPE_FLOAT
-+#ifndef __NO_FPRS__
- 	lfs %f1,112+0(%r1)
- 	mtlr %r0
- 	addi %r1,%r1,144
-+#else
-+	nop
-+	nop
-+	nop
-+#endif
- 	blr
- 
- # case FFI_TYPE_DOUBLE
-+#ifndef __NO_FPRS__
- 	lfd %f1,112+0(%r1)
- 	mtlr %r0
- 	addi %r1,%r1,144
-+#else
-+	nop
-+	nop
-+	nop
-+#endif
- 	blr
- 
- # case FFI_TYPE_LONGDOUBLE
-+#ifndef __NO_FPRS__
- 	lfd %f1,112+0(%r1)
- 	lfd %f2,112+8(%r1)
- 	mtlr %r0
- 	b .Lfinish
-+#else
-+	nop
-+	nop
-+	nop
-+	blr
-+#endif
- 
- # case FFI_TYPE_UINT8
-+#ifdef __LITTLE_ENDIAN__
-+	lbz %r3,112+0(%r1)
-+#else
- 	lbz %r3,112+3(%r1)
-+#endif
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_TYPE_SINT8
-+#ifdef __LITTLE_ENDIAN__
-+	lbz %r3,112+0(%r1)
-+#else
- 	lbz %r3,112+3(%r1)
-+#endif
- 	extsb %r3,%r3
- 	mtlr %r0
- 	b .Lfinish
- 
- # case FFI_TYPE_UINT16
-+#ifdef __LITTLE_ENDIAN__
-+	lhz %r3,112+0(%r1)
-+#else
- 	lhz %r3,112+2(%r1)
-+#endif
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_TYPE_SINT16
-+#ifdef __LITTLE_ENDIAN__
-+	lha %r3,112+0(%r1)
-+#else
- 	lha %r3,112+2(%r1)
-+#endif
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_TYPE_UINT32
- 	lwz %r3,112+0(%r1)
- 	mtlr %r0
- 	addi %r1,%r1,144
-@@ -198,76 +233,99 @@ ENTRY(ffi_closure_SYSV)
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_TYPE_UINT128
- 	lwz %r3,112+0(%r1)
- 	lwz %r4,112+4(%r1)
- 	lwz %r5,112+8(%r1)
--	bl .Luint128
-+	b .Luint128
- 
- # The return types below are only used when the ABI type is FFI_SYSV.
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct.
- 	lbz %r3,112+0(%r1)
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct.
- 	lhz %r3,112+0(%r1)
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
- 	lwz %r3,112+0(%r1)
-+#ifdef __LITTLE_ENDIAN__
-+	mtlr %r0
-+	addi %r1,%r1,144
-+	blr
-+#else
- 	srwi %r3,%r3,8
- 	mtlr %r0
- 	b .Lfinish
-+#endif
- 
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
- 	lwz %r3,112+0(%r1)
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
- 	lwz %r3,112+0(%r1)
- 	lwz %r4,112+4(%r1)
-+#ifdef __LITTLE_ENDIAN__
-+	mtlr %r0
-+	b .Lfinish
-+#else
- 	li %r5,24
- 	b .Lstruct567
-+#endif
- 
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
- 	lwz %r3,112+0(%r1)
- 	lwz %r4,112+4(%r1)
-+#ifdef __LITTLE_ENDIAN__
-+	mtlr %r0
-+	b .Lfinish
-+#else
- 	li %r5,16
- 	b .Lstruct567
-+#endif
- 
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
- 	lwz %r3,112+0(%r1)
- 	lwz %r4,112+4(%r1)
-+#ifdef __LITTLE_ENDIAN__
-+	mtlr %r0
-+	b .Lfinish
-+#else
- 	li %r5,8
- 	b .Lstruct567
-+#endif
- 
- # case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
- 	lwz %r3,112+0(%r1)
- 	lwz %r4,112+4(%r1)
- 	mtlr %r0
- 	b .Lfinish
- 
-+#ifndef __LITTLE_ENDIAN__
- .Lstruct567:
- 	subfic %r6,%r5,32
- 	srw %r4,%r4,%r5
- 	slw %r6,%r3,%r6
- 	srw %r3,%r3,%r5
- 	or %r4,%r6,%r4
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
-+#endif
- 
- .Luint128:
- 	lwz %r6,112+12(%r1)
- 	mtlr %r0
- 	addi %r1,%r1,144
- 	blr
- 
- END(ffi_closure_SYSV)
-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
-@@ -78,37 +78,41 @@ ENTRY(ffi_call_SYSV)
- 	nop
- 	lwz	%r7,-16-(4*4)(%r28)
- 	lwz	%r8,-16-(3*4)(%r28)
- 	lwz	%r9,-16-(2*4)(%r28)
- 	lwz	%r10,-16-(1*4)(%r28)
- 	nop
- 1:
- 
-+#ifndef __NO_FPRS__
- 	/* Load all the FP registers.  */
- 	bf-	6,2f
- 	lfd	%f1,-16-(8*4)-(8*8)(%r28)
- 	lfd	%f2,-16-(8*4)-(7*8)(%r28)
- 	lfd	%f3,-16-(8*4)-(6*8)(%r28)
- 	lfd	%f4,-16-(8*4)-(5*8)(%r28)
- 	nop
- 	lfd	%f5,-16-(8*4)-(4*8)(%r28)
- 	lfd	%f6,-16-(8*4)-(3*8)(%r28)
- 	lfd	%f7,-16-(8*4)-(2*8)(%r28)
- 	lfd	%f8,-16-(8*4)-(1*8)(%r28)
-+#endif
- 2:
- 
- 	/* Make the call.  */
- 	bctrl
- 
- 	/* Now, deal with the return value.  */
- 	mtcrf	0x01,%r31 /* cr7  */
- 	bt-	31,L(small_struct_return_value)
- 	bt-	30,L(done_return_value)
-+#ifndef __NO_FPRS__
- 	bt-	29,L(fp_return_value)
-+#endif
- 	stw	%r3,0(%r30)
- 	bf+	28,L(done_return_value)
- 	stw	%r4,4(%r30)
- 	mtcrf	0x02,%r31 /* cr6  */
- 	bf	27,L(done_return_value)
- 	stw     %r5,8(%r30)
- 	stw	%r6,12(%r30)
- 	/* Fall through...  */
-@@ -119,41 +123,38 @@ L(done_return_value):
- 	lwz	%r31, -4(%r28)
- 	mtlr	%r9
- 	lwz	%r30, -8(%r28)
- 	lwz	%r29,-12(%r28)
- 	lwz	%r28,-16(%r28)
- 	lwz	%r1,0(%r1)
- 	blr
- 
-+#ifndef __NO_FPRS__
- L(fp_return_value):
- 	bf	28,L(float_return_value)
- 	stfd	%f1,0(%r30)
- 	mtcrf   0x02,%r31 /* cr6  */
- 	bf	27,L(done_return_value)
- 	stfd	%f2,8(%r30)
- 	b	L(done_return_value)
- L(float_return_value):
- 	stfs	%f1,0(%r30)
- 	b	L(done_return_value)
-+#endif
- 
- L(small_struct_return_value):
--	extrwi	%r6,%r31,2,19         /* number of bytes padding = shift/8 */
--	mtcrf	0x02,%r31	      /* copy flags to cr[24:27] (cr6) */
--	extrwi	%r5,%r31,5,19         /* r5 <- number of bits of padding */
--	subfic  %r6,%r6,4             /* r6 <- number of useful bytes in r3 */
--	bf-	25,L(done_return_value) /* struct in r3 ? if not, done. */
--/* smst_one_register: */
--	slw	%r3,%r3,%r5           /* Left-justify value in r3 */
--	mtxer	%r6                   /* move byte count to XER ... */
--	stswx	%r3,0,%r30            /* ... and store that many bytes */
--	bf+	26,L(done_return_value)  /* struct in r3:r4 ? */
--	add	%r6,%r6,%r30          /* adjust pointer */
--	stswi	%r4,%r6,4             /* store last four bytes */
--	b	L(done_return_value)
-+	/*
-+	 * The C code always allocates a properly-aligned 8-byte bounce
-+	 * buffer to make this assembly code very simple.  Just write out
-+	 * r3 and r4 to the buffer to allow the C code to handle the rest.
-+	 */
-+	stw %r3, 0(%r30)
-+	stw %r4, 4(%r30)
-+	b L(done_return_value)
- 
- .LFE1:
- END(ffi_call_SYSV)
- 
-       .section	".eh_frame",EH_FRAME_FLAGS,@progbits
- .Lframe1:
-       .4byte    .LECIE1-.LSCIE1  /*  Length of Common Information Entry */
- .LSCIE1:
--- a/mozilla-ppc64le-mfbt.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-# HG changeset patch
-# Parent 46508a61b834f02575c116a508aa37b66d50bd20
-# User Ulrich Weigand <uweigand@de.ibm.com>
-Bug 976648 - powerpc64le-linux support - mfbt endian config
-
-diff --git a/mfbt/Endian.h b/mfbt/Endian.h
---- a/mfbt/Endian.h
-+++ b/mfbt/Endian.h
-@@ -86,17 +86,17 @@
- #    error "CPU type is unknown"
- #  endif
- #elif defined(_WIN32)
- #  if defined(_M_IX86)
- #    define MOZ_LITTLE_ENDIAN 1
- #  else
- #    error "CPU type is unknown"
- #  endif
--#elif defined(__APPLE__)
-+#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__)
- #  if __LITTLE_ENDIAN__
- #    define MOZ_LITTLE_ENDIAN 1
- #  elif __BIG_ENDIAN__
- #    define MOZ_BIG_ENDIAN 1
- #  endif
- #elif defined(__GNUC__) && \
-       defined(__BYTE_ORDER__) && \
-       defined(__ORDER_LITTLE_ENDIAN__) && \
-@@ -114,18 +114,17 @@
- #  endif
- /*
-  * We can't include useful headers like <endian.h> or <sys/isa_defs.h>
-  * here because they're not present on all platforms.  Instead we have
-  * this big conditional that ideally will catch all the interesting
-  * cases.
-  */
- #elif defined(__sparc) || defined(__sparc__) || \
--      defined(_POWER) || defined(__powerpc__) || \
--      defined(__ppc__) || defined(__hppa) || \
-+      defined(_POWER) || defined(__hppa) || \
-       defined(_MIPSEB) || defined(__ARMEB__) || \
-       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__) || \
--- a/mozilla-ppc64le-webrtc.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-# HG changeset patch
-# Parent acbe154db4c912f3ac853c0671cd3d5e52b1e716
-# User Ulrich Weigand <uweigand@de.ibm.com>
-Bug 976648 - powerpc64le-linux support - WebRTC endian config
-
-diff --git a/media/webrtc/trunk/webrtc/typedefs.h b/media/webrtc/trunk/webrtc/typedefs.h
---- a/media/webrtc/trunk/webrtc/typedefs.h
-+++ b/media/webrtc/trunk/webrtc/typedefs.h
-@@ -47,23 +47,33 @@
- //#define WEBRTC_ARCH_ARM_FAMILY
- //#define WEBRTC_ARCH_ARMEL
- #define WEBRTC_ARCH_32_BITS
- #define WEBRTC_ARCH_LITTLE_ENDIAN
- #define WEBRTC_LITTLE_ENDIAN
- #elif defined(__powerpc64__)
- #define WEBRTC_ARCH_PPC64 1
- #define WEBRTC_ARCH_64_BITS 1
-+#ifdef __LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#define WEBRTC_LITTLE_ENDIAN
-+#else
- #define WEBRTC_ARCH_BIG_ENDIAN
- #define WEBRTC_BIG_ENDIAN
-+#endif
- #elif defined(__ppc__) || defined(__powerpc__)
- #define WEBRTC_ARCH_PPC 1
- #define WEBRTC_ARCH_32_BITS 1
-+#ifdef __LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#define WEBRTC_LITTLE_ENDIAN
-+#else
- #define WEBRTC_ARCH_BIG_ENDIAN
- #define WEBRTC_BIG_ENDIAN
-+#endif
- #elif defined(__sparc64__)
- #define WEBRTC_ARCH_SPARC 1
- #define WEBRTC_ARCH_64_BITS 1
- #define WEBRTC_ARCH_BIG_ENDIAN
- #define WEBRTC_BIG_ENDIAN
- #elif defined(__sparc__)
- #define WEBRTC_ARCH_SPARC 1
- #define WEBRTC_ARCH_32_BITS 1
--- a/mozilla-ppc64le-xpcom.patch	Mon Apr 14 09:09:11 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,298 +0,0 @@
-# HG changeset patch
-# Parent 571f8d1f1501d31bd7c0d0affdc7cdc8b21203a0
-# User Ulrich Weigand <uweigand@de.ibm.com>
-Bug 976648 - powerpc64le-linux support - xptcall port
-
-Index: mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build
-===================================================================
---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/moz.build
-+++ mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build
-@@ -224,12 +224,12 @@ if CONFIG['OS_TEST'] == 'powerpc':
-             'xptcstubs_ppc_linux.cpp',
-         ]
- 
--if CONFIG['OS_TEST'] == 'powerpc64':
-+if CONFIG['OS_TEST'] in ('powerpc64', 'powerpc64le'):
-     if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'):
-           SOURCES += [
--              'xptcinvoke_asm_ppc64_linux.s',
-+              'xptcinvoke_asm_ppc64_linux.S',
-               'xptcinvoke_ppc64_linux.cpp',
--              'xptcstubs_asm_ppc64_linux.s',
-+              'xptcstubs_asm_ppc64_linux.S',
-               'xptcstubs_ppc64_linux.cpp',
-           ]
- 
-diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.S
-rename from xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s
-rename to xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.S
---- a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s
-+++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.S
-@@ -17,12 +17,38 @@
- .set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
- .set f30,30; .set f31,31
- 
-+# The ABI defines a fixed stack frame area of 4 doublewords (ELFv2)
-+# or 6 doublewords (ELFv1); the last of these doublewords is used
-+# as TOC pointer save area.  The fixed area is followed by a parameter
-+# save area of 8 doublewords (used for vararg routines), followed
-+# by space for parameters passed on the stack.
-+#
-+# We set STACK_TOC to the offset of the TOC pointer save area, and
-+# STACK_PARAMS to the offset of the first on-stack parameter.
-+
-+#if _CALL_ELF == 2
-+#define STACK_TOC      24
-+#define STACK_PARAMS   96
-+#else
-+#define STACK_TOC      40
-+#define STACK_PARAMS   112
-+#endif
- 
- #
- # NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
- #                    uint32_t paramCount, nsXPTCVariant* params)
- #
- 
-+#if _CALL_ELF == 2
-+        .section ".text"
-+        .type   NS_InvokeByIndex,@function
-+        .globl  NS_InvokeByIndex
-+        .align 2
-+NS_InvokeByIndex:
-+0:      addis 2,12,(.TOC.-0b)@ha
-+        addi 2,2,(.TOC.-0b)@l
-+        .localentry NS_InvokeByIndex,.-NS_InvokeByIndex
-+#else
-         .section ".toc","aw"
-         .section ".text"
-         .align 2
-@@ -34,6 +60,7 @@ NS_InvokeByIndex:
-         .previous
-         .type   NS_InvokeByIndex,@function
- .NS_InvokeByIndex:
-+#endif
-         mflr    0
-         std     0,16(r1)
- 
-@@ -50,13 +77,12 @@ NS_InvokeByIndex:
-         # we don't actually need stack space for those. We must ensure
-         # that the stack remains 16-byte aligned.
-         #
--        #  | ..128-byte stack frame.. |     | 7 GP | 13 FP | 3 NV |
--        #  |               |(params)........| regs | regs  | regs |
--        # (r1)...........(+112)....(+128)
--        #                               (-23*8).(-16*8).(-3*8)..(r31)
-+        #  | (fixed area + |                | 7 GP | 13 FP | 3 NV |
-+        #  |  param. save) |(params)........| regs | regs  | regs |
-+        # (r1)......(+STACK_PARAMS)...  (-23*8).(-16*8).(-3*8)..(r31)
- 
-         # +stack frame, -unused stack params, +regs storage, +1 for alignment
--        addi    r7,r5,((112/8)-7+7+13+3+1)
-+        addi    r7,r5,((STACK_PARAMS/8)-7+7+13+3+1)
-         rldicr  r7,r7,3,59              # multiply by 8 and mask with ~15
-         neg     r7,r7
-         stdux   r1,r1,r7
-@@ -67,12 +93,13 @@ NS_InvokeByIndex:
-         #                           uint64_t* d))
- 
-         # r5, r6 are passed through intact (paramCount, params)
--        # r7 (d) has to be r1+112 -- where parameters are passed on the stack.
-+        # r7 (d) has to be r1+STACK_PARAMS
-+        #        -- where parameters are passed on the stack.
-         # r3, r4 are above that, easier to address from r31 than from r1
- 
-         subi    r3,r31,(23*8)           # r3 --> GPRS
-         subi    r4,r31,(16*8)           # r4 --> FPRS
--        addi    r7,r1,112               # r7 --> params
-+        addi    r7,r1,STACK_PARAMS      # r7 --> params
-         bl      invoke_copy_to_stack
-         nop
- 
-@@ -83,14 +110,18 @@ NS_InvokeByIndex:
- 
-         sldi    r30,r30,3               # Find function descriptor 
-         add     r9,r9,r30
--        ld      r9,0(r9)
-+        ld      r12,0(r9)
- 
--        ld      r0,0(r9)                # Actual address from fd.
--        std     r2,40(r1)               # Save r2 (TOC pointer)
-+        std     r2,STACK_TOC(r1)        # Save r2 (TOC pointer)
- 
-+#if _CALL_ELF == 2
-+        mtctr   r12
-+#else
-+        ld      r0,0(r12)               # Actual address from fd.
-         mtctr   0
--        ld      r11,16(r9)              # Environment pointer from fd.
--        ld      r2,8(r9)                # TOC pointer from fd.
-+        ld      r11,16(r12)             # Environment pointer from fd.
-+        ld      r2,8(r12)               # TOC pointer from fd.
-+#endif
- 
-         # Load FP and GP registers as required
-         ld      r4, -(23*8)(r31) 
-@@ -117,7 +148,7 @@ NS_InvokeByIndex:
- 
-         bctrl                           # Do it
- 
--        ld      r2,40(r1)               # Load our own TOC pointer
-+        ld      r2,STACK_TOC(r1)        # Load our own TOC pointer
-         ld      r1,0(r1)                # Revert stack frame
-         ld      0,16(r1)                # Reload lr
-         ld      29,-24(r1)              # Restore NVGPRS
-@@ -126,7 +157,11 @@ NS_InvokeByIndex:
-         mtlr    0
-         blr
- 
-+#if _CALL_ELF == 2
-+        .size   NS_InvokeByIndex,.-NS_InvokeByIndex
-+#else
-         .size   NS_InvokeByIndex,.-.NS_InvokeByIndex
-+#endif
- 
-         # Magic indicating no need for an executable stack
-         .section .note.GNU-stack, "", @progbits ; .previous
-Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp
-===================================================================
---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp
-+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp
-@@ -74,7 +74,9 @@ invoke_copy_to_stack(uint64_t* gpregs,
-                 fpregs[i]   = s->val.f; // if passed in registers, floats are promoted to doubles
-             } else {
-                 float *p = (float *)d;
-+#ifndef __LITTLE_ENDIAN__
-                 p++;
-+#endif
-                 *p = s->val.f;
-             }
-         }
-diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.S
-rename from xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s
-rename to xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.S
---- a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s
-+++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.S
-@@ -17,6 +17,27 @@
- .set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
- .set f30,30; .set f31,31
- 
-+#if _CALL_ELF == 2
-+#define STACK_PARAMS   96
-+#else
-+#define STACK_PARAMS   112
-+#endif
-+
-+#if _CALL_ELF == 2
-+        .section ".text"
-+        .type   SharedStub,@function
-+        .globl  SharedStub
-+        # Make the symbol hidden so that the branch from the stub does
-+        # not go via a PLT.  This is not only better for performance,
-+        # but may be necessary to avoid linker errors since there is
-+        # no place to restore the TOC register in a sibling call.
-+        .hidden SharedStub
-+        .align 2
-+SharedStub:
-+0:      addis 2,12,(.TOC.-0b)@ha
-+        addi 2,2,(.TOC.-0b)@l
-+        .localentry SharedStub,.-SharedStub
-+#else
-         .section ".text"
-         .align 2
-         .globl SharedStub
-@@ -29,6 +50,7 @@ SharedStub:
-         .type   SharedStub,@function
- 
- .SharedStub:
-+#endif
-         mflr    r0
- 
-         std     r4, -56(r1)                     # Save all GPRS
-@@ -55,7 +77,7 @@ SharedStub:
- 
-         subi    r6,r1,56                        # r6 --> gprData
-         subi    r7,r1,160                       # r7 --> fprData
--        addi    r5,r1,112                       # r5 --> extra stack args
-+        addi    r5,r1,STACK_PARAMS              # r5 --> extra stack args
- 
-         std     r0, 16(r1)
- 	
-@@ -75,7 +97,11 @@ SharedStub:
-         mtlr    r0
-         blr
- 
-+#if _CALL_ELF == 2
-+        .size   SharedStub,.-SharedStub
-+#else
-         .size   SharedStub,.-.SharedStub
-+#endif
- 
-         # Magic indicating no need for an executable stack
-         .section .note.GNU-stack, "", @progbits ; .previous
-Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp
-===================================================================
---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp
-+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp
-@@ -83,7 +83,9 @@ PrepareAndDispatch(nsXPTCStubBase* self,
-                 dp->val.f = (float) fprData[i]; // in registers floats are passed as doubles
-             else {
-                 float *p = (float *)ap;
-+#ifndef __LITTLE_ENDIAN__
-                 p++;
-+#endif
-                 dp->val.f = *p;
-             }
-         } else { /* integer type or pointer */
-@@ -153,6 +155,43 @@ PrepareAndDispatch(nsXPTCStubBase* self,
- // etc.
- // Use assembler directives to get the names right...
- 
-+#if _CALL_ELF == 2
-+# define STUB_ENTRY(n)                                                  \
-+__asm__ (                                                               \
-+        ".section \".text\" \n\t"                                       \
-+        ".align 2 \n\t"                                                 \
-+        ".if "#n" < 10 \n\t"                                            \
-+        ".globl _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t"                    \
-+        ".type  _ZN14nsXPTCStubBase5Stub"#n"Ev,@function \n\n"          \
-+"_ZN14nsXPTCStubBase5Stub"#n"Ev: \n\t"                                  \
-+        "0: addis 2,12,.TOC.-0b@ha \n\t"                                \
-+        "addi     2,2,.TOC.-0b@l \n\t"                                  \
-+        ".localentry _ZN14nsXPTCStubBase5Stub"#n"Ev,.-_ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \
-+                                                                        \
-+        ".elseif "#n" < 100 \n\t"                                       \
-+        ".globl _ZN14nsXPTCStubBase6Stub"#n"Ev \n\t"                    \
-+        ".type  _ZN14nsXPTCStubBase6Stub"#n"Ev,@function \n\n"          \
-+"_ZN14nsXPTCStubBase6Stub"#n"Ev: \n\t"                                  \
-+        "0: addis 2,12,.TOC.-0b@ha \n\t"                                \
-+        "addi     2,2,.TOC.-0b@l \n\t"                                  \
-+        ".localentry _ZN14nsXPTCStubBase6Stub"#n"Ev,.-_ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \
-+                                                                        \
-+        ".elseif "#n" < 1000 \n\t"                                      \
-+        ".globl _ZN14nsXPTCStubBase7Stub"#n"Ev \n\t"                    \
-+        ".type  _ZN14nsXPTCStubBase7Stub"#n"Ev,@function \n\n"          \
-+"_ZN14nsXPTCStubBase7Stub"#n"Ev: \n\t"                                  \
-+        "0: addis 2,12,.TOC.-0b@ha \n\t"                                \
-+        "addi     2,2,.TOC.-0b@l \n\t"                                  \
-+        ".localentry _ZN14nsXPTCStubBase7Stub"#n"Ev,.-_ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \
-+                                                                        \
-+        ".else  \n\t"                                                   \
-+        ".err   \"stub number "#n" >= 1000 not yet supported\"\n"       \
-+        ".endif \n\t"                                                   \
-+                                                                        \
-+        "li     11,"#n" \n\t"                                           \
-+        "b      SharedStub \n"                                          \
-+);
-+#else
- # define STUB_ENTRY(n)                                                  \
- __asm__ (                                                               \
-         ".section \".toc\",\"aw\" \n\t"                                 \
-@@ -195,6 +234,7 @@ __asm__ (
-         "li     11,"#n" \n\t"                                           \
-         "b      SharedStub \n"                                          \
- );
-+#endif
- 
- #define SENTINEL_ENTRY(n)                                               \
- nsresult nsXPTCStubBase::Sentinel##n()                                  \
--- a/mozilla-preferences.patch	Mon Apr 14 09:09:11 2014 +0200
+++ b/mozilla-preferences.patch	Thu Apr 17 23:33:07 2014 +0200
@@ -5,19 +5,19 @@
 package unconditionally.
 
 # HG changeset patch
-# Parent bf7f0353aa8e00b1deaa05b7cb84bb7ea4c9ce8f
+# Parent 5c086bb8e0fa4f1600aced485e6156b0cdcd1755
 
 diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js
 --- a/modules/libpref/src/init/all.js
 +++ b/modules/libpref/src/init/all.js
-@@ -1554,17 +1554,17 @@ pref("intl.charsetmenu.browser.more5",  
- pref("intl.charsetmenu.mailedit",           "chrome://global/locale/intl.properties");
+@@ -1428,17 +1428,17 @@ pref("intl.charsetmenu.mailedit",       
  pref("intl.charsetmenu.browser.cache",      "");
  pref("intl.charsetmenu.mailview.cache",     "");
  pref("intl.charsetmenu.composer.cache",     "");
  pref("intl.charsetmenu.browser.cache.size", 5);
  pref("intl.charset.detector",               "chrome://global/locale/intl.properties");
  pref("intl.charset.fallback.override",      "");
+ pref("intl.charset.fallback.tld",           true);
  pref("intl.ellipsis",                       "chrome://global-platform/locale/intl.properties");
 -pref("intl.locale.matchOS",                 false);
 +pref("intl.locale.matchOS",                 true);
--- a/mozilla-shared-nss-db.patch	Mon Apr 14 09:09:11 2014 +0200
+++ b/mozilla-shared-nss-db.patch	Thu Apr 17 23:33:07 2014 +0200
@@ -7,7 +7,7 @@
 diff --git a/configure.in b/configure.in
 --- a/configure.in
 +++ b/configure.in
-@@ -8113,16 +8113,31 @@ if test "$MOZ_ENABLE_SKIA"; then
+@@ -8069,16 +8069,31 @@ if test "$MOZ_ENABLE_SKIA"; then
      MOZ_ENABLE_SKIA_GPU=1
      AC_DEFINE(USE_SKIA_GPU)
      AC_SUBST(MOZ_ENABLE_SKIA_GPU)
@@ -79,7 +79,7 @@
  #include "nsCertVerificationThread.h"
  #include "nsAppDirectoryServiceDefs.h"
  #include "nsComponentManagerUtils.h"
-@@ -1117,17 +1124,31 @@ nsNSSComponent::InitializeNSS()
+@@ -1129,17 +1136,31 @@ nsNSSComponent::InitializeNSS()
    if (NS_FAILED(rv)) {
      nsPSMInitPanic::SetPanic();
      return NS_ERROR_NOT_AVAILABLE;
@@ -115,8 +115,8 @@
 diff --git a/toolkit/library/Makefile.in b/toolkit/library/Makefile.in
 --- a/toolkit/library/Makefile.in
 +++ b/toolkit/library/Makefile.in
-@@ -223,17 +223,17 @@ endif
- ifneq (,$(filter OS2 WINNT,$(OS_ARCH)))
+@@ -161,17 +161,17 @@ endif
+ ifneq (,$(filter WINNT,$(OS_ARCH)))
  SDK_LIBRARY = $(IMPORT_LIBRARY)
  else
  SDK_LIBRARY = $(SHARED_LIBRARY)
@@ -130,7 +130,7 @@
  ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
  CXXFLAGS += $(TK_CFLAGS)
  OS_LIBS += \
-   -framework SystemConfiguration \
-   -framework QTKit \
-   -framework IOKit \
-   -F$(MACOS_PRIVATE_FRAMEWORKS_DIR) -framework CoreUI \
+   $(TK_LIBS) \
+   $(NULL)
+ endif
+ 
--- a/series	Mon Apr 14 09:09:11 2014 +0200
+++ b/series	Thu Apr 17 23:33:07 2014 +0200
@@ -16,16 +16,6 @@
 mozilla-idldir.patch
 mozilla-libproxy-compat.patch
 #mozilla-ppc64le-build.patch
-mozilla-ppc64le-javascript.patch
-mozilla-ppc64le-libffi.patch
-mozilla-ppc64le-mfbt.patch
-mozilla-ppc64le-webrtc.patch
-mozilla-ppc64le-xpcom.patch
-mozilla-ppc64-xpcom.patch
-mozilla-aarch64-bmo-963024.patch
-mozilla-aarch64-bmo-963023.patch
-mozilla-aarch64-bmo-963027.patch
-mozilla-aarch64-bmo-962488.patch
 mozilla-aarch64-bmo-810631.patch
 
 # Firefox patches