aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Hill <rhill@gentoo.org>2013-04-28 02:55:49 +0000
committerRyan Hill <rhill@gentoo.org>2013-04-28 02:55:49 +0000
commit31572da7e871c50ff27144e98d75b5108c6e8320 (patch)
tree96da9aab65e954d52a00a8e2c8f7db896425e535 /4.7.3/gentoo
parentRelease 4.6.4 p1.0 (diff)
downloadgcc-patches-31572da7e871c50ff27144e98d75b5108c6e8320.tar.gz
gcc-patches-31572da7e871c50ff27144e98d75b5108c6e8320.tar.bz2
gcc-patches-31572da7e871c50ff27144e98d75b5108c6e8320.zip
In-progress patchset for 4.7.3 based on latest 4.7.2 patchset.
Diffstat (limited to '4.7.3/gentoo')
-rw-r--r--4.7.3/gentoo/10_all_default-fortify-source.patch29
-rw-r--r--4.7.3/gentoo/11_all_default-warn-format-security.patch49
-rw-r--r--4.7.3/gentoo/12_all_default-warn-trampolines.patch24
-rw-r--r--4.7.3/gentoo/15_all_libgfortran-Werror.patch16
-rw-r--r--4.7.3/gentoo/15_all_libgomp-Werror.patch16
-rw-r--r--4.7.3/gentoo/16_all_libgo-Werror-pr53679.patch16
-rw-r--r--4.7.3/gentoo/18_all_libgcc-cross-canadian.patch55
-rw-r--r--4.7.3/gentoo/25_all_alpha-mieee-default.patch31
-rw-r--r--4.7.3/gentoo/26_all_alpha-asm-mcpu.patch16
-rw-r--r--4.7.3/gentoo/29_all_arm_armv4t-default.patch16
-rw-r--r--4.7.3/gentoo/30_all_arm_armv4-no-thumb-fix-link.patch54
-rw-r--r--4.7.3/gentoo/33_all_armhf.patch43
-rw-r--r--4.7.3/gentoo/34_all_ia64_note.GNU-stack.patch92
-rw-r--r--4.7.3/gentoo/38_all_sh_pr24836_all-archs.patch27
-rw-r--r--4.7.3/gentoo/39_all_gfortran-sysroot-pr54725.patch62
-rw-r--r--4.7.3/gentoo/42_all_superh_default-multilib.patch24
-rw-r--r--4.7.3/gentoo/48_all_x86_pr53113_libitm-avx.patch28
-rw-r--r--4.7.3/gentoo/49_all_x86_pr52695_libitm-m64.patch24
-rw-r--r--4.7.3/gentoo/50_all_libiberty-asprintf.patch18
-rw-r--r--4.7.3/gentoo/51_all_libiberty-pic.patch10
-rw-r--r--4.7.3/gentoo/52_all_netbsd-Bsymbolic.patch12
-rw-r--r--4.7.3/gentoo/67_all_gcc-poison-system-directories.patch209
-rw-r--r--4.7.3/gentoo/74_all_gcc47_cloog-dl.patch524
-rw-r--r--4.7.3/gentoo/82_all_alpha_4.6.4_pr56023_bootstrap.patch56
-rw-r--r--4.7.3/gentoo/90_all_gcc-4.7-x32.patch2902
-rw-r--r--4.7.3/gentoo/92_all_freebsd-pie.patch71
-rw-r--r--4.7.3/gentoo/93_all_pr33763_4.7.3_extern-inline.patch86
-rw-r--r--4.7.3/gentoo/94_all_pr53708_4.7.3_user-alignment.patch22
-rw-r--r--4.7.3/gentoo/95_all_pr55940_4.7.3_x86-stack-parameters.patch93
-rw-r--r--4.7.3/gentoo/96_all_pr56125_4.7.3_ffast-math-pow.patch111
-rw-r--r--4.7.3/gentoo/README.history31
31 files changed, 4767 insertions, 0 deletions
diff --git a/4.7.3/gentoo/10_all_default-fortify-source.patch b/4.7.3/gentoo/10_all_default-fortify-source.patch
new file mode 100644
index 0000000..0dc41ae
--- /dev/null
+++ b/4.7.3/gentoo/10_all_default-fortify-source.patch
@@ -0,0 +1,29 @@
+Enable -D_FORTIFY_SOURCE=2 by default.
+
+
+--- a/gcc/c-family/c-cppbuiltin.c
++++ b/gcc/c-family/c-cppbuiltin.c
+@@ -854,6 +854,9 @@ c_cpp_builtins (cpp_reader *pfile)
+ builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
+ builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
+
++ /* Fortify Source enabled by default w/optimization. */
++ cpp_define (pfile, "_FORTIFY_SOURCE=((defined __OPTIMIZE__ && __OPTIMIZE__ > 0) ? 2 : 0)");
++
+ /* Misc. */
+ if (flag_gnu89_inline)
+ cpp_define (pfile, "__GNUC_GNU_INLINE__");
+--- a/gcc/doc/gcc.info
++++ b/gcc/doc/gcc.info
+@@ -5786,6 +5786,11 @@ find out the exact set of optimizations that are enabled at each level.
+ Please note the warning under `-fgcse' about invoking `-O2' on
+ programs that use computed gotos.
+
++ NOTE: In Gentoo, `-D_FORTIFY_SOURCE=2' is set by default, and is
++ activated when `-O' is set to 2 or higher. This enables additional
++ compile-time and run-time checks for several libc functions. To disable,
++ specify either `-U_FORTIFY_SOURCE' or `-D_FORTIFY_SOURCE=0'.
++
+ `-O3'
+ Optimize yet more. `-O3' turns on all optimizations specified by
+ `-O2' and also turns on the `-finline-functions',
diff --git a/4.7.3/gentoo/11_all_default-warn-format-security.patch b/4.7.3/gentoo/11_all_default-warn-format-security.patch
new file mode 100644
index 0000000..0f97269
--- /dev/null
+++ b/4.7.3/gentoo/11_all_default-warn-format-security.patch
@@ -0,0 +1,49 @@
+Enable -Wformat and -Wformat-security by default.
+
+
+--- a/gcc/c-family/c-common.c
++++ b/gcc/c-family/c-common.c
+@@ -202,7 +202,7 @@ int warn_unknown_pragmas; /* Tri state variable. */
+ /* Warn about format/argument anomalies in calls to formatted I/O functions
+ (*printf, *scanf, strftime, strfmon, etc.). */
+
+-int warn_format;
++int warn_format = 1;
+
+ /* C/ObjC language option variables. */
+
+--- a/gcc/c-family/c.opt
++++ b/gcc/c-family/c.opt
+@@ -392,7 +392,7 @@ C ObjC C++ ObjC++ Var(warn_format_contains_nul) Warning
+ Warn about format strings that contain NUL bytes
+
+ Wformat-security
+-C ObjC C++ ObjC++ Var(warn_format_security) Warning
++C ObjC C++ ObjC++ Var(warn_format_security) Init(1) Warning
+ Warn about possible security problems with format functions
+
+ Wformat-y2k
+--- a/gcc/doc/gcc.info
++++ b/gcc/doc/gcc.info
+@@ -3237,6 +3237,9 @@ option was used.
+ `-Wformat-nonliteral', `-Wformat-security', and `-Wformat=2' are
+ available, but are not included in `-Wall'.
+
++ In Gentoo this option is enabled by default for C, C++, ObjC, ObjC++.
++ To disable, use `-Wformat=0'.
++
+ `-Wformat-y2k'
+ If `-Wformat' is specified, also warn about `strftime' formats
+ that may yield only a two-digit year.
+@@ -3279,6 +3282,11 @@ option was used.
+ about, but in future warnings may be added to `-Wformat-security'
+ that are not included in `-Wformat-nonliteral'.)
+
++ In Gentoo this option is enabled by default for C, C++, ObjC, ObjC++.
++ To disable, use `-Wno-format-security', or disable all format warnings
++ with `-Wformat=0'. To make format security warnings fatal, specify
++ `-Werror=format-security'.
++
+ `-Wformat=2'
+ Enable `-Wformat' plus format checks not included in `-Wformat'.
+ Currently equivalent to `-Wformat -Wformat-nonliteral
diff --git a/4.7.3/gentoo/12_all_default-warn-trampolines.patch b/4.7.3/gentoo/12_all_default-warn-trampolines.patch
new file mode 100644
index 0000000..4b26aec
--- /dev/null
+++ b/4.7.3/gentoo/12_all_default-warn-trampolines.patch
@@ -0,0 +1,24 @@
+Enable -Wtrampolines by default.
+
+--- a/gcc/common.opt
++++ b/gcc/common.opt
+@@ -639,7 +639,7 @@ Common Var(warn_system_headers) Warning
+ Do not suppress warnings from system headers
+
+ Wtrampolines
+-Common Var(warn_trampolines) Warning
++Common Var(warn_trampolines) Init(1) Warning
+ Warn whenever a trampoline is generated
+
+ Wtype-limits
+--- a/gcc/doc/invoke.texi
++++ b/gcc/doc/invoke.texi
+@@ -3878,6 +3878,8 @@ headers---for that, @option{-Wunknown-pragmas} must also be used.
+ for most targets, it is made up of code and thus requires the stack
+ to be made executable in order for the program to work properly.
+
++ This warning is enabled by default in Gentoo.
++
+ @item -Wfloat-equal
+ @opindex Wfloat-equal
+ @opindex Wno-float-equal
diff --git a/4.7.3/gentoo/15_all_libgfortran-Werror.patch b/4.7.3/gentoo/15_all_libgfortran-Werror.patch
new file mode 100644
index 0000000..31fca6d
--- /dev/null
+++ b/4.7.3/gentoo/15_all_libgfortran-Werror.patch
@@ -0,0 +1,16 @@
+libgfortran does not respect --disable-werror
+
+https://bugs.gentoo.org/433435
+http://gcc.gnu.org/PR54724
+
+--- a/libgfortran/configure
++++ b/libgfortran/configure
+@@ -5551,7 +5551,7 @@ fi
+
+ # Add -Wall -fno-repack-arrays -fno-underscoring if we are using GCC.
+ if test "x$GCC" = "xyes"; then
+- AM_FCFLAGS="-I . -Wall -Werror -fimplicit-none -fno-repack-arrays -fno-underscoring"
++ AM_FCFLAGS="-I . -Wall -fimplicit-none -fno-repack-arrays -fno-underscoring"
+ ## We like to use C99 routines when available. This makes sure that
+ ## __STDC_VERSION__ is set such that libc includes make them available.
+ AM_CFLAGS="-std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wextra -Wwrite-strings"
diff --git a/4.7.3/gentoo/15_all_libgomp-Werror.patch b/4.7.3/gentoo/15_all_libgomp-Werror.patch
new file mode 100644
index 0000000..3456e8a
--- /dev/null
+++ b/4.7.3/gentoo/15_all_libgomp-Werror.patch
@@ -0,0 +1,16 @@
+libgomp does not respect --disable-werror
+
+https://bugs.gentoo.org/229059
+http://gcc.gnu.org/PR38436
+
+--- a/libgomp/configure
++++ b/libgomp/configure
+@@ -4284,7 +4284,7 @@ save_CFLAGS="$CFLAGS"
+
+ # Add -Wall -Werror if we are using GCC.
+ if test "x$GCC" = "xyes"; then
+- XCFLAGS="$XCFLAGS -Wall -Werror"
++ XCFLAGS="$XCFLAGS -Wall"
+ fi
+
+ # Find other programs we need.
diff --git a/4.7.3/gentoo/16_all_libgo-Werror-pr53679.patch b/4.7.3/gentoo/16_all_libgo-Werror-pr53679.patch
new file mode 100644
index 0000000..3c1ece3
--- /dev/null
+++ b/4.7.3/gentoo/16_all_libgo-Werror-pr53679.patch
@@ -0,0 +1,16 @@
+libgo does not respect --disable-werror
+
+https://bugs.gentoo.org/423153
+http://gcc.gnu.org/PR53679
+
+--- a/libgo/configure
++++ b/libgo/configure
+@@ -13384,7 +13384,7 @@ done
+ WARN_FLAGS='-Wall -Wextra -Wwrite-strings -Wcast-qual'
+
+
+-WERROR="-Werror"
++WERROR=""
+
+
+ glibgo_toolexecdir=no
diff --git a/4.7.3/gentoo/18_all_libgcc-cross-canadian.patch b/4.7.3/gentoo/18_all_libgcc-cross-canadian.patch
new file mode 100644
index 0000000..70a52d1
--- /dev/null
+++ b/4.7.3/gentoo/18_all_libgcc-cross-canadian.patch
@@ -0,0 +1,55 @@
+fix canadian cross compiler builds where libgcc would get installed into the
+version of the compiler we using to build instead of the version we're building.
+
+From d2c6da38e9a897ded013ef69caf57db588605e9f Mon Sep 17 00:00:00 2001
+From: ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Fri, 3 Aug 2012 23:42:20 +0000
+Subject: [PATCH] * Makefile.in (version): set to BASE-VER file from gcc
+ directory.
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190136 138bc75d-0d04-0410-961f-82ee72b054a4
+---
+ libgcc/ChangeLog | 4 ++++
+ libgcc/Makefile.in | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+2012-08-03 Jonathan Yong <jon_y@users.sourceforge.net>
+
+ * Makefile.in (version): set to BASE-VER file from gcc directory.
+
+From 464810a0437a11a7c054bff9eecfecbadf6b9559 Mon Sep 17 00:00:00 2001
+From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Sat, 4 Aug 2012 05:33:27 +0000
+Subject: [PATCH] Replace top_srcdir with srcdir
+
+ PR driver/54171
+ * Makefile.in (version): Replace top_srcdir with srcdir.
+
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190140 138bc75d-0d04-0410-961f-82ee72b054a4
+---
+ libgcc/ChangeLog | 5 +++++
+ libgcc/Makefile.in | 2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+2012-08-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR driver/54171
+ * Makefile.in (version): Replace top_srcdir with srcdir.
+
+diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
+index 22af1b4..fb7f9bd 100644
+--- a/libgcc/Makefile.in
++++ b/libgcc/Makefile.in
+@@ -207,7 +207,7 @@ export slibdir
+ export toolexecdir
+ export toolexeclibdir
+
+-version := $(shell $(CC) -dumpversion)
++version := $(shell cat $(srcdir)/../gcc/BASE-VER)
+
+ ifeq ($(decimal_float),yes)
+ ifeq ($(enable_decimal_float),bid)
+--
+1.8.2.1
+
diff --git a/4.7.3/gentoo/25_all_alpha-mieee-default.patch b/4.7.3/gentoo/25_all_alpha-mieee-default.patch
new file mode 100644
index 0000000..9f99434
--- /dev/null
+++ b/4.7.3/gentoo/25_all_alpha-mieee-default.patch
@@ -0,0 +1,31 @@
+Set the default behavior on alpha to use -mieee since the large majority of
+time we want this (bad/weird things can happen with packages built without
+it).
+
+To satisfy those people who may not want -mieee forced on them all the time,
+we also provide -mno-ieee.
+
+Patch by Mike Frysinger <vapier@gentoo.org>
+
+--- a/gcc/config/alpha/alpha.h
++++ b/gcc/config/alpha/alpha.h
+@@ -96,6 +96,8 @@ along with GCC; see the file COPYING3. If not see
+ while (0)
+ #endif
+
++#define CPP_SPEC "%{!no-ieee:-mieee}"
++
+ /* Run-time compilation parameters selecting different hardware subsets. */
+
+ /* Which processor to schedule for. The cpu attribute defines a list that
+--- a/gcc/config/alpha/alpha.opt
++++ b/gcc/config/alpha/alpha.opt
+@@ -39,7 +39,7 @@ Target RejectNegative Mask(IEEE_CONFORMANT)
+ Request IEEE-conformant math library routines (OSF/1)
+
+ mieee
+-Target Report RejectNegative Mask(IEEE)
++Target Report Mask(IEEE)
+ Emit IEEE-conformant code, without inexact exceptions
+
+ mieee-with-inexact
diff --git a/4.7.3/gentoo/26_all_alpha-asm-mcpu.patch b/4.7.3/gentoo/26_all_alpha-asm-mcpu.patch
new file mode 100644
index 0000000..593431c
--- /dev/null
+++ b/4.7.3/gentoo/26_all_alpha-asm-mcpu.patch
@@ -0,0 +1,16 @@
+https://bugs.gentoo.org/170146
+http://gcc.gnu.org/ml/gcc-patches/2009-11/msg00403.html
+
+alpha: turn -mcpu=<cpu> into -m<cpu> for assembler all the time
+
+--- a/gcc/config/alpha/elf.h
++++ b/gcc/config/alpha/elf.h
+@@ -46,7 +46,7 @@ along with GCC; see the file COPYING3. If not see
+ #define CC1_SPEC "%{G*}"
+
+ #undef ASM_SPEC
+-#define ASM_SPEC "%{G*} %{relax:-relax} %{!gstabs*:-no-mdebug}%{gstabs*:-mdebug}"
++#define ASM_SPEC "%{G*} %{relax:-relax} %{!gstabs*:-no-mdebug}%{gstabs*:-mdebug} %{mcpu=*:-m%*}"
+
+ #undef IDENT_ASM_OP
+ #define IDENT_ASM_OP "\t.ident\t"
diff --git a/4.7.3/gentoo/29_all_arm_armv4t-default.patch b/4.7.3/gentoo/29_all_arm_armv4t-default.patch
new file mode 100644
index 0000000..4616cf9
--- /dev/null
+++ b/4.7.3/gentoo/29_all_arm_armv4t-default.patch
@@ -0,0 +1,16 @@
+gcc defaults to armv5t for all targets even armv4t
+
+http://sourceware.org/ml/crossgcc/2008-05/msg00009.html
+
+
+--- a/gcc/config/arm/linux-eabi.h
++++ b/gcc/config/arm/linux-eabi.h
+@@ -45,7 +45,7 @@
+ The ARM10TDMI core is the default for armv5t, so set
+ SUBTARGET_CPU_DEFAULT to achieve this. */
+ #undef SUBTARGET_CPU_DEFAULT
+-#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm10tdmi
++#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9tdmi
+
+ /* TARGET_BIG_ENDIAN_DEFAULT is set in
+ config.gcc for big endian configurations. */
diff --git a/4.7.3/gentoo/30_all_arm_armv4-no-thumb-fix-link.patch b/4.7.3/gentoo/30_all_arm_armv4-no-thumb-fix-link.patch
new file mode 100644
index 0000000..3cbd216
--- /dev/null
+++ b/4.7.3/gentoo/30_all_arm_armv4-no-thumb-fix-link.patch
@@ -0,0 +1,54 @@
+From 73aa8c34427a4282930ca8667165d844ee698859 Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Fri, 19 Apr 2013 16:32:28 -0400
+Subject: [PATCH] gcc: arm: linux-eabi: fix handling of armv4 bx fixups when
+ linking
+
+The bpabi.h header already sets up defines to automatically use the
+--fix-v4bx flag with the assembler & linker as needed, and creates a
+default assembly & linker spec which uses those. Unfortunately, the
+linux-eabi.h header clobbers the LINK_SPEC define and doesn't include
+the v4bx define when setting up its own. So while the assembler spec
+is retained and works fine to generate the right relocs, building for
+armv4 targets doesn't invoke the linker correctly so all the relocs
+get processed as if we had an armv4t target.
+
+You can see this with -dumpspecs when configuring gcc for an armv4
+target and using --with-arch=armv4:
+$ armv4l-unknown-linux-gnueabi-gcc -dumpspecs |& grep -B 1 fix-v4bx
+*subtarget_extra_asm_spec:
+.... %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx} ...
+
+With this fix in place, we also get the link spec:
+$ armv4l-unknown-linux-gnueabi-gcc -dumpspecs |& grep -B 1 fix-v4bx
+*link:
+... %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx} ...
+
+And all my hello world tests / glibc builds automatically turn the
+bx insn into the 'mov pc, lr' insn and all is right in the world.
+
+Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+
+2013-04-19 Mike Frysinger <vapier@gentoo.org>
+
+ * config/arm/linux-eabi.h (LINK_SPEC): Add TARGET_FIX_V4BX_SPEC.
+---
+ gcc/config/arm/linux-eabi.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
+index 4a425c8..8b7ebb2 100644
+--- a/gcc/config/arm/linux-eabi.h
++++ b/gcc/config/arm/linux-eabi.h
+@@ -80,7 +80,7 @@
+ /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to
+ use the GNU/Linux version, not the generic BPABI version. */
+ #undef LINK_SPEC
+-#define LINK_SPEC BE8_LINK_SPEC \
++#define LINK_SPEC TARGET_FIX_V4BX_SPEC BE8_LINK_SPEC \
+ LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \
+ LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
+
+--
+1.8.2.1
+
diff --git a/4.7.3/gentoo/33_all_armhf.patch b/4.7.3/gentoo/33_all_armhf.patch
new file mode 100644
index 0000000..492d689
--- /dev/null
+++ b/4.7.3/gentoo/33_all_armhf.patch
@@ -0,0 +1,43 @@
+use new common path to the arm hard float linker
+
+change taken from upstream gcc
+
+--- a/gcc/config/arm/linux-eabi.h
++++ b/gcc/config/arm/linux-eabi.h
+@@ -32,7 +32,8 @@
+ while (false)
+
+ /* We default to a soft-float ABI so that binaries can run on all
+- target hardware. */
++ target hardware. If you override this to use the hard-float ABI then
++ change the setting of GLIBC_DYNAMIC_LINKER_DEFAULT as well. */
+ #undef TARGET_DEFAULT_FLOAT_ABI
+ #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
+
+@@ -59,10 +60,23 @@
+ #undef SUBTARGET_EXTRA_LINK_SPEC
+ #define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION
+
+-/* Use ld-linux.so.3 so that it will be possible to run "classic"
+- GNU/Linux binaries on an EABI system. */
++/* GNU/Linux on ARM currently supports three dynamic linkers:
++ - ld-linux.so.2 - for the legacy ABI
++ - ld-linux.so.3 - for the EABI-derived soft-float ABI
++ - ld-linux-armhf.so.3 - for the EABI-derived hard-float ABI.
++ All the dynamic linkers live in /lib.
++ We default to soft-float, but this can be overridden by changing both
++ GLIBC_DYNAMIC_LINKER_DEFAULT and TARGET_DEFAULT_FLOAT_ABI. */
++
+ #undef GLIBC_DYNAMIC_LINKER
+-#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.3"
++#define GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "/lib/ld-linux.so.3"
++#define GLIBC_DYNAMIC_LINKER_HARD_FLOAT "/lib/ld-linux-armhf.so.3"
++#define GLIBC_DYNAMIC_LINKER_DEFAULT GLIBC_DYNAMIC_LINKER_SOFT_FLOAT
++
++#define GLIBC_DYNAMIC_LINKER \
++ "%{mfloat-abi=hard:" GLIBC_DYNAMIC_LINKER_HARD_FLOAT "} \
++ %{mfloat-abi=soft*:" GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "} \
++ %{!mfloat-abi=*:" GLIBC_DYNAMIC_LINKER_DEFAULT "}"
+
+ /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to
+ use the GNU/Linux version, not the generic BPABI version. */
diff --git a/4.7.3/gentoo/34_all_ia64_note.GNU-stack.patch b/4.7.3/gentoo/34_all_ia64_note.GNU-stack.patch
new file mode 100644
index 0000000..219fe9f
--- /dev/null
+++ b/4.7.3/gentoo/34_all_ia64_note.GNU-stack.patch
@@ -0,0 +1,92 @@
+http://gcc.gnu.org/PR21098
+
+
+2004-09-20 Jakub Jelinek <jakub@redhat.com>
+
+ * config/rs6000/ppc-asm.h: Add .note.GNU-stack section also
+ on ppc64-linux.
+
+ * config/ia64/lib1funcs.asm: Add .note.GNU-stack section on
+ ia64-linux.
+ * config/ia64/crtbegin.asm: Likewise.
+ * config/ia64/crtend.asm: Likewise.
+ * config/ia64/crti.asm: Likewise.
+ * config/ia64/crtn.asm: Likewise.
+
+2004-05-14 Jakub Jelinek <jakub@redhat.com>
+
+ * config/ia64/linux.h (TARGET_ASM_FILE_END): Define.
+
+
+--- a/gcc/config/ia64/linux.h
++++ b/gcc/config/ia64/linux.h
+@@ -24,6 +24,8 @@ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
++#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
++
+ /* This is for -profile to use -lc_p instead of -lc. */
+ #undef CC1_SPEC
+ #define CC1_SPEC "%{profile:-p} %{G*}"
+--- a/gcc/config/rs6000/ppc-asm.h
++++ b/gcc/config/rs6000/ppc-asm.h
+@@ -352,7 +352,7 @@ GLUE(.L,name): \
+ #endif
+ #endif
+
+-#if defined __linux__ && !defined __powerpc64__
++#if defined __linux__
+ .section .note.GNU-stack
+ .previous
+ #endif
+--- a/libgcc/config/ia64/crtbegin.S
++++ b/libgcc/config/ia64/crtbegin.S
+@@ -252,3 +252,7 @@ __do_jv_register_classes:
+ .weak __cxa_finalize
+ #endif
+ .weak _Jv_RegisterClasses
++
++#ifdef __linux__
++.section .note.GNU-stack; .previous
++#endif
+--- a/libgcc/config/ia64/crtend.S
++++ b/libgcc/config/ia64/crtend.S
+@@ -119,3 +119,6 @@ __do_global_ctors_aux:
+
+ br.ret.sptk.many rp
+ .endp __do_global_ctors_aux
++#ifdef __linux__
++.section .note.GNU-stack; .previous
++#endif
+--- a/libgcc/config/ia64/crti.S
++++ b/libgcc/config/ia64/crti.S
+@@ -49,5 +49,8 @@ _fini:
+ .save rp, r33
+ mov r33 = b0
+ .body
++#ifdef __linux__
++.section .note.GNU-stack; .previous
++#endif
+
+ # end of crti.S
+--- a/libgcc/config/ia64/crtn.S
++++ b/libgcc/config/ia64/crtn.S
+@@ -39,5 +39,8 @@
+ .restore sp
+ mov r12 = r35
+ br.ret.sptk.many b0
++#ifdef __linux__
++.section .note.GNU-stack; .previous
++#endif
+
+ # end of crtn.S
+--- a/libgcc/config/ia64/lib1funcs.S
++++ b/libgcc/config/ia64/lib1funcs.S
+@@ -793,3 +793,6 @@ __floattitf:
+ .endp __floattitf
+ #endif
+ #endif
++#ifdef __linux__
++.section .note.GNU-stack; .previous
++#endif
diff --git a/4.7.3/gentoo/38_all_sh_pr24836_all-archs.patch b/4.7.3/gentoo/38_all_sh_pr24836_all-archs.patch
new file mode 100644
index 0000000..06fd90a
--- /dev/null
+++ b/4.7.3/gentoo/38_all_sh_pr24836_all-archs.patch
@@ -0,0 +1,27 @@
+gcc/configure doesn't handle all possible SH architectures
+
+http://gcc.gnu.org/PR24836
+
+
+--- a/gcc/configure
++++ b/gcc/configure
+@@ -22753,7 +22753,7 @@ foo: .long 25
+ tls_first_minor=14
+ tls_as_opt="-m64 -Aesame --fatal-warnings"
+ ;;
+- sh-*-* | sh[34]-*-*)
++ sh-*-* | sh[34]*-*-*)
+ conftest_s='
+ .section ".tdata","awT",@progbits
+ foo: .long 25
+--- a/gcc/configure.ac
++++ b/gcc/configure.ac
+@@ -2924,7 +2924,7 @@ foo: .long 25
+ tls_first_minor=14
+ tls_as_opt="-m64 -Aesame --fatal-warnings"
+ ;;
+- sh-*-* | sh[34]-*-*)
++ sh-*-* | sh[34]*-*-*)
+ conftest_s='
+ .section ".tdata","awT",@progbits
+ foo: .long 25
diff --git a/4.7.3/gentoo/39_all_gfortran-sysroot-pr54725.patch b/4.7.3/gentoo/39_all_gfortran-sysroot-pr54725.patch
new file mode 100644
index 0000000..4645849
--- /dev/null
+++ b/4.7.3/gentoo/39_all_gfortran-sysroot-pr54725.patch
@@ -0,0 +1,62 @@
+https://bugs.gentoo.org/433435
+http://gcc.gnu.org/PR54725
+http://gcc.gnu.org/viewcvs?view=revision&revision=192650
+
+make sure gfortran respects the sysroot
+
+gcc/
+2012-10-21 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/54725
+ * Makefile.in (TARGET_SYSTEM_ROOT_DEFINE): New.
+
+gcc/fortran
+2012-10-21 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/54725
+ * Make-lang.in (CFLAGS-cpp.o): Use TARGET_SYSTEM_ROOT_DEFINE.
+ * cpp.o (gfc_cpp_init_options): Use it for
+ setting gfc_cpp_option.sysroot.
+
+--- trunk/gcc/Makefile.in 2012/10/21 10:32:02 192649
++++ trunk/gcc/Makefile.in 2012/10/21 10:51:26 192650
+@@ -468,6 +468,7 @@
+ # Directory for prefix to system directories, for
+ # each of $(system_prefix)/usr/include, $(system_prefix)/usr/lib, etc.
+ TARGET_SYSTEM_ROOT = @TARGET_SYSTEM_ROOT@
++TARGET_SYSTEM_ROOT_DEFINE = @TARGET_SYSTEM_ROOT_DEFINE@
+
+ xmake_file=@xmake_file@
+ tmake_file=@tmake_file@
+--- trunk/gcc/fortran/Make-lang.in 2012/10/21 10:32:02 192649
++++ trunk/gcc/fortran/Make-lang.in 2012/10/21 10:51:26 192650
+@@ -341,6 +341,7 @@
+ $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(TM_H) coretypes.h $(GGC_H) \
+ fortran/iso-c-binding.def fortran/iso-fortran-env.def
+
++CFLAGS-fortran/cpp.o += $(TARGET_SYSTEM_ROOT_DEFINE)
+ fortran/f95-lang.o: $(GFORTRAN_TRANS_DEPS) fortran/mathbuiltins.def \
+ gt-fortran-f95-lang.h gtype-fortran.h $(CGRAPH_H) $(TARGET_H) fortran/cpp.h \
+ $(BUILTINS_DEF) fortran/types.def \
+--- trunk/gcc/fortran/cpp.c 2012/10/21 10:32:02 192649
++++ trunk/gcc/fortran/cpp.c 2012/10/21 10:51:26 192650
+@@ -38,6 +38,10 @@
+ #include "cppbuiltin.h"
+ #include "mkdeps.h"
+
++#ifndef TARGET_SYSTEM_ROOT
++# define TARGET_SYSTEM_ROOT NULL
++#endif
++
+ #ifndef TARGET_CPU_CPP_BUILTINS
+ # define TARGET_CPU_CPP_BUILTINS()
+ #endif
+@@ -267,7 +271,7 @@
+
+ gfc_cpp_option.multilib = NULL;
+ gfc_cpp_option.prefix = NULL;
+- gfc_cpp_option.sysroot = NULL;
++ gfc_cpp_option.sysroot = TARGET_SYSTEM_ROOT;
+
+ gfc_cpp_option.deferred_opt = XNEWVEC (gfc_cpp_deferred_opt_t,
+ decoded_options_count);
diff --git a/4.7.3/gentoo/42_all_superh_default-multilib.patch b/4.7.3/gentoo/42_all_superh_default-multilib.patch
new file mode 100644
index 0000000..8b638d9
--- /dev/null
+++ b/4.7.3/gentoo/42_all_superh_default-multilib.patch
@@ -0,0 +1,24 @@
+The gcc-3.x toolchains would contain all the targets by default. With gcc-4,
+you have to actually list out the multilibs you want or you will end up with
+just one when using targets like 'sh4-linux-gnu'.
+
+The resulting toolchain can't even build a kernel as the kernel needs to build
+with the nofpu flag to be sure that no fpu ops are generated.
+
+Here we restore the gcc-3.x behavior; the additional overhead of building all
+of these multilibs by default is negligible.
+
+https://bugs.gentoo.org/140205
+https://bugs.gentoo.org/320251
+
+--- a/gcc/config.gcc
++++ b/gcc/config.gcc
+@@ -2455,7 +2455,7 @@ sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \
+ if test "$sh_multilibs" = "default" ; then
+ case ${target} in
+ sh64-superh-linux* | \
+- sh[1234]*) sh_multilibs=${sh_cpu_target} ;;
++ sh[1234]*) sh_multilibs=$(echo $(sed -n '/^[[:space:]]*case ${sh_multilib} in/,/)/{s:case ${sh_multilib} in::;s: | *:,:g;s:[\\)]::g;p}' ${srcdir}/config.gcc) | sed 's: ::g') ;;
+ sh64* | sh5*) sh_multilibs=m5-32media,m5-32media-nofpu,m5-compact,m5-compact-nofpu,m5-64media,m5-64media-nofpu ;;
+ sh-superh-*) sh_multilibs=m4,m4-single,m4-single-only,m4-nofpu ;;
+ sh*-*-linux*) sh_multilibs=m1,m3e,m4 ;;
diff --git a/4.7.3/gentoo/48_all_x86_pr53113_libitm-avx.patch b/4.7.3/gentoo/48_all_x86_pr53113_libitm-avx.patch
new file mode 100644
index 0000000..b176530
--- /dev/null
+++ b/4.7.3/gentoo/48_all_x86_pr53113_libitm-avx.patch
@@ -0,0 +1,28 @@
+libitm checks for AVX support in the assembler and adds -mavx to x86_avx.cc
+which defines the needed typedefs. User CFLAGS can override -mavx however,
+so also use the fallback typedef if __AVX__ isn't defined.
+
+https://bugs.gentoo.org/417271
+http://gcc.gnu.org/PR53113
+
+
+--- a/libitm/config/x86/x86_avx.cc
++++ b/libitm/config/x86/x86_avx.cc
+@@ -29,7 +29,7 @@
+
+ extern "C" {
+
+-#ifndef HAVE_AS_AVX
++#if !defined (HAVE_AS_AVX) || !defined(__AVX__)
+ // If we don't have an AVX capable assembler, we didn't set -mavx on the
+ // command-line either, which means that libitm.h defined neither this type
+ // nor the functions in this file. Define the type and unconditionally
+@@ -40,7 +40,7 @@ typedef float _ITM_TYPE_M256 __attribute__((vector_size(32), may_alias));
+ // Re-define the memcpy implementations so that we can frob the
+ // interface to deal with possibly missing AVX instruction set support.
+
+-#ifdef HAVE_AS_AVX
++#if defined(HAVE_AS_AVX) && defined(__AVX__)
+ #define RETURN(X) return X
+ #define STORE(X,Y) X = Y
+ #define OUTPUT(T) _ITM_TYPE_##T
diff --git a/4.7.3/gentoo/49_all_x86_pr52695_libitm-m64.patch b/4.7.3/gentoo/49_all_x86_pr52695_libitm-m64.patch
new file mode 100644
index 0000000..e1eb2e6
--- /dev/null
+++ b/4.7.3/gentoo/49_all_x86_pr52695_libitm-m64.patch
@@ -0,0 +1,24 @@
+http://gcc.gnu.org/PR52695
+https://bugs.gentoo.org/421305
+
+fix building on x86 systems
+
+--- a/libitm/config/x86/target.h
++++ b/libitm/config/x86/target.h
+@@ -69,16 +69,4 @@
+ } // namespace GTM
+
+ // We'll be using some of the cpu builtins, and their associated types.
+-#ifndef __cplusplus
+-/* ??? It's broken for C++. */
+ #include <x86intrin.h>
+-#else
+-# ifdef __SSE2__
+-# include <emmintrin.h>
+-# elif defined(__SSE__)
+-# include <xmmintrin.h>
+-# endif
+-# ifdef __AVX__
+-# include <immintrin.h>
+-# endif
+-#endif
diff --git a/4.7.3/gentoo/50_all_libiberty-asprintf.patch b/4.7.3/gentoo/50_all_libiberty-asprintf.patch
new file mode 100644
index 0000000..9ad4a92
--- /dev/null
+++ b/4.7.3/gentoo/50_all_libiberty-asprintf.patch
@@ -0,0 +1,18 @@
+2008-07-25 Magnus Granberg <zorry@ume.nu>
+
+ * include/libiberty.h (asprintf): Don't declare if defined as a macro
+
+--- a/include/libiberty.h
++++ b/include/libiberty.h
+@@ -609,8 +609,11 @@ extern int pwait (int, int *, int);
+ /* Like sprintf but provides a pointer to malloc'd storage, which must
+ be freed by the caller. */
+
++/* asprintf may be declared as a macro by glibc with __USE_FORTIFY_LEVEL. */
++#ifndef asprintf
+ extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
+ #endif
++#endif
+
+ #if !HAVE_DECL_VASPRINTF
+ /* Like vsprintf but provides a pointer to malloc'd storage, which
diff --git a/4.7.3/gentoo/51_all_libiberty-pic.patch b/4.7.3/gentoo/51_all_libiberty-pic.patch
new file mode 100644
index 0000000..b6160a7
--- /dev/null
+++ b/4.7.3/gentoo/51_all_libiberty-pic.patch
@@ -0,0 +1,10 @@
+--- a/libiberty/Makefile.in
++++ b/libiberty/Makefile.in
+@@ -246,6 +246,7 @@ $(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS)
+ $(AR) $(AR_FLAGS) $(TARGETLIB) \
+ $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \
+ $(RANLIB) $(TARGETLIB); \
++ cp $(TARGETLIB) ../ ; \
+ cd ..; \
+ else true; fi
+
diff --git a/4.7.3/gentoo/52_all_netbsd-Bsymbolic.patch b/4.7.3/gentoo/52_all_netbsd-Bsymbolic.patch
new file mode 100644
index 0000000..4db281e
--- /dev/null
+++ b/4.7.3/gentoo/52_all_netbsd-Bsymbolic.patch
@@ -0,0 +1,12 @@
+https://bugs.gentoo.org/122698
+
+--- a/gcc/config/netbsd-elf.h
++++ b/gcc/config/netbsd-elf.h
+@@ -70,6 +70,7 @@ along with GCC; see the file COPYING3. If not see
+ #define NETBSD_LINK_SPEC_ELF \
+ "%{assert*} %{R*} %{rpath*} \
+ %{shared:-shared} \
++ %{symbolic:-Bsymbolic} \
+ %{!shared: \
+ -dc -dp \
+ %{!nostdlib: \
diff --git a/4.7.3/gentoo/67_all_gcc-poison-system-directories.patch b/4.7.3/gentoo/67_all_gcc-poison-system-directories.patch
new file mode 100644
index 0000000..a9aee27
--- /dev/null
+++ b/4.7.3/gentoo/67_all_gcc-poison-system-directories.patch
@@ -0,0 +1,209 @@
+grabbed from openembedded
+
+Upstream-Status: Inappropriate [distribution: codesourcery]
+
+ gcc/
+ 2008-07-02 Joseph Myers <joseph@codesourcery.com>
+ * c-incpath.c: Include toplev.h.
+ (merge_include_chains): Use warning instead of cpp_error for
+ system directory poisoning diagnostic.
+ * Makefile.in (c-incpath.o): Depend on toplev.h.
+ * gcc.c (LINK_COMMAND_SPEC): Pass
+ --error-poison-system-directories if
+ -Werror=poison-system-directories.
+
+ 2007-06-13 Joseph Myers <joseph@codesourcery.com>
+ * common.opt (--Wno-poison-system-directories): New.
+ * doc/invoke.texi (-Wno-poison-system-directories): Document.
+ * c-incpath.c: Include flags.h.
+ (merge_include_chains): Check flag_poison_system_directories.
+ * gcc.c (LINK_COMMAND_SPEC): Pass --no-poison-system-directories
+ to linker if -Wno-poison-system-directories.
+ * Makefile.in (c-incpath.o): Depend on $(FLAGS_H).
+
+ 2007-03-20 Daniel Jacobowitz <dan@codesourcery.com>
+ Joseph Myers <joseph@codesourcery.com>
+ * configure.ac (--enable-poison-system-directories): New option.
+ * configure, config.in: Regenerate.
+ * c-incpath.c (merge_include_chains): If
+ ENABLE_POISON_SYSTEM_DIRECTORIES defined, warn for use of
+ /usr/include, /usr/local/include or /usr/X11R6/include.
+
+Index: gcc-4_7-branch/gcc/common.opt
+===================================================================
+--- gcc-4_7-branch.orig/gcc/common.opt 2012-04-10 10:54:04.000000000 -0700
++++ gcc-4_7-branch/gcc/common.opt 2012-04-10 10:56:02.259442274 -0700
+@@ -582,6 +582,10 @@
+ Common Var(warn_padded) Warning
+ Warn when padding is required to align structure members
+
++Wpoison-system-directories
++Common Var(flag_poison_system_directories) Init(1) Warning
++Warn for -I and -L options using system directories if cross compiling
++
+ Wshadow
+ Common Var(warn_shadow) Warning
+ Warn when one local variable shadows another
+Index: gcc-4_7-branch/gcc/config.in
+===================================================================
+--- gcc-4_7-branch.orig/gcc/config.in 2012-04-10 10:54:04.000000000 -0700
++++ gcc-4_7-branch/gcc/config.in 2012-04-10 10:56:02.259442274 -0700
+@@ -144,6 +144,12 @@
+ #endif
+
+
++/* Define to warn for use of native system header directories */
++#ifndef USED_FOR_TARGET
++#undef ENABLE_POISON_SYSTEM_DIRECTORIES
++#endif
++
++
+ /* Define if you want all operations on RTL (the basic data structure of the
+ optimizer and back end) to be checked for dynamic type safety at runtime.
+ This is quite expensive. */
+Index: gcc-4_7-branch/gcc/configure.ac
+===================================================================
+--- gcc-4_7-branch.orig/gcc/configure.ac 2012-04-10 10:55:32.000000000 -0700
++++ gcc-4_7-branch/gcc/configure.ac 2012-04-10 10:56:02.259442274 -0700
+@@ -4959,6 +4959,16 @@
+ [specify that runtime libraries should be
+ installed in a compiler-specific directory])])
+
++AC_ARG_ENABLE([poison-system-directories],
++ AS_HELP_STRING([--enable-poison-system-directories],
++ [warn for use of native system header directories]),,
++ [enable_poison_system_directories=no])
++if test "x${enable_poison_system_directories}" = "xyes"; then
++ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
++ [1],
++ [Define to warn for use of native system header directories])
++fi
++
+ # Substitute configuration variables
+ AC_SUBST(subdirs)
+ AC_SUBST(srcdir)
+Index: gcc-4_7-branch/gcc/doc/invoke.texi
+===================================================================
+--- gcc-4_7-branch.orig/gcc/doc/invoke.texi 2012-04-10 10:54:04.000000000 -0700
++++ gcc-4_7-branch/gcc/doc/invoke.texi 2012-04-10 10:56:02.263442231 -0700
+@@ -260,6 +260,7 @@
+ -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded @gol
+ -Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format @gol
+ -Wpointer-arith -Wno-pointer-to-int-cast @gol
++-Wno-poison-system-directories @gol
+ -Wredundant-decls @gol
+ -Wreturn-type -Wsequence-point -Wshadow @gol
+ -Wsign-compare -Wsign-conversion -Wstack-protector @gol
+@@ -3878,6 +3879,14 @@
+ for most targets, it is made up of code and thus requires the stack
+ to be made executable in order for the program to work properly.
+
++@item -Wno-poison-system-directories
++@opindex Wno-poison-system-directories
++Do not warn for @option{-I} or @option{-L} options using system
++directories such as @file{/usr/include} when cross compiling. This
++option is intended for use in chroot environments when such
++directories contain the correct headers and libraries for the target
++system rather than the host.
++
+ @item -Wfloat-equal
+ @opindex Wfloat-equal
+ @opindex Wno-float-equal
+Index: gcc-4_7-branch/gcc/gcc.c
+===================================================================
+--- gcc-4_7-branch.orig/gcc/gcc.c 2012-04-10 10:54:04.000000000 -0700
++++ gcc-4_7-branch/gcc/gcc.c 2012-04-10 10:56:02.267442207 -0700
+@@ -673,6 +673,8 @@
+ %{flto} %{flto=*} %l " LINK_PIE_SPEC \
+ "%X %{o*} %{e*} %{N} %{n} %{r}\
+ %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\
++ %{Wno-poison-system-directories:--no-poison-system-directories}\
++ %{Werror=poison-system-directories:--error-poison-system-directories}\
+ %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
+ %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
+ %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
+Index: gcc-4_7-branch/gcc/incpath.c
+===================================================================
+--- gcc-4_7-branch.orig/gcc/incpath.c 2012-04-10 10:54:04.000000000 -0700
++++ gcc-4_7-branch/gcc/incpath.c 2012-04-10 10:56:02.267442207 -0700
+@@ -361,6 +361,26 @@
+ }
+ fprintf (stderr, _("End of search list.\n"));
+ }
++
++#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
++ if (flag_poison_system_directories)
++ {
++ struct cpp_dir *p;
++
++ for (p = heads[QUOTE]; p; p = p->next)
++ {
++ if ((!strncmp (p->name, "/usr/include", 12))
++ || (!strncmp (p->name, "/usr/local/include", 18))
++ || (!strncmp (p->name, "/usr/X11R6/include", 18))
++ || (!strncmp (p->name, "/sw/include", 11))
++ || (!strncmp (p->name, "/opt/include", 12)))
++ warning (OPT_Wpoison_system_directories,
++ "include location \"%s\" is unsafe for "
++ "cross-compilation",
++ p->name);
++ }
++ }
++#endif
+ }
+
+ /* Use given -I paths for #include "..." but not #include <...>, and
+Index: gcc-4_7-branch/gcc/Makefile.in
+===================================================================
+--- gcc-4_7-branch.orig/gcc/Makefile.in 2012-04-10 10:54:05.000000000 -0700
++++ gcc-4_7-branch/gcc/Makefile.in 2012-04-10 10:56:02.267442207 -0700
+@@ -2065,7 +2065,7 @@
+
+ incpath.o: incpath.c incpath.h $(CONFIG_H) $(SYSTEM_H) $(CPPLIB_H) \
+ intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(TARGET_H) \
+- $(MACHMODE_H)
++ $(MACHMODE_H) $(FLAGS_H) toplev.h
+
+ CFLAGS-prefix.o += -DPREFIX=\"$(prefix)\" -DBASEVER=$(BASEVER_s)
+ prefix.o: prefix.c $(CONFIG_H) $(SYSTEM_H) coretypes.h prefix.h \
+Index: gcc-4_7-branch/gcc/configure
+===================================================================
+--- gcc-4_7-branch.orig/gcc/configure 2012-04-10 10:55:32.000000000 -0700
++++ gcc-4_7-branch/gcc/configure 2012-04-10 10:56:12.183442720 -0700
+@@ -914,6 +914,7 @@
+ with_system_zlib
+ enable_maintainer_mode
+ enable_version_specific_runtime_libs
++enable_poison_system_directories
+ enable_plugin
+ enable_libquadmath_support
+ with_linker_hash_style
+@@ -1627,6 +1628,8 @@
+ --enable-version-specific-runtime-libs
+ specify that runtime libraries should be installed
+ in a compiler-specific directory
++ --enable-poison-system-directories
++ warn for use of native system header directories
+ --enable-plugin enable plugin support
+ --disable-libquadmath-support
+ disable libquadmath support for Fortran
+@@ -27075,6 +27078,19 @@
+ fi
+
+
++# Check whether --enable-poison-system-directories was given.
++if test "${enable_poison_system_directories+set}" = set; then :
++ enableval=$enable_poison_system_directories;
++else
++ enable_poison_system_directories=no
++fi
++
++if test "x${enable_poison_system_directories}" = "xyes"; then
++
++$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
++
++fi
++
+ # Substitute configuration variables
+
+
diff --git a/4.7.3/gentoo/74_all_gcc47_cloog-dl.patch b/4.7.3/gentoo/74_all_gcc47_cloog-dl.patch
new file mode 100644
index 0000000..ee108e3
--- /dev/null
+++ b/4.7.3/gentoo/74_all_gcc47_cloog-dl.patch
@@ -0,0 +1,524 @@
+2011-01-04 Jakub Jelinek <jakub@redhat.com>
+
+ * Makefile.in (BACKENDLIBS): Link against -ldl instead of
+ -lcloog -lppl.
+ (graphite.o, graphite%.o): Force -O, remove -fkeep-inline-functions.
+ (GRAPHITE_CLOOG_UTIL_H, GRAPHITE_POLY_H): New.
+ (graphite*.o): Adjust dependencies.
+ * graphite-cloog-compat.h: Include <dlfcn.h>. Reference libcloog and
+ libppl symbols through pointers in cloog_pointers__ variable.
+ * graphite.c (init_cloog_pointers): New function.
+ (graphite_transform_loops): Call init_cloog_pointers.
+ * graphite-clast-to-gimple.c (gcc_type_for_iv_of_clast_loop): Rename
+ stmt_for argument to stmt_fora.
+ * graphite-poly.h: Include graphite-cloog-util.h.
+
+2012-05-19 Ryan Hill <dirtyepic@gentoo.org>
+
+ * configure.ac (DL_LIB): Check how to dlopen.
+ * configure: Regenerate.
+ * Makefile.in (BACKENDLIBS): Use DL_LIB.
+
+
+--- a/gcc/Makefile.in
++++ b/gcc/Makefile.in
+@@ -963,6 +963,8 @@ GCC_PLUGIN_H = gcc-plugin.h highlev-plugin-common.h $(CONFIG_H) $(SYSTEM_H) \
+ PLUGIN_H = plugin.h $(GCC_PLUGIN_H)
+ PLUGIN_VERSION_H = plugin-version.h configargs.h
+ LIBFUNCS_H = libfuncs.h $(HASHTAB_H)
++GRAPHITE_CLOOG_UTIL_H = graphite-cloog-util.h graphite-cloog-compat.h
++GRAPHITE_POLY_H = graphite-poly.h $(GRAPHITE_CLOOG_UTIL_H)
+
+ #
+ # Now figure out from those variables how to compile and link.
+@@ -1017,7 +1019,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY)
+ # and the system's installed libraries.
+ LIBS = @LIBS@ libcommon.a $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY) \
+ $(LIBDECNUMBER) $(HOST_LIBS)
+-BACKENDLIBS = $(CLOOGLIBS) $(PPLLIBS) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \
++BACKENDLIBS = $(GMPLIBS) $(if $(CLOOGLIBS),@DL_LIB@) $(PLUGINLIBS) $(HOST_LIBS) \
+ $(ZLIB)
+ # Any system libraries needed just for GNAT.
+ SYSLIBS = @GNAT_LIBEXC@
+@@ -2603,40 +2605,40 @@ sese.o : sese.c sese.h $(CONFIG_H) $(SYSTEM_H) coretypes.h tree-pretty-print.h \
+ $(TREE_FLOW_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) tree-pass.h value-prof.h
+ graphite.o : graphite.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(DIAGNOSTIC_CORE_H) \
+ $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h \
+- $(DBGCNT_H) graphite-ppl.h graphite-poly.h graphite-scop-detection.h \
++ $(DBGCNT_H) graphite-ppl.h $(GRAPHITE_POLY_H) graphite-scop-detection.h \
+ graphite-clast-to-gimple.h graphite-sese-to-poly.h
+ graphite-blocking.o : graphite-blocking.c $(CONFIG_H) $(SYSTEM_H) \
+ coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \
+- sese.h graphite-ppl.h graphite-poly.h
++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H)
+ graphite-clast-to-gimple.o : graphite-clast-to-gimple.c $(CONFIG_H) \
+ $(SYSTEM_H) coretypes.h $(DIAGNOSTIC_CORE_H) $(TREE_FLOW_H) $(TREE_DUMP_H) \
+- $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h graphite-cloog-util.h \
+- graphite-ppl.h graphite-poly.h graphite-clast-to-gimple.h \
++ $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h $(GRAPHITE_CLOOG_UTIL_H) \
++ graphite-ppl.h $(GRAPHITE_POLY_H) graphite-clast-to-gimple.h \
+ graphite-dependences.h graphite-cloog-compat.h
+ graphite-cloog-util.o : graphite-cloog-util.c $(CONFIG_H) $(SYSTEM_H) \
+- coretypes.h graphite-cloog-util.h graphite-cloog-compat.h
++ coretypes.h $(GRAPHITE_CLOOG_UTIL_H) graphite-cloog-compat.h
+ graphite-dependences.o : graphite-dependences.c $(CONFIG_H) $(SYSTEM_H) \
+ coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \
+- sese.h graphite-ppl.h graphite-poly.h graphite-dependences.h \
+- graphite-cloog-util.h
++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H) graphite-dependences.h \
++ $(GRAPHITE_CLOOG_UTIL_H)
+ graphite-flattening.o : graphite-flattening.c $(CONFIG_H) $(SYSTEM_H) \
+ coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \
+- sese.h graphite-ppl.h graphite-poly.h
++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H)
+ graphite-interchange.o : graphite-interchange.c $(CONFIG_H) $(SYSTEM_H) \
+ coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \
+- sese.h graphite-ppl.h graphite-poly.h
++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H)
+ graphite-poly.o : graphite-poly.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
+ $(DIAGNOSTIC_CORE_H) $(TREE_FLOW_H) $(TREE_DUMP_H) gimple-pretty-print.h \
+- $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h graphite-ppl.h graphite-poly.h \
+- graphite-dependences.h graphite-cloog-util.h
++ $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h graphite-ppl.h $(GRAPHITE_POLY_H) \
++ graphite-dependences.h $(GRAPHITE_CLOOG_UTIL_H)
+ graphite-ppl.o : graphite-ppl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
+- graphite-cloog-util.h graphite-ppl.h
++ $(GRAPHITE_CLOOG_UTIL_H) graphite-ppl.h
+ graphite-scop-detection.o : graphite-scop-detection.c $(CONFIG_H) $(SYSTEM_H) \
+ coretypes.h $(TREE_FLOW_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) $(TREE_PASS_H) \
+- sese.h graphite-ppl.h graphite-poly.h graphite-scop-detection.h
++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H) graphite-scop-detection.h
+ graphite-sese-to-poly.o : graphite-sese-to-poly.c $(CONFIG_H) \
+ $(SYSTEM_H) coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) \
+- $(TREE_DATA_REF_H) domwalk.h sese.h graphite-ppl.h graphite-poly.h \
++ $(TREE_DATA_REF_H) domwalk.h sese.h graphite-ppl.h $(GRAPHITE_POLY_H) \
+ graphite-sese-to-poly.h
+ tree-vect-loop.o: tree-vect-loop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
+ $(TM_H) $(GGC_H) $(TREE_H) $(BASIC_BLOCK_H) $(DIAGNOSTIC_H) $(TREE_FLOW_H) \
+@@ -3455,6 +3457,15 @@ $(common_out_object_file): $(common_out_file) $(CONFIG_H) $(SYSTEM_H) \
+ $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \
+ $< $(OUTPUT_OPTION)
+
++graphite%.o : \
++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS))
++graphite.o : \
++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS))
++graphite%.o : \
++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS))
++graphite.o : \
++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS))
++
+ # Build auxiliary files that support ecoff format.
+ mips-tfile: mips-tfile.o $(LIBDEPS)
+ $(LINKER) $(LINKERFLAGS) $(LDFLAGS) -o $@ \
+--- a/gcc/configure
++++ b/gcc/configure
+@@ -602,6 +602,7 @@ ac_subst_vars='LTLIBOBJS
+ LIBOBJS
+ enable_plugin
+ pluginlibs
++DL_LIB
+ CLOOGINC
+ CLOOGLIBS
+ PPLINC
+@@ -27236,6 +27237,7 @@ $as_echo "unable to check" >&6; }
+ fi
+
+ # Check -ldl
++ DL_LIB=
+ saved_LIBS="$LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
+ $as_echo_n "checking for library containing dlopen... " >&6; }
+@@ -27295,7 +27297,9 @@ fi
+
+ if test x"$ac_cv_search_dlopen" = x"-ldl"; then
+ pluginlibs="$pluginlibs -ldl"
++ DL_LIB=$ac_cv_search_dlopen
+ fi
++
+ LIBS="$saved_LIBS"
+
+ # Check that we can build shared objects with -fPIC -shared
+--- a/gcc/configure.ac
++++ b/gcc/configure.ac
+@@ -5109,11 +5109,14 @@ if test x"$enable_plugin" = x"yes"; then
+ fi
+
+ # Check -ldl
++ DL_LIB=
+ saved_LIBS="$LIBS"
+ AC_SEARCH_LIBS([dlopen], [dl])
+ if test x"$ac_cv_search_dlopen" = x"-ldl"; then
+ pluginlibs="$pluginlibs -ldl"
++ DL_LIB=$ac_cv_search_dlopen
+ fi
++ AC_SUBST(DL_LIB)
+ LIBS="$saved_LIBS"
+
+ # Check that we can build shared objects with -fPIC -shared
+--- a/gcc/graphite-clast-to-gimple.c
++++ b/gcc/graphite-clast-to-gimple.c
+@@ -836,7 +836,7 @@ clast_get_body_of_loop (struct clast_stmt *stmt)
+ from STMT_FOR. */
+
+ static tree
+-type_for_clast_for (struct clast_for *stmt_for, ivs_params_p ip)
++type_for_clast_for (struct clast_for *stmt_fora, ivs_params_p ip)
+ {
+ mpz_t bound_one, bound_two;
+ tree lb_type, ub_type;
+@@ -844,8 +844,8 @@ type_for_clast_for (struct clast_for *stmt_for, ivs_params_p ip)
+ mpz_init (bound_one);
+ mpz_init (bound_two);
+
+- lb_type = type_for_clast_expr (stmt_for->LB, ip, bound_one, bound_two);
+- ub_type = type_for_clast_expr (stmt_for->UB, ip, bound_one, bound_two);
++ lb_type = type_for_clast_expr (stmt_fora->LB, ip, bound_one, bound_two);
++ ub_type = type_for_clast_expr (stmt_fora->UB, ip, bound_one, bound_two);
+
+ mpz_clear (bound_one);
+ mpz_clear (bound_two);
+--- a/gcc/graphite-cloog-compat.h
++++ b/gcc/graphite-cloog-compat.h
+@@ -272,4 +272,279 @@ static inline int cloog_matrix_nrows (CloogMatrix * m)
+ return m->NbRows;
+ }
+ #endif /* CLOOG_ORG */
++
++#include <dlfcn.h>
++#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 11
++#define DYNSYMS_PPL11
++#else
++#define DYNSYMS_PPL11 \
++ DYNSYM (ppl_new_PIP_Problem_from_constraints); \
++ DYNSYM (ppl_PIP_Problem_is_satisfiable); \
++ DYNSYM (ppl_delete_PIP_Problem);
++#endif
++#define DYNSYMS \
++ DYNSYM (cloog_block_alloc); \
++ DYNSYM (cloog_block_list_free); \
++ DYNSYM (cloog_block_list_malloc); \
++ DYNSYM (cloog_clast_create); \
++ DYNSYM (cloog_clast_free); \
++ DYNSYM (cloog_domain_free); \
++ DYNSYM (cloog_domain_matrix2domain); \
++ DYNSYM (cloog_initialize); \
++ DYNSYM (cloog_loop_malloc); \
++ DYNSYM (cloog_matrix_alloc); \
++ DYNSYM (cloog_matrix_copy); \
++ DYNSYM (cloog_matrix_free); \
++ DYNSYM (cloog_matrix_print); \
++ DYNSYM (cloog_names_malloc); \
++ DYNSYM (cloog_names_scalarize); \
++ DYNSYM (cloog_options_free); \
++ DYNSYM (cloog_options_malloc); \
++ DYNSYM (cloog_program_dump_cloog); \
++ DYNSYM (cloog_program_extract_scalars); \
++ DYNSYM (cloog_program_free); \
++ DYNSYM (cloog_program_generate); \
++ DYNSYM (cloog_program_malloc); \
++ DYNSYM (cloog_program_print); \
++ DYNSYM (cloog_program_scatter); \
++ DYNSYM (cloog_statement_alloc); \
++ DYNSYM (cloog_domain_union); \
++ DYNSYM (cloog_matrix_read); \
++ DYNSYM (cloog_new_pol); \
++ DYNSYM (cloog_vector_gcd); \
++ DYNSYM (ppl_finalize); \
++ DYNSYM (ppl_assign_Coefficient_from_mpz_t); \
++ DYNSYM (ppl_assign_Linear_Expression_from_Linear_Expression); \
++ DYNSYM (ppl_Coefficient_to_mpz_t); \
++ DYNSYM (ppl_Constraint_coefficient); \
++ DYNSYM (ppl_Constraint_inhomogeneous_term); \
++ DYNSYM (ppl_Constraint_space_dimension); \
++ DYNSYM (ppl_Constraint_System_begin); \
++ DYNSYM (ppl_Constraint_System_const_iterator_dereference); \
++ DYNSYM (ppl_Constraint_System_const_iterator_equal_test); \
++ DYNSYM (ppl_Constraint_System_const_iterator_increment); \
++ DYNSYM (ppl_Constraint_System_end); \
++ DYNSYM (ppl_Constraint_System_insert_Constraint); \
++ DYNSYM (ppl_Constraint_System_space_dimension); \
++ DYNSYM (ppl_Constraint_type); \
++ DYNSYM (ppl_delete_Coefficient); \
++ DYNSYM (ppl_delete_Constraint); \
++ DYNSYM (ppl_delete_Constraint_System_const_iterator); \
++ DYNSYM (ppl_delete_Linear_Expression); \
++ DYNSYM (ppl_delete_Pointset_Powerset_C_Polyhedron); \
++ DYNSYM (ppl_delete_Pointset_Powerset_C_Polyhedron_iterator); \
++ DYNSYM (ppl_delete_Polyhedron); \
++ DYNSYM (ppl_Linear_Expression_add_to_coefficient); \
++ DYNSYM (ppl_Linear_Expression_add_to_inhomogeneous); \
++ DYNSYM (ppl_Linear_Expression_coefficient); \
++ DYNSYM (ppl_Linear_Expression_inhomogeneous_term); \
++ DYNSYM (ppl_Linear_Expression_space_dimension); \
++ DYNSYM (ppl_new_Coefficient); \
++ DYNSYM (ppl_new_Coefficient_from_mpz_t); \
++ DYNSYM (ppl_new_Constraint); \
++ DYNSYM (ppl_new_Constraint_System); \
++ DYNSYM (ppl_new_Constraint_System_const_iterator); \
++ DYNSYM (ppl_new_C_Polyhedron_from_C_Polyhedron); \
++ DYNSYM (ppl_new_C_Polyhedron_from_space_dimension); \
++ DYNSYM (ppl_new_C_Polyhedron_recycle_Constraint_System); \
++ DYNSYM (ppl_new_Linear_Expression); \
++ DYNSYM (ppl_new_Linear_Expression_from_Constraint); \
++ DYNSYM (ppl_new_Linear_Expression_from_Linear_Expression); \
++ DYNSYM (ppl_new_Linear_Expression_with_dimension); \
++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron); \
++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron); \
++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension); \
++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_iterator); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_add_constraint); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_difference_assign); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_intersection_assign); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_is_empty); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_end); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_increment); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_maximize); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_minimize); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_size); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_space_dimension); \
++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign); \
++ DYNSYM (ppl_Polyhedron_add_constraint); \
++ DYNSYM (ppl_Polyhedron_add_constraints); \
++ DYNSYM (ppl_Polyhedron_add_space_dimensions_and_embed); \
++ DYNSYM (ppl_Polyhedron_get_constraints); \
++ DYNSYM (ppl_Polyhedron_map_space_dimensions); \
++ DYNSYM (ppl_Polyhedron_remove_space_dimensions); \
++ DYNSYM (ppl_Polyhedron_space_dimension); \
++ DYNSYM (ppl_subtract_Linear_Expression_from_Linear_Expression); \
++ DYNSYM (pprint); \
++ DYNSYM (stmt_block); \
++ DYNSYM (stmt_for); \
++ DYNSYM (stmt_guard); \
++ DYNSYM (stmt_root); \
++ DYNSYM (stmt_user); \
++ DYNSYM (stmt_ass); \
++ DYNSYM (ppl_delete_Constraint_System); \
++ DYNSYM (ppl_initialize); \
++ DYNSYM (ppl_new_Constraint_System_from_Constraint); \
++ DYNSYM (ppl_new_C_Polyhedron_from_Constraint_System); \
++ DYNSYM (ppl_Polyhedron_affine_image); \
++ DYNSYM (ppl_io_fprint_Pointset_Powerset_C_Polyhedron); \
++ DYNSYMS_PPL11
++extern struct cloog_pointers_s__
++{
++ bool inited;
++ void *h;
++#define DYNSYM(x) __typeof (x) *p_##x
++ DYNSYMS
++#undef DYNSYM
++} cloog_pointers__;
++
++#define cloog_block_alloc (*cloog_pointers__.p_cloog_block_alloc)
++#define cloog_block_list_free (*cloog_pointers__.p_cloog_block_list_free)
++#define cloog_block_list_malloc (*cloog_pointers__.p_cloog_block_list_malloc)
++#define cloog_clast_create (*cloog_pointers__.p_cloog_clast_create)
++#define cloog_clast_free (*cloog_pointers__.p_cloog_clast_free)
++#define cloog_domain_free (*cloog_pointers__.p_cloog_domain_free)
++#define cloog_domain_matrix2domain (*cloog_pointers__.p_cloog_domain_matrix2domain)
++#define cloog_initialize (*cloog_pointers__.p_cloog_initialize)
++#ifndef CLOOG_ORG
++#undef cloog_loop_malloc
++#define cloog_loop_malloc(STATE) (*cloog_pointers__.p_cloog_loop_malloc) ()
++#else
++#define cloog_loop_malloc (*cloog_pointers__.p_cloog_loop_malloc)
++#endif
++#define cloog_matrix_alloc (*cloog_pointers__.p_cloog_matrix_alloc)
++#define cloog_matrix_copy (*cloog_pointers__.p_cloog_matrix_copy)
++#define cloog_matrix_free (*cloog_pointers__.p_cloog_matrix_free)
++#define cloog_matrix_print (*cloog_pointers__.p_cloog_matrix_print)
++#define cloog_names_malloc (*cloog_pointers__.p_cloog_names_malloc)
++#define cloog_names_scalarize (*cloog_pointers__.p_cloog_names_scalarize)
++#define cloog_options_free (*cloog_pointers__.p_cloog_options_free)
++#ifndef CLOOG_ORG
++#undef cloog_options_malloc
++#define cloog_options_malloc(STATE) (*cloog_pointers__.p_cloog_options_malloc) ()
++#undef cloog_program_dump_cloog
++#define cloog_program_dump_cloog(DUMPFILE, PROGRAM, SCATTERINGLIST) \
++ (*cloog_pointers__.p_cloog_program_dump_cloog) (DUMPFILE, PROGRAM)
++#undef cloog_program_extract_scalars
++#define cloog_program_extract_scalars(PROG, SCATT, OPT) \
++ (*cloog_pointers__.p_cloog_program_extract_scalars) (PROG, SCATT)
++#else
++#define cloog_options_malloc (*cloog_pointers__.p_cloog_options_malloc)
++#define cloog_program_dump_cloog (*cloog_pointers__.p_cloog_program_dump_cloog)
++#define cloog_program_extract_scalars (*cloog_pointers__.p_cloog_program_extract_scalars)
++#endif
++#define cloog_program_free (*cloog_pointers__.p_cloog_program_free)
++#define cloog_program_generate (*cloog_pointers__.p_cloog_program_generate)
++#define cloog_program_malloc (*cloog_pointers__.p_cloog_program_malloc)
++#define cloog_program_print (*cloog_pointers__.p_cloog_program_print)
++#ifndef CLOOG_ORG
++#undef cloog_program_scatter
++#define cloog_program_scatter(PROG, SCATT, OPT) \
++ (*cloog_pointers__.p_cloog_program_scatter) (PROG, SCATT)
++#undef cloog_statement_alloc
++#define cloog_statement_alloc(STATE, INDEX) \
++ (*cloog_pointers__.p_cloog_statement_alloc) (INDEX)
++#else
++#define cloog_program_scatter (*cloog_pointers__.p_cloog_program_scatter)
++#define cloog_statement_alloc (*cloog_pointers__.p_cloog_statement_alloc)
++#endif
++#define cloog_domain_union (*cloog_pointers__.p_cloog_domain_union)
++#define cloog_matrix_read (*cloog_pointers__.p_cloog_matrix_read)
++#define cloog_new_pol (*cloog_pointers__.p_cloog_new_pol)
++#define cloog_vector_gcd (*cloog_pointers__.p_cloog_vector_gcd)
++#define ppl_finalize (*cloog_pointers__.p_ppl_finalize)
++#define ppl_assign_Coefficient_from_mpz_t (*cloog_pointers__.p_ppl_assign_Coefficient_from_mpz_t)
++#define ppl_assign_Linear_Expression_from_Linear_Expression (*cloog_pointers__.p_ppl_assign_Linear_Expression_from_Linear_Expression)
++#define ppl_Coefficient_to_mpz_t (*cloog_pointers__.p_ppl_Coefficient_to_mpz_t)
++#define ppl_Constraint_coefficient (*cloog_pointers__.p_ppl_Constraint_coefficient)
++#define ppl_Constraint_inhomogeneous_term (*cloog_pointers__.p_ppl_Constraint_inhomogeneous_term)
++#define ppl_Constraint_space_dimension (*cloog_pointers__.p_ppl_Constraint_space_dimension)
++#define ppl_Constraint_System_begin (*cloog_pointers__.p_ppl_Constraint_System_begin)
++#define ppl_Constraint_System_const_iterator_dereference (*cloog_pointers__.p_ppl_Constraint_System_const_iterator_dereference)
++#define ppl_Constraint_System_const_iterator_equal_test (*cloog_pointers__.p_ppl_Constraint_System_const_iterator_equal_test)
++#define ppl_Constraint_System_const_iterator_increment (*cloog_pointers__.p_ppl_Constraint_System_const_iterator_increment)
++#define ppl_Constraint_System_end (*cloog_pointers__.p_ppl_Constraint_System_end)
++#define ppl_Constraint_System_insert_Constraint (*cloog_pointers__.p_ppl_Constraint_System_insert_Constraint)
++#define ppl_Constraint_System_space_dimension (*cloog_pointers__.p_ppl_Constraint_System_space_dimension)
++#define ppl_Constraint_type (*cloog_pointers__.p_ppl_Constraint_type)
++#define ppl_delete_Coefficient (*cloog_pointers__.p_ppl_delete_Coefficient)
++#define ppl_delete_Constraint (*cloog_pointers__.p_ppl_delete_Constraint)
++#define ppl_delete_Constraint_System_const_iterator (*cloog_pointers__.p_ppl_delete_Constraint_System_const_iterator)
++#define ppl_delete_Linear_Expression (*cloog_pointers__.p_ppl_delete_Linear_Expression)
++#define ppl_delete_Pointset_Powerset_C_Polyhedron (*cloog_pointers__.p_ppl_delete_Pointset_Powerset_C_Polyhedron)
++#define ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (*cloog_pointers__.p_ppl_delete_Pointset_Powerset_C_Polyhedron_iterator)
++#define ppl_delete_Polyhedron (*cloog_pointers__.p_ppl_delete_Polyhedron)
++#define ppl_Linear_Expression_add_to_coefficient (*cloog_pointers__.p_ppl_Linear_Expression_add_to_coefficient)
++#define ppl_Linear_Expression_add_to_inhomogeneous (*cloog_pointers__.p_ppl_Linear_Expression_add_to_inhomogeneous)
++#define ppl_Linear_Expression_coefficient (*cloog_pointers__.p_ppl_Linear_Expression_coefficient)
++#define ppl_Linear_Expression_inhomogeneous_term (*cloog_pointers__.p_ppl_Linear_Expression_inhomogeneous_term)
++#define ppl_Linear_Expression_space_dimension (*cloog_pointers__.p_ppl_Linear_Expression_space_dimension)
++#define ppl_new_Coefficient (*cloog_pointers__.p_ppl_new_Coefficient)
++#define ppl_new_Coefficient_from_mpz_t (*cloog_pointers__.p_ppl_new_Coefficient_from_mpz_t)
++#define ppl_new_Constraint (*cloog_pointers__.p_ppl_new_Constraint)
++#define ppl_new_Constraint_System (*cloog_pointers__.p_ppl_new_Constraint_System)
++#define ppl_new_Constraint_System_const_iterator (*cloog_pointers__.p_ppl_new_Constraint_System_const_iterator)
++#define ppl_new_C_Polyhedron_from_C_Polyhedron (*cloog_pointers__.p_ppl_new_C_Polyhedron_from_C_Polyhedron)
++#define ppl_new_C_Polyhedron_from_space_dimension (*cloog_pointers__.p_ppl_new_C_Polyhedron_from_space_dimension)
++#define ppl_new_C_Polyhedron_recycle_Constraint_System (*cloog_pointers__.p_ppl_new_C_Polyhedron_recycle_Constraint_System)
++#define ppl_new_Linear_Expression (*cloog_pointers__.p_ppl_new_Linear_Expression)
++#define ppl_new_Linear_Expression_from_Constraint (*cloog_pointers__.p_ppl_new_Linear_Expression_from_Constraint)
++#define ppl_new_Linear_Expression_from_Linear_Expression (*cloog_pointers__.p_ppl_new_Linear_Expression_from_Linear_Expression)
++#define ppl_new_Linear_Expression_with_dimension (*cloog_pointers__.p_ppl_new_Linear_Expression_with_dimension)
++#define ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron)
++#define ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron)
++#define ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension)
++#define ppl_new_Pointset_Powerset_C_Polyhedron_iterator (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_iterator)
++#define ppl_Pointset_Powerset_C_Polyhedron_add_constraint (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_add_constraint)
++#define ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed)
++#define ppl_Pointset_Powerset_C_Polyhedron_difference_assign (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_difference_assign)
++#define ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_intersection_assign)
++#define ppl_Pointset_Powerset_C_Polyhedron_is_empty (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_is_empty)
++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_begin)
++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference)
++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_end (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_end)
++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test)
++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_increment)
++#define ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions)
++#define ppl_Pointset_Powerset_C_Polyhedron_maximize (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_maximize)
++#define ppl_Pointset_Powerset_C_Polyhedron_minimize (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_minimize)
++#define ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions)
++#define ppl_Pointset_Powerset_C_Polyhedron_size (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_size)
++#define ppl_Pointset_Powerset_C_Polyhedron_space_dimension (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_space_dimension)
++#define ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign)
++#define ppl_Polyhedron_add_constraint (*cloog_pointers__.p_ppl_Polyhedron_add_constraint)
++#define ppl_Polyhedron_add_constraints (*cloog_pointers__.p_ppl_Polyhedron_add_constraints)
++#define ppl_Polyhedron_add_space_dimensions_and_embed (*cloog_pointers__.p_ppl_Polyhedron_add_space_dimensions_and_embed)
++#define ppl_Polyhedron_get_constraints (*cloog_pointers__.p_ppl_Polyhedron_get_constraints)
++#define ppl_Polyhedron_map_space_dimensions (*cloog_pointers__.p_ppl_Polyhedron_map_space_dimensions)
++#define ppl_Polyhedron_remove_space_dimensions (*cloog_pointers__.p_ppl_Polyhedron_remove_space_dimensions)
++#define ppl_Polyhedron_space_dimension (*cloog_pointers__.p_ppl_Polyhedron_space_dimension)
++#define ppl_subtract_Linear_Expression_from_Linear_Expression (*cloog_pointers__.p_ppl_subtract_Linear_Expression_from_Linear_Expression)
++#define pprint (*cloog_pointers__.p_pprint)
++#define stmt_block (*cloog_pointers__.p_stmt_block)
++#define stmt_for (*cloog_pointers__.p_stmt_for)
++#define stmt_guard (*cloog_pointers__.p_stmt_guard)
++#define stmt_root (*cloog_pointers__.p_stmt_root)
++#define stmt_user (*cloog_pointers__.p_stmt_user)
++#define stmt_ass (*cloog_pointers__.p_stmt_ass)
++#define ppl_delete_Constraint_System (*cloog_pointers__.p_ppl_delete_Constraint_System)
++#define ppl_initialize (*cloog_pointers__.p_ppl_initialize)
++#define ppl_new_Constraint_System_from_Constraint (*cloog_pointers__.p_ppl_new_Constraint_System_from_Constraint)
++#define ppl_new_C_Polyhedron_from_Constraint_System (*cloog_pointers__.p_ppl_new_C_Polyhedron_from_Constraint_System)
++#define ppl_Polyhedron_affine_image (*cloog_pointers__.p_ppl_Polyhedron_affine_image)
++#define ppl_io_fprint_Pointset_Powerset_C_Polyhedron (*cloog_pointers__.p_ppl_io_fprint_Pointset_Powerset_C_Polyhedron)
++#if !(PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 11)
++#define ppl_new_PIP_Problem_from_constraints (*cloog_pointers__.p_ppl_new_PIP_Problem_from_constraints)
++#define ppl_PIP_Problem_is_satisfiable (*cloog_pointers__.p_ppl_PIP_Problem_is_satisfiable)
++#define ppl_delete_PIP_Problem (*cloog_pointers__.p_ppl_delete_PIP_Problem)
++#endif
++
++#define cloog_finalize (*cloog_pointers__.p_ppl_finalize)
++
++
+ #endif /* GRAPHITE_CLOOG_COMPAT_H */
+--- a/gcc/graphite-poly.h
++++ b/gcc/graphite-poly.h
+@@ -22,6 +22,8 @@ along with GCC; see the file COPYING3. If not see
+ #ifndef GCC_GRAPHITE_POLY_H
+ #define GCC_GRAPHITE_POLY_H
+
++#include "graphite-cloog-util.h"
++
+ typedef struct poly_dr *poly_dr_p;
+ DEF_VEC_P(poly_dr_p);
+ DEF_VEC_ALLOC_P (poly_dr_p, heap);
+--- a/gcc/graphite.c
++++ b/gcc/graphite.c
+@@ -56,6 +56,35 @@ along with GCC; see the file COPYING3. If not see
+
+ CloogState *cloog_state;
+
++__typeof (cloog_pointers__) cloog_pointers__;
++
++static bool
++init_cloog_pointers (void)
++{
++ void *h;
++
++ if (cloog_pointers__.inited)
++ return cloog_pointers__.h != NULL;
++ h = dlopen ("libcloog.so.0", RTLD_LAZY);
++ cloog_pointers__.h = h;
++ if (h == NULL)
++ return false;
++#define DYNSYM(x) \
++ do \
++ { \
++ union { __typeof (cloog_pointers__.p_##x) p; void *q; } u; \
++ u.q = dlsym (h, #x); \
++ if (u.q == NULL) \
++ return false; \
++ cloog_pointers__.p_##x = u.p; \
++ } \
++ while (0)
++ DYNSYMS
++#undef DYNSYM
++ return true;
++}
++
++
+ /* Print global statistics to FILE. */
+
+ static void
+@@ -201,6 +230,12 @@ graphite_initialize (void)
+ return false;
+ }
+
++ if (!init_cloog_pointers ())
++ {
++ sorry ("Graphite loop optimizations cannot be used");
++ return false;
++ }
++
+ scev_reset ();
+ recompute_all_dominators ();
+ initialize_original_copy_tables ();
diff --git a/4.7.3/gentoo/82_all_alpha_4.6.4_pr56023_bootstrap.patch b/4.7.3/gentoo/82_all_alpha_4.6.4_pr56023_bootstrap.patch
new file mode 100644
index 0000000..c3fa75f
--- /dev/null
+++ b/4.7.3/gentoo/82_all_alpha_4.6.4_pr56023_bootstrap.patch
@@ -0,0 +1,56 @@
+[4.6 Regression]: [alpha] -fcompare-debug failure due to sched1 pass
+
+http://gcc.gnu.org/PR56023
+https://bugs.gentoo.org/451680
+
+
+Author: uros
+Date: Mon Jan 21 18:02:57 2013
+New Revision: 195345
+
+URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=195345
+Log:
+ PR rtl-optimization/56023
+ * haifa-sched.c (fix_inter_tick): Do not update ticks of instructions,
+ dependent on debug instruction.
+
+testsuite/ChangeLog:
+
+ PR rtl-optimization/56023
+ * gcc.dg/pr56023.c: New test.
+
+
+--- a/gcc/haifa-sched.c
++++ b/gcc/haifa-sched.c
+@@ -3684,6 +3684,9 @@ fix_inter_tick (rtx head, rtx tail)
+ INSN_TICK (head) = tick;
+ }
+
++ if (DEBUG_INSN_P (head))
++ continue;
++
+ FOR_EACH_DEP (head, SD_LIST_RES_FORW, sd_it, dep)
+ {
+ rtx next;
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/pr56023.c
+@@ -0,0 +1,19 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -fcompare-debug" } */
++
++void
++foo (char *c)
++{
++ unsigned int x = 0;
++ unsigned int i;
++
++ for (i = 0; c[i]; i++)
++ {
++ if (i >= 5 && x != 1)
++ break;
++ else if (c[i] == ' ')
++ x = i;
++ else if (c[i] == '/' && c[i + 1] != ' ' && i)
++ x = i + 1;
++ }
++}
diff --git a/4.7.3/gentoo/90_all_gcc-4.7-x32.patch b/4.7.3/gentoo/90_all_gcc-4.7-x32.patch
new file mode 100644
index 0000000..68207af
--- /dev/null
+++ b/4.7.3/gentoo/90_all_gcc-4.7-x32.patch
@@ -0,0 +1,2902 @@
+git diff 6bd686c1cc586e318a520b1b3b09732bf7c915f0^...74e1f4df1f44b2249061b7770e4020b2abdb3877
+ (remotes/origin/gcc-4_7-branch) (remotes/origin/hjl/x32/gcc-4_7-branch)
+
+then filtered out useless configure & ChangeLog files
+
+--- a/boehm-gc/configure
++++ b/boehm-gc/configure
+@@ -6786,7 +6786,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/boehm-gc/include/private/gcconfig.h
++++ b/boehm-gc/include/private/gcconfig.h
+@@ -1974,8 +1974,13 @@
+
+ # ifdef X86_64
+ # define MACH_TYPE "X86_64"
+-# define ALIGNMENT 8
+-# define CPP_WORDSZ 64
++# ifdef __ILP32__
++# define ALIGNMENT 4
++# define CPP_WORDSZ 32
++# else
++# define ALIGNMENT 8
++# define CPP_WORDSZ 64
++# endif
+ # ifndef HBLKSIZE
+ # define HBLKSIZE 4096
+ # endif
+--- a/gcc/ada/gcc-interface/Makefile.in
++++ b/gcc/ada/gcc-interface/Makefile.in
+@@ -350,6 +350,10 @@ GNATMAKE_OBJS = a-except.o ali.o ali-util.o aspects.o s-casuti.o alloc.o \
+ ifeq ($(strip $(filter-out %x86_64, $(arch))),)
+ ifeq ($(strip $(MULTISUBDIR)),/32)
+ arch:=i686
++ else
++ ifeq ($(strip $(MULTISUBDIR)),/x32)
++ arch:=x32
++ endif
+ endif
+ endif
+
+@@ -2132,6 +2136,43 @@ ifeq ($(strip $(filter-out %x86_64 linux%,$(arch) $(osys))),)
+ LIBRARY_VERSION := $(LIB_VERSION)
+ endif
+
++ifeq ($(strip $(filter-out %x32 linux%,$(arch) $(osys))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
++ a-intnam.ads<a-intnam-linux.ads \
++ a-synbar.adb<a-synbar-posix.adb \
++ a-synbar.ads<a-synbar-posix.ads \
++ s-inmaop.adb<s-inmaop-posix.adb \
++ s-intman.adb<s-intman-posix.adb \
++ s-linux.ads<s-linux.ads \
++ s-mudido.adb<s-mudido-affinity.adb \
++ s-osinte.ads<s-osinte-linux.ads \
++ s-osinte.adb<s-osinte-posix.adb \
++ s-osprim.adb<s-osprim-posix.adb \
++ s-taprop.adb<s-taprop-linux.adb \
++ s-tasinf.ads<s-tasinf-linux.ads \
++ s-tasinf.adb<s-tasinf-linux.adb \
++ s-tpopsp.adb<s-tpopsp-tls.adb \
++ s-taspri.ads<s-taspri-posix.ads \
++ g-sercom.adb<g-sercom-linux.adb \
++ $(ATOMICS_TARGET_PAIRS) \
++ $(X86_64_TARGET_PAIRS) \
++ system.ads<system-linux-x86.ads
++
++ TOOLS_TARGET_PAIRS = \
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++ indepsw.adb<indepsw-gnu.adb
++
++ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
++ EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
++ EH_MECHANISM=-gcc
++ THREADSLIB=-lpthread -lrt
++ GNATLIB_SHARED=gnatlib-shared-dual
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++endif
++
+ ifeq ($(strip $(filter-out darwin%,$(osys))),)
+ SO_OPTS = -shared-libgcc
+ LIBGNAT_TARGET_PAIRS = \
+--- a/gcc/ada/init.c
++++ b/gcc/ada/init.c
+@@ -615,9 +615,13 @@ __gnat_adjust_context_for_raise (int signo ATTRIBUTE_UNUSED, void *ucontext)
+ if (signo == SIGSEGV && pc && *pc == 0x00240c83)
+ mcontext->gregs[REG_ESP] += 4096 + 4 * sizeof (unsigned long);
+ #elif defined (__x86_64__)
+- unsigned long *pc = (unsigned long *)mcontext->gregs[REG_RIP];
+- /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode. */
+- if (signo == SIGSEGV && pc && (*pc & 0xffffffffff) == 0x00240c8348)
++ unsigned long long *pc = (unsigned long long *)mcontext->gregs[REG_RIP];
++ if (signo == SIGSEGV && pc
++ /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode. */
++ && ((*pc & 0xffffffffffLL) == 0x00240c8348LL
++ /* The pattern may also be "orl $0x0,(%esp)" for a probe in
++ x32 mode. */
++ || (*pc & 0xffffffffLL) == 0x00240c83LL))
+ mcontext->gregs[REG_RSP] += 4096 + 4 * sizeof (unsigned long);
+ #elif defined (__ia64__)
+ /* ??? The IA-64 unwinder doesn't compensate for signals. */
+--- a/gcc/ada/link.c
++++ b/gcc/ada/link.c
+@@ -165,7 +165,11 @@ unsigned char __gnat_objlist_file_supported = 1;
+ const char *__gnat_object_library_extension = ".a";
+ unsigned char __gnat_separate_run_path_options = 0;
+ #if defined (__x86_64)
++# if defined (__LP64__)
+ const char *__gnat_default_libgcc_subdir = "lib64";
++# else
++const char *__gnat_default_libgcc_subdir = "libx32";
++# endif
+ #else
+ const char *__gnat_default_libgcc_subdir = "lib";
+ #endif
+--- a/gcc/config.gcc
++++ b/gcc/config.gcc
+@@ -494,6 +494,10 @@ fi
+
+ case ${target} in
+ i[34567]86-*-*)
++ if test "x$with_abi" != x; then
++ echo "This target does not support --with-abi."
++ exit 1
++ fi
+ if test "x$enable_cld" = xyes; then
+ tm_defines="${tm_defines} USE_IX86_CLD=1"
+ fi
+@@ -503,7 +507,24 @@ i[34567]86-*-*)
+ tm_file="vxworks-dummy.h ${tm_file}"
+ ;;
+ x86_64-*-*)
+- tm_file="i386/biarch64.h ${tm_file}"
++ case ${with_abi} in
++ "")
++ if test "x$with_multilib_list" = xmx32; then
++ tm_file="i386/biarchx32.h ${tm_file}"
++ else
++ tm_file="i386/biarch64.h ${tm_file}"
++ fi
++ ;;
++ 64 | m64)
++ tm_file="i386/biarch64.h ${tm_file}"
++ ;;
++ x32 | mx32)
++ tm_file="i386/biarchx32.h ${tm_file}"
++ ;;
++ *)
++ echo "Unknown ABI used in --with-abi=$with_abi"
++ exit 1
++ esac
+ if test "x$enable_cld" = xyes; then
+ tm_defines="${tm_defines} USE_IX86_CLD=1"
+ fi
+@@ -1318,7 +1339,14 @@ x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu)
+ tmake_file="${tmake_file} i386/t-linux64"
+ x86_multilibs="${with_multilib_list}"
+ if test "$x86_multilibs" = "default"; then
+- x86_multilibs="m64,m32"
++ case ${with_abi} in
++ x32 | mx32)
++ x86_multilibs="mx32"
++ ;;
++ *)
++ x86_multilibs="m64,m32"
++ ;;
++ esac
+ fi
+ x86_multilibs=`echo $x86_multilibs | sed -e 's/,/ /g'`
+ for x86_multilib in ${x86_multilibs}; do
+@@ -3227,7 +3255,7 @@ case "${target}" in
+ ;;
+
+ i[34567]86-*-* | x86_64-*-*)
+- supported_defaults="arch arch_32 arch_64 cpu cpu_32 cpu_64 tune tune_32 tune_64"
++ supported_defaults="abi arch arch_32 arch_64 cpu cpu_32 cpu_64 tune tune_32 tune_64"
+ for which in arch arch_32 arch_64 cpu cpu_32 cpu_64 tune tune_32 tune_64; do
+ eval "val=\$with_$which"
+ case ${val} in
+--- a/gcc/config/arm/arm.opt
++++ b/gcc/config/arm/arm.opt
+@@ -59,7 +59,7 @@ Target Report Mask(ABORT_NORETURN)
+ Generate a call to abort if a noreturn function returns
+
+ mapcs
+-Target RejectNegative Mask(APCS_FRAME) MaskExists Undocumented
++Target RejectNegative Mask(APCS_FRAME) Undocumented
+
+ mapcs-float
+ Target Report Mask(APCS_FLOAT)
+--- a/gcc/config/cris/linux.opt
++++ b/gcc/config/cris/linux.opt
+@@ -23,7 +23,7 @@ mlinux
+ Target Report RejectNegative Undocumented
+
+ mno-gotplt
+-Target Report RejectNegative Mask(AVOID_GOTPLT) MaskExists
++Target Report RejectNegative Mask(AVOID_GOTPLT)
+ Together with -fpic and -fPIC, do not use GOTPLT references
+
+ ; There's a small added setup cost with using GOTPLT references
+--- a/gcc/config/host-linux.c
++++ b/gcc/config/host-linux.c
+@@ -68,8 +68,10 @@
+ # define TRY_EMPTY_VM_SPACE 0x10000000000
+ #elif defined(__ia64)
+ # define TRY_EMPTY_VM_SPACE 0x2000000100000000
+-#elif defined(__x86_64)
++#elif defined(__x86_64) && defined(__LP64__)
+ # define TRY_EMPTY_VM_SPACE 0x1000000000
++#elif defined(__x86_64)
++# define TRY_EMPTY_VM_SPACE 0x60000000
+ #elif defined(__i386)
+ # define TRY_EMPTY_VM_SPACE 0x60000000
+ #elif defined(__powerpc__)
+--- a/gcc/config/i386/biarch64.h
++++ b/gcc/config/i386/biarch64.h
+@@ -25,5 +25,5 @@ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+-#define TARGET_64BIT_DEFAULT OPTION_MASK_ISA_64BIT
++#define TARGET_64BIT_DEFAULT (OPTION_MASK_ISA_64BIT | OPTION_MASK_ABI_64)
+ #define TARGET_BI_ARCH 1
+--- /dev/null
++++ b/gcc/config/i386/biarchx32.h
+@@ -0,0 +1,28 @@
++/* Make configure files to produce biarch compiler defaulting to x32 mode.
++ This file must be included very first, while the OS specific file later
++ to overwrite otherwise wrong defaults.
++ Copyright (C) 2012 Free Software Foundation, Inc.
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 3, or (at your option)
++any later version.
++
++GCC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++Under Section 7 of GPL version 3, you are granted additional
++permissions described in the GCC Runtime Library Exception, version
++3.1, as published by the Free Software Foundation.
++
++You should have received a copy of the GNU General Public License and
++a copy of the GCC Runtime Library Exception along with this program;
++see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++<http://www.gnu.org/licenses/>. */
++
++#define TARGET_64BIT_DEFAULT (OPTION_MASK_ISA_64BIT | OPTION_MASK_ABI_X32)
++#define TARGET_BI_ARCH 2
+--- a/gcc/config/i386/constraints.md
++++ b/gcc/config/i386/constraints.md
+@@ -18,7 +18,7 @@
+ ;; <http://www.gnu.org/licenses/>.
+
+ ;;; Unused letters:
+-;;; B H T W
++;;; B H T
+ ;;; h jk v
+
+ ;; Integer register constraints.
+@@ -188,6 +188,16 @@
+ instructions)."
+ (match_operand 0 "x86_64_immediate_operand"))
+
++;; We use W prefix to denote any number of
++;; constant-or-symbol-reference constraints
++
++(define_constraint "Wz"
++ "32-bit unsigned integer constant, or a symbolic reference known
++ to fit that range (for zero-extending conversion operations that
++ require non-VOIDmode immediate operands)."
++ (and (match_operand 0 "x86_64_zext_immediate_operand")
++ (match_test "GET_MODE (op) != VOIDmode")))
++
+ (define_constraint "Z"
+ "32-bit unsigned integer constant, or a symbolic reference known
+ to fit that range (for immediate operands in zero-extending x86-64
+--- a/gcc/config/i386/gnu-user64.h
++++ b/gcc/config/i386/gnu-user64.h
+@@ -58,8 +58,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+
+ #if TARGET_64BIT_DEFAULT
+ #define SPEC_32 "m32"
++#if TARGET_BI_ARCH == 2
++#define SPEC_64 "m64"
++#define SPEC_X32 "m32|m64:;"
++#else
+ #define SPEC_64 "m32|mx32:;"
+ #define SPEC_X32 "mx32"
++#endif
+ #else
+ #define SPEC_32 "m64|mx32:;"
+ #define SPEC_64 "m64"
+@@ -95,7 +100,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+
+ #if TARGET_64BIT_DEFAULT
++#if TARGET_BI_ARCH == 2
++#define MULTILIB_DEFAULTS { "mx32" }
++#else
+ #define MULTILIB_DEFAULTS { "m64" }
++#endif
+ #else
+ #define MULTILIB_DEFAULTS { "m32" }
+ #endif
+@@ -126,3 +135,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ #define TARGET_THREAD_SPLIT_STACK_OFFSET \
+ (TARGET_64BIT ? (TARGET_X32 ? 0x40 : 0x70) : 0x30)
+ #endif
++
++#undef WCHAR_TYPE
++#define WCHAR_TYPE (TARGET_LP64 ? "int" : "long int")
+--- a/gcc/config/i386/i386-opts.h
++++ b/gcc/config/i386/i386-opts.h
+@@ -71,6 +71,11 @@ enum cmodel {
+ CM_LARGE_PIC /* No assumptions. */
+ };
+
++enum pmode {
++ PMODE_SI, /* Pmode == SImode. */
++ PMODE_DI /* Pmode == DImode. */
++};
++
+ enum asm_dialect {
+ ASM_ATT,
+ ASM_INTEL
+--- a/gcc/config/i386/i386.c
++++ b/gcc/config/i386/i386.c
+@@ -2448,6 +2448,8 @@ static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
+ static rtx (*ix86_gen_allocate_stack_worker) (rtx, rtx);
+ static rtx (*ix86_gen_adjust_stack_and_probe) (rtx, rtx, rtx);
+ static rtx (*ix86_gen_probe_stack_range) (rtx, rtx, rtx);
++static rtx (*ix86_gen_tls_global_dynamic_64) (rtx, rtx, rtx);
++static rtx (*ix86_gen_tls_local_dynamic_base_64) (rtx, rtx);
+
+ /* Preferred alignment for stack boundary in bits. */
+ unsigned int ix86_preferred_stack_boundary;
+@@ -2658,7 +2660,6 @@ ix86_target_string (HOST_WIDE_INT isa, int flags, const char *arch,
+ preceding options while match those first. */
+ static struct ix86_target_opts isa_opts[] =
+ {
+- { "-m64", OPTION_MASK_ISA_64BIT },
+ { "-mfma4", OPTION_MASK_ISA_FMA4 },
+ { "-mfma", OPTION_MASK_ISA_FMA },
+ { "-mxop", OPTION_MASK_ISA_XOP },
+@@ -2730,6 +2731,7 @@ ix86_target_string (HOST_WIDE_INT isa, int flags, const char *arch,
+ size_t len;
+ size_t line_len;
+ size_t sep_len;
++ const char *abi;
+
+ memset (opts, '\0', sizeof (opts));
+
+@@ -2747,6 +2749,21 @@ ix86_target_string (HOST_WIDE_INT isa, int flags, const char *arch,
+ opts[num++][1] = tune;
+ }
+
++ /* Add -m32/-m64/-mx32. */
++ if ((isa & OPTION_MASK_ISA_64BIT) != 0)
++ {
++ if ((isa & OPTION_MASK_ABI_64) != 0)
++ abi = "-m64";
++ else
++ abi = "-mx32";
++ isa &= ~ (OPTION_MASK_ISA_64BIT
++ | OPTION_MASK_ABI_64
++ | OPTION_MASK_ABI_X32);
++ }
++ else
++ abi = "-m32";
++ opts[num++][0] = abi;
++
+ /* Pick out the options in isa options. */
+ for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
+ {
+@@ -3095,6 +3112,46 @@ ix86_option_override_internal (bool main_args_p)
+ sw = "attribute";
+ }
+
++ /* Turn off both OPTION_MASK_ABI_64 and OPTION_MASK_ABI_X32 if
++ TARGET_64BIT_DEFAULT is true and TARGET_64BIT is false. */
++ if (TARGET_64BIT_DEFAULT && !TARGET_64BIT)
++ ix86_isa_flags &= ~(OPTION_MASK_ABI_64 | OPTION_MASK_ABI_X32);
++#ifdef TARGET_BI_ARCH
++ else
++ {
++#if TARGET_BI_ARCH == 1
++ /* When TARGET_BI_ARCH == 1, by default, OPTION_MASK_ABI_64
++ is on and OPTION_MASK_ABI_X32 is off. We turn off
++ OPTION_MASK_ABI_64 if OPTION_MASK_ABI_X32 is turned on by
++ -mx32. */
++ if (TARGET_X32)
++ ix86_isa_flags &= ~OPTION_MASK_ABI_64;
++#else
++ /* When TARGET_BI_ARCH == 2, by default, OPTION_MASK_ABI_X32 is
++ on and OPTION_MASK_ABI_64 is off. We turn off
++ OPTION_MASK_ABI_X32 if OPTION_MASK_ABI_64 is turned on by
++ -m64. */
++ if (TARGET_LP64)
++ ix86_isa_flags &= ~OPTION_MASK_ABI_X32;
++#endif
++ }
++#endif
++
++ if (TARGET_X32)
++ {
++ /* Always turn on OPTION_MASK_ISA_64BIT and turn off
++ OPTION_MASK_ABI_64 for TARGET_X32. */
++ ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
++ ix86_isa_flags &= ~OPTION_MASK_ABI_64;
++ }
++ else if (TARGET_LP64)
++ {
++ /* Always turn on OPTION_MASK_ISA_64BIT and turn off
++ OPTION_MASK_ABI_X32 for TARGET_LP64. */
++ ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
++ ix86_isa_flags &= ~OPTION_MASK_ABI_X32;
++ }
++
+ #ifdef SUBTARGET_OVERRIDE_OPTIONS
+ SUBTARGET_OVERRIDE_OPTIONS;
+ #endif
+@@ -3103,9 +3160,6 @@ ix86_option_override_internal (bool main_args_p)
+ SUBSUBTARGET_OVERRIDE_OPTIONS;
+ #endif
+
+- if (TARGET_X32)
+- ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
+-
+ /* -fPIC is the default for x86_64. */
+ if (TARGET_MACHO && TARGET_64BIT)
+ flag_pic = 2;
+@@ -3174,6 +3228,17 @@ ix86_option_override_internal (bool main_args_p)
+ else
+ ix86_arch_specified = 1;
+
++ if (global_options_set.x_ix86_pmode)
++ {
++ if ((TARGET_LP64 && ix86_pmode == PMODE_SI)
++ || (!TARGET_64BIT && ix86_pmode == PMODE_DI))
++ error ("address mode %qs not supported in the %s bit mode",
++ TARGET_64BIT ? "short" : "long",
++ TARGET_64BIT ? "64" : "32");
++ }
++ else
++ ix86_pmode = TARGET_LP64 ? PMODE_DI : PMODE_SI;
++
+ if (!global_options_set.x_ix86_abi)
+ ix86_abi = DEFAULT_ABI;
+
+@@ -3587,7 +3652,7 @@ ix86_option_override_internal (bool main_args_p)
+ ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
+ if (global_options_set.x_ix86_preferred_stack_boundary_arg)
+ {
+- int min = (TARGET_64BIT ? 4 : 2);
++ int min = (TARGET_64BIT ? (TARGET_SSE ? 4 : 3) : 2);
+ int max = (TARGET_SEH ? 4 : 12);
+
+ if (ix86_preferred_stack_boundary_arg < min
+@@ -3750,11 +3815,33 @@ ix86_option_override_internal (bool main_args_p)
+ if (TARGET_64BIT)
+ {
+ ix86_gen_leave = gen_leave_rex64;
++ if (Pmode == DImode)
++ {
++ ix86_gen_monitor = gen_sse3_monitor64_di;
++ ix86_gen_tls_global_dynamic_64 = gen_tls_global_dynamic_64_di;
++ ix86_gen_tls_local_dynamic_base_64
++ = gen_tls_local_dynamic_base_64_di;
++ }
++ else
++ {
++ ix86_gen_monitor = gen_sse3_monitor64_si;
++ ix86_gen_tls_global_dynamic_64 = gen_tls_global_dynamic_64_si;
++ ix86_gen_tls_local_dynamic_base_64
++ = gen_tls_local_dynamic_base_64_si;
++ }
++ }
++ else
++ {
++ ix86_gen_leave = gen_leave;
++ ix86_gen_monitor = gen_sse3_monitor;
++ }
++
++ if (Pmode == DImode)
++ {
+ ix86_gen_add3 = gen_adddi3;
+ ix86_gen_sub3 = gen_subdi3;
+ ix86_gen_sub3_carry = gen_subdi3_carry;
+ ix86_gen_one_cmpl2 = gen_one_cmpldi2;
+- ix86_gen_monitor = gen_sse3_monitor64;
+ ix86_gen_andsp = gen_anddi3;
+ ix86_gen_allocate_stack_worker = gen_allocate_stack_worker_probe_di;
+ ix86_gen_adjust_stack_and_probe = gen_adjust_stack_and_probedi;
+@@ -3762,12 +3849,10 @@ ix86_option_override_internal (bool main_args_p)
+ }
+ else
+ {
+- ix86_gen_leave = gen_leave;
+ ix86_gen_add3 = gen_addsi3;
+ ix86_gen_sub3 = gen_subsi3;
+ ix86_gen_sub3_carry = gen_subsi3_carry;
+ ix86_gen_one_cmpl2 = gen_one_cmplsi2;
+- ix86_gen_monitor = gen_sse3_monitor;
+ ix86_gen_andsp = gen_andsi3;
+ ix86_gen_allocate_stack_worker = gen_allocate_stack_worker_probe_si;
+ ix86_gen_adjust_stack_and_probe = gen_adjust_stack_and_probesi;
+@@ -7227,8 +7312,8 @@ function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
+ }
+ else if (POINTER_TYPE_P (valtype))
+ {
+- /* Pointers are always returned in Pmode. */
+- mode = Pmode;
++ /* Pointers are always returned in word_mode. */
++ mode = word_mode;
+ }
+
+ ret = construct_container (mode, orig_mode, valtype, 1,
+@@ -7299,7 +7384,8 @@ ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
+ return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
+ }
+
+-/* Pointer function arguments and return values are promoted to Pmode. */
++/* Pointer function arguments and return values are promoted to
++ word_mode. */
+
+ static enum machine_mode
+ ix86_promote_function_mode (const_tree type, enum machine_mode mode,
+@@ -7309,7 +7395,7 @@ ix86_promote_function_mode (const_tree type, enum machine_mode mode,
+ if (type != NULL_TREE && POINTER_TYPE_P (type))
+ {
+ *punsignedp = POINTERS_EXTEND_UNSIGNED;
+- return Pmode;
++ return word_mode;
+ }
+ return default_promote_function_mode (type, mode, punsignedp, fntype,
+ for_return);
+@@ -7587,12 +7673,13 @@ setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
+
+ for (i = cum->regno; i < max; i++)
+ {
+- mem = gen_rtx_MEM (Pmode,
++ mem = gen_rtx_MEM (word_mode,
+ plus_constant (save_area, i * UNITS_PER_WORD));
+ MEM_NOTRAP_P (mem) = 1;
+ set_mem_alias_set (mem, set);
+- emit_move_insn (mem, gen_rtx_REG (Pmode,
+- x86_64_int_parameter_registers[i]));
++ emit_move_insn (mem,
++ gen_rtx_REG (word_mode,
++ x86_64_int_parameter_registers[i]));
+ }
+
+ if (ix86_varargs_fpr_size)
+@@ -8652,8 +8739,11 @@ gen_push (rtx arg)
+ m->fs.cfa_offset += UNITS_PER_WORD;
+ m->fs.sp_offset += UNITS_PER_WORD;
+
++ if (REG_P (arg) && GET_MODE (arg) != word_mode)
++ arg = gen_rtx_REG (word_mode, REGNO (arg));
++
+ return gen_rtx_SET (VOIDmode,
+- gen_rtx_MEM (Pmode,
++ gen_rtx_MEM (word_mode,
+ gen_rtx_PRE_DEC (Pmode,
+ stack_pointer_rtx)),
+ arg);
+@@ -8664,9 +8754,12 @@ gen_push (rtx arg)
+ static rtx
+ gen_pop (rtx arg)
+ {
++ if (REG_P (arg) && GET_MODE (arg) != word_mode)
++ arg = gen_rtx_REG (word_mode, REGNO (arg));
++
+ return gen_rtx_SET (VOIDmode,
+ arg,
+- gen_rtx_MEM (Pmode,
++ gen_rtx_MEM (word_mode,
+ gen_rtx_POST_INC (Pmode,
+ stack_pointer_rtx)));
+ }
+@@ -9141,7 +9234,7 @@ ix86_emit_save_regs (void)
+ for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
+ if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
+ {
+- insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
++ insn = emit_insn (gen_push (gen_rtx_REG (word_mode, regno)));
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
+ }
+@@ -9221,7 +9314,7 @@ ix86_emit_save_regs_using_mov (HOST_WIDE_INT cfa_offset)
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
+ {
+- ix86_emit_save_reg_using_mov (Pmode, regno, cfa_offset);
++ ix86_emit_save_reg_using_mov (word_mode, regno, cfa_offset);
+ cfa_offset -= UNITS_PER_WORD;
+ }
+ }
+@@ -9296,7 +9389,7 @@ pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
+ rtx insn;
+ bool add_frame_related_expr = false;
+
+- if (! TARGET_64BIT)
++ if (Pmode == SImode)
+ insn = gen_pro_epilogue_adjust_stack_si_add (dest, src, offset);
+ else if (x86_64_immediate_operand (offset, DImode))
+ insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, offset);
+@@ -10159,7 +10252,7 @@ ix86_expand_prologue (void)
+ to implement macro RETURN_ADDR_RTX and intrinsic function
+ expand_builtin_return_addr etc. */
+ t = plus_constant (crtl->drap_reg, -UNITS_PER_WORD);
+- t = gen_frame_mem (Pmode, t);
++ t = gen_frame_mem (word_mode, t);
+ insn = emit_insn (gen_push (t));
+ RTX_FRAME_RELATED_P (insn) = 1;
+
+@@ -10364,7 +10457,7 @@ ix86_expand_prologue (void)
+ emit_insn (ix86_gen_allocate_stack_worker (eax, eax));
+
+ /* Use the fact that AX still contains ALLOCATE. */
+- adjust_stack_insn = (TARGET_64BIT
++ adjust_stack_insn = (Pmode == DImode
+ ? gen_pro_epilogue_adjust_stack_di_sub
+ : gen_pro_epilogue_adjust_stack_si_sub);
+
+@@ -10389,14 +10482,18 @@ ix86_expand_prologue (void)
+ if (r10_live && eax_live)
+ {
+ t = choose_baseaddr (m->fs.sp_offset - allocate);
+- emit_move_insn (r10, gen_frame_mem (Pmode, t));
++ emit_move_insn (gen_rtx_REG (word_mode, R10_REG),
++ gen_frame_mem (word_mode, t));
+ t = choose_baseaddr (m->fs.sp_offset - allocate - UNITS_PER_WORD);
+- emit_move_insn (eax, gen_frame_mem (Pmode, t));
++ emit_move_insn (gen_rtx_REG (word_mode, AX_REG),
++ gen_frame_mem (word_mode, t));
+ }
+ else if (eax_live || r10_live)
+ {
+ t = choose_baseaddr (m->fs.sp_offset - allocate);
+- emit_move_insn ((eax_live ? eax : r10), gen_frame_mem (Pmode, t));
++ emit_move_insn (gen_rtx_REG (word_mode,
++ (eax_live ? AX_REG : R10_REG)),
++ gen_frame_mem (word_mode, t));
+ }
+ }
+ gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset);
+@@ -10566,7 +10663,7 @@ ix86_emit_restore_regs_using_pop (void)
+
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
+- ix86_emit_restore_reg_using_pop (gen_rtx_REG (Pmode, regno));
++ ix86_emit_restore_reg_using_pop (gen_rtx_REG (word_mode, regno));
+ }
+
+ /* Emit code and notes for the LEAVE instruction. */
+@@ -10609,11 +10706,11 @@ ix86_emit_restore_regs_using_mov (HOST_WIDE_INT cfa_offset,
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
+ {
+- rtx reg = gen_rtx_REG (Pmode, regno);
++ rtx reg = gen_rtx_REG (word_mode, regno);
+ rtx insn, mem;
+
+ mem = choose_baseaddr (cfa_offset);
+- mem = gen_frame_mem (Pmode, mem);
++ mem = gen_frame_mem (word_mode, mem);
+ insn = emit_move_insn (reg, mem);
+
+ if (m->fs.cfa_reg == crtl->drap_reg && regno == REGNO (crtl->drap_reg))
+@@ -11223,8 +11320,8 @@ ix86_expand_split_stack_prologue (void)
+ {
+ rtx rax;
+
+- rax = gen_rtx_REG (Pmode, AX_REG);
+- emit_move_insn (rax, reg10);
++ rax = gen_rtx_REG (word_mode, AX_REG);
++ emit_move_insn (rax, gen_rtx_REG (word_mode, R10_REG));
+ use_reg (&call_fusage, rax);
+ }
+
+@@ -11303,8 +11400,8 @@ ix86_expand_split_stack_prologue (void)
+ /* If we are in 64-bit mode and this function uses a static chain,
+ we saved %r10 in %rax before calling _morestack. */
+ if (TARGET_64BIT && DECL_STATIC_CHAIN (cfun->decl))
+- emit_move_insn (gen_rtx_REG (Pmode, R10_REG),
+- gen_rtx_REG (Pmode, AX_REG));
++ emit_move_insn (gen_rtx_REG (word_mode, R10_REG),
++ gen_rtx_REG (word_mode, AX_REG));
+
+ /* If this function calls va_start, we need to store a pointer to
+ the arguments on the old stack, because they may not have been
+@@ -11522,6 +11619,12 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
+ scale = 1 << scale;
+ break;
+
++ case ZERO_EXTEND:
++ op = XEXP (op, 0);
++ if (GET_CODE (op) != UNSPEC)
++ return 0;
++ /* FALLTHRU */
++
+ case UNSPEC:
+ if (XINT (op, 1) == UNSPEC_TP
+ && TARGET_TLS_DIRECT_SEG_REFS
+@@ -11604,6 +11707,12 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
+ return 0;
+ }
+
++/* Address override works only on the (%reg) part of %fs:(%reg). */
++ if (seg != SEG_DEFAULT
++ && ((base && GET_MODE (base) != word_mode)
++ || (index && GET_MODE (index) != word_mode)))
++ return 0;
++
+ /* Extract the integral value of scale. */
+ if (scale_rtx)
+ {
+@@ -12549,15 +12658,20 @@ legitimize_pic_address (rtx orig, rtx reg)
+ /* Load the thread pointer. If TO_REG is true, force it into a register. */
+
+ static rtx
+-get_thread_pointer (bool to_reg)
++get_thread_pointer (enum machine_mode tp_mode, bool to_reg)
+ {
+ rtx tp = gen_rtx_UNSPEC (ptr_mode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
+
+- if (GET_MODE (tp) != Pmode)
+- tp = convert_to_mode (Pmode, tp, 1);
++ if (GET_MODE (tp) != tp_mode)
++ {
++ gcc_assert (GET_MODE (tp) == SImode);
++ gcc_assert (tp_mode == DImode);
++
++ tp = gen_rtx_ZERO_EXTEND (tp_mode, tp);
++ }
+
+ if (to_reg)
+- tp = copy_addr_to_reg (tp);
++ tp = copy_to_mode_reg (tp_mode, tp);
+
+ return tp;
+ }
+@@ -12609,6 +12723,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+ {
+ rtx dest, base, off;
+ rtx pic = NULL_RTX, tp = NULL_RTX;
++ enum machine_mode tp_mode = Pmode;
+ int type;
+
+ switch (model)
+@@ -12634,7 +12749,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+ else
+ emit_insn (gen_tls_dynamic_gnu2_32 (dest, x, pic));
+
+- tp = get_thread_pointer (true);
++ tp = get_thread_pointer (Pmode, true);
+ dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
+
+ set_unique_reg_note (get_last_insn (), REG_EQUAL, x);
+@@ -12648,7 +12763,8 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+ rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
+
+ start_sequence ();
+- emit_call_insn (gen_tls_global_dynamic_64 (rax, x, caddr));
++ emit_call_insn (ix86_gen_tls_global_dynamic_64 (rax, x,
++ caddr));
+ insns = get_insns ();
+ end_sequence ();
+
+@@ -12683,7 +12799,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+ else
+ emit_insn (gen_tls_dynamic_gnu2_32 (base, tmp, pic));
+
+- tp = get_thread_pointer (true);
++ tp = get_thread_pointer (Pmode, true);
+ set_unique_reg_note (get_last_insn (), REG_EQUAL,
+ gen_rtx_MINUS (Pmode, tmp, tp));
+ }
+@@ -12696,7 +12812,8 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+ rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, eqv;
+
+ start_sequence ();
+- emit_call_insn (gen_tls_local_dynamic_base_64 (rax, caddr));
++ emit_call_insn (ix86_gen_tls_local_dynamic_base_64 (rax,
++ caddr));
+ insns = get_insns ();
+ end_sequence ();
+
+@@ -12739,6 +12856,9 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+ return dest;
+ }
+
++ /* Generate DImode references to avoid %fs:(%reg32)
++ problems and linker IE->LE relaxation bug. */
++ tp_mode = DImode;
+ pic = NULL;
+ type = UNSPEC_GOTNTPOFF;
+ }
+@@ -12761,22 +12881,23 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+ type = UNSPEC_INDNTPOFF;
+ }
+
+- off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
+- off = gen_rtx_CONST (Pmode, off);
++ off = gen_rtx_UNSPEC (tp_mode, gen_rtvec (1, x), type);
++ off = gen_rtx_CONST (tp_mode, off);
+ if (pic)
+- off = gen_rtx_PLUS (Pmode, pic, off);
+- off = gen_const_mem (Pmode, off);
++ off = gen_rtx_PLUS (tp_mode, pic, off);
++ off = gen_const_mem (tp_mode, off);
+ set_mem_alias_set (off, ix86_GOT_alias_set ());
+
+ if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
+ {
+- base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
+- off = force_reg (Pmode, off);
+- return gen_rtx_PLUS (Pmode, base, off);
++ base = get_thread_pointer (tp_mode,
++ for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
++ off = force_reg (tp_mode, off);
++ return gen_rtx_PLUS (tp_mode, base, off);
+ }
+ else
+ {
+- base = get_thread_pointer (true);
++ base = get_thread_pointer (Pmode, true);
+ dest = gen_reg_rtx (Pmode);
+ emit_insn (gen_subsi3 (dest, base, off));
+ }
+@@ -12790,12 +12911,13 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
+
+ if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
+ {
+- base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
++ base = get_thread_pointer (Pmode,
++ for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
+ return gen_rtx_PLUS (Pmode, base, off);
+ }
+ else
+ {
+- base = get_thread_pointer (true);
++ base = get_thread_pointer (Pmode, true);
+ dest = gen_reg_rtx (Pmode);
+ emit_insn (gen_subsi3 (dest, base, off));
+ }
+@@ -13875,6 +13997,7 @@ get_some_local_dynamic_name (void)
+ ; -- print a semicolon (after prefixes due to bug in older gas).
+ ~ -- print "i" if TARGET_AVX2, "f" otherwise.
+ @ -- print a segment register of thread base pointer load
++ ^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode
+ */
+
+ void
+@@ -14385,6 +14508,11 @@ ix86_print_operand (FILE *file, rtx x, int code)
+ putc (TARGET_AVX2 ? 'i' : 'f', file);
+ return;
+
++ case '^':
++ if (TARGET_64BIT && Pmode != word_mode)
++ fputs ("addr32 ", file);
++ return;
++
+ default:
+ output_operand_lossage ("invalid operand code '%c'", code);
+ }
+@@ -14524,8 +14652,8 @@ ix86_print_operand (FILE *file, rtx x, int code)
+ static bool
+ ix86_print_operand_punct_valid_p (unsigned char code)
+ {
+- return (code == '@' || code == '*' || code == '+'
+- || code == '&' || code == ';' || code == '~');
++ return (code == '@' || code == '*' || code == '+' || code == '&'
++ || code == ';' || code == '~' || code == '^');
+ }
+
+ /* Print a memory operand whose address is ADDR. */
+@@ -20428,7 +20556,7 @@ ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
+ gcc_assert (ok);
+
+ operand = copy_rtx (operand);
+- PUT_MODE (operand, Pmode);
++ PUT_MODE (operand, word_mode);
+ parts[0] = parts[1] = parts[2] = parts[3] = operand;
+ return size;
+ }
+@@ -20581,7 +20709,7 @@ ix86_split_long_move (rtx operands[])
+ if (push_operand (operands[0], VOIDmode))
+ {
+ operands[0] = copy_rtx (operands[0]);
+- PUT_MODE (operands[0], Pmode);
++ PUT_MODE (operands[0], word_mode);
+ }
+ else
+ operands[0] = gen_lowpart (DImode, operands[0]);
+@@ -21136,14 +21264,9 @@ ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
+ rtx
+ ix86_zero_extend_to_Pmode (rtx exp)
+ {
+- rtx r;
+- if (GET_MODE (exp) == VOIDmode)
+- return force_reg (Pmode, exp);
+- if (GET_MODE (exp) == Pmode)
+- return copy_to_mode_reg (Pmode, exp);
+- r = gen_reg_rtx (Pmode);
+- emit_insn (gen_zero_extendsidi2 (r, exp));
+- return r;
++ if (GET_MODE (exp) != Pmode)
++ exp = convert_to_mode (Pmode, exp, 1);
++ return force_reg (Pmode, exp);
+ }
+
+ /* Divide COUNTREG by SCALE. */
+@@ -22171,11 +22294,11 @@ ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
+ gcc_unreachable ();
+ case loop:
+ need_zero_guard = true;
+- size_needed = GET_MODE_SIZE (Pmode);
++ size_needed = GET_MODE_SIZE (word_mode);
+ break;
+ case unrolled_loop:
+ need_zero_guard = true;
+- size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
++ size_needed = GET_MODE_SIZE (word_mode) * (TARGET_64BIT ? 4 : 2);
+ break;
+ case rep_prefix_8_byte:
+ size_needed = 8;
+@@ -22341,13 +22464,13 @@ ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
+ break;
+ case loop:
+ expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
+- count_exp, Pmode, 1, expected_size);
++ count_exp, word_mode, 1, expected_size);
+ break;
+ case unrolled_loop:
+ /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
+ registers for 4 temporaries anyway. */
+ expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
+- count_exp, Pmode, TARGET_64BIT ? 4 : 2,
++ count_exp, word_mode, TARGET_64BIT ? 4 : 2,
+ expected_size);
+ break;
+ case rep_prefix_8_byte:
+@@ -22559,11 +22682,11 @@ ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
+ gcc_unreachable ();
+ case loop:
+ need_zero_guard = true;
+- size_needed = GET_MODE_SIZE (Pmode);
++ size_needed = GET_MODE_SIZE (word_mode);
+ break;
+ case unrolled_loop:
+ need_zero_guard = true;
+- size_needed = GET_MODE_SIZE (Pmode) * 4;
++ size_needed = GET_MODE_SIZE (word_mode) * 4;
+ break;
+ case rep_prefix_8_byte:
+ size_needed = 8;
+@@ -22734,11 +22857,11 @@ ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
+ break;
+ case loop:
+ expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
+- count_exp, Pmode, 1, expected_size);
++ count_exp, word_mode, 1, expected_size);
+ break;
+ case unrolled_loop:
+ expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
+- count_exp, Pmode, 4, expected_size);
++ count_exp, word_mode, 4, expected_size);
+ break;
+ case rep_prefix_8_byte:
+ expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
+@@ -23101,13 +23224,13 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
+ && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
+ fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
+ else if (sibcall
+- ? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
+- : !call_insn_operand (XEXP (fnaddr, 0), Pmode))
++ ? !sibcall_insn_operand (XEXP (fnaddr, 0), word_mode)
++ : !call_insn_operand (XEXP (fnaddr, 0), word_mode))
+ {
+ fnaddr = XEXP (fnaddr, 0);
+- if (GET_MODE (fnaddr) != Pmode)
+- fnaddr = convert_to_mode (Pmode, fnaddr, 1);
+- fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (Pmode, fnaddr));
++ if (GET_MODE (fnaddr) != word_mode)
++ fnaddr = convert_to_mode (word_mode, fnaddr, 1);
++ fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (word_mode, fnaddr));
+ }
+
+ vec_len = 0;
+@@ -24421,10 +24544,13 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
+ /* Load the function address to r11. Try to load address using
+ the shorter movl instead of movabs. We may want to support
+ movq for kernel mode, but kernel does not use trampolines at
+- the moment. */
+- if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
++ the moment. FNADDR is a 32bit address and may not be in
++ DImode when ptr_mode == SImode. Always use movl in this
++ case. */
++ if (ptr_mode == SImode
++ || x86_64_zext_immediate_operand (fnaddr, VOIDmode))
+ {
+- fnaddr = copy_to_mode_reg (DImode, fnaddr);
++ fnaddr = copy_to_mode_reg (Pmode, fnaddr);
+
+ mem = adjust_address (m_tramp, HImode, offset);
+ emit_move_insn (mem, gen_int_mode (0xbb41, HImode));
+@@ -24443,9 +24569,9 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
+ offset += 10;
+ }
+
+- /* Load static chain using movabs to r10. Use the
+- shorter movl instead of movabs for x32. */
+- if (TARGET_X32)
++ /* Load static chain using movabs to r10. Use the shorter movl
++ instead of movabs when ptr_mode == SImode. */
++ if (ptr_mode == SImode)
+ {
+ opcode = 0xba41;
+ size = 6;
+@@ -32082,7 +32208,7 @@ x86_this_parameter (tree function)
+ parm_regs = x86_64_ms_abi_int_parameter_registers;
+ else
+ parm_regs = x86_64_int_parameter_registers;
+- return gen_rtx_REG (DImode, parm_regs[aggr]);
++ return gen_rtx_REG (Pmode, parm_regs[aggr]);
+ }
+
+ nregs = ix86_function_regparm (type, function);
+--- a/gcc/config/i386/i386.h
++++ b/gcc/config/i386/i386.h
+@@ -42,7 +42,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ /* Redefines for option macros. */
+
+ #define TARGET_64BIT OPTION_ISA_64BIT
+-#define TARGET_X32 OPTION_ISA_X32
+ #define TARGET_MMX OPTION_ISA_MMX
+ #define TARGET_3DNOW OPTION_ISA_3DNOW
+ #define TARGET_3DNOW_A OPTION_ISA_3DNOW_A
+@@ -76,7 +75,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ #define TARGET_RDRND OPTION_ISA_RDRND
+ #define TARGET_F16C OPTION_ISA_F16C
+
+-#define TARGET_LP64 (TARGET_64BIT && !TARGET_X32)
++#define TARGET_LP64 OPTION_ABI_64
++#define TARGET_X32 OPTION_ABI_X32
+
+ /* SSE4.1 defines round instructions */
+ #define OPTION_MASK_ISA_ROUND OPTION_MASK_ISA_SSE4_1
+@@ -705,7 +705,7 @@ enum target_cpu_default
+ #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
+
+ /* Minimum stack boundary. */
+-#define MIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
++#define MIN_STACK_BOUNDARY (TARGET_64BIT ? (TARGET_SSE ? 128 : 64) : 32)
+
+ /* Boundary (in *bits*) on which the stack pointer prefers to be
+ aligned; the compiler cannot rely on having this alignment. */
+@@ -1774,7 +1774,7 @@ do { \
+ /* Specify the machine mode that pointers have.
+ After generation of rtl, the compiler makes no further distinction
+ between pointers and any other objects of this machine mode. */
+-#define Pmode (TARGET_64BIT ? DImode : SImode)
++#define Pmode (ix86_pmode == PMODE_DI ? DImode : SImode)
+
+ /* A C expression whose value is zero if pointers that need to be extended
+ from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and
+--- a/gcc/config/i386/i386.md
++++ b/gcc/config/i386/i386.md
+@@ -61,7 +61,9 @@
+ ;; Y -- print condition for XOP pcom* instruction.
+ ;; + -- print a branch hint as 'cs' or 'ds' prefix
+ ;; ; -- print a semicolon (after prefixes due to bug in older gas).
++;; ~ -- print "i" if TARGET_AVX2, "f" otherwise.
+ ;; @ -- print a segment register of thread base pointer load
++;; ^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode
+
+ (define_c_enum "unspec" [
+ ;; Relocation specifiers
+@@ -901,6 +903,11 @@
+ ;; pointer-sized quantities. Exactly one of the two alternatives will match.
+ (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
+
++;; This mode iterator allows :W to be used for patterns that operate on
++;; word_mode sized quantities.
++(define_mode_iterator W
++ [(SI "word_mode == SImode") (DI "word_mode == DImode")])
++
+ ;; This mode iterator allows :PTR to be used for patterns that operate on
+ ;; ptr_mode sized quantities.
+ (define_mode_iterator PTR
+@@ -1709,8 +1716,8 @@
+ (set_attr "mode" "SI")])
+
+ (define_insn "*push<mode>2_prologue"
+- [(set (match_operand:P 0 "push_operand" "=<")
+- (match_operand:P 1 "general_no_elim_operand" "r<i>*m"))
++ [(set (match_operand:W 0 "push_operand" "=<")
++ (match_operand:W 1 "general_no_elim_operand" "r<i>*m"))
+ (clobber (mem:BLK (scratch)))]
+ ""
+ "push{<imodesuffix>}\t%1"
+@@ -1718,16 +1725,16 @@
+ (set_attr "mode" "<MODE>")])
+
+ (define_insn "*pop<mode>1"
+- [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
+- (match_operand:P 1 "pop_operand" ">"))]
++ [(set (match_operand:W 0 "nonimmediate_operand" "=r*m")
++ (match_operand:W 1 "pop_operand" ">"))]
+ ""
+ "pop{<imodesuffix>}\t%0"
+ [(set_attr "type" "pop")
+ (set_attr "mode" "<MODE>")])
+
+ (define_insn "*pop<mode>1_epilogue"
+- [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
+- (match_operand:P 1 "pop_operand" ">"))
++ [(set (match_operand:W 0 "nonimmediate_operand" "=r*m")
++ (match_operand:W 1 "pop_operand" ">"))
+ (clobber (mem:BLK (scratch)))]
+ ""
+ "pop{<imodesuffix>}\t%0"
+@@ -3399,9 +3406,9 @@
+ })
+
+ (define_insn "*zero_extendsidi2_rex64"
+- [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o,?*Ym,?*y,?*Yi,*x")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=r ,o,?*Ym,?*y,?*Yi,*x")
+ (zero_extend:DI
+- (match_operand:SI 1 "nonimmediate_operand" "rm,0,r ,m ,r ,m")))]
++ (match_operand:SI 1 "x86_64_zext_general_operand" "rmWz,0,r ,m ,r ,m")))]
+ "TARGET_64BIT"
+ "@
+ mov{l}\t{%1, %k0|%k0, %1}
+@@ -11126,10 +11133,15 @@
+ (set_attr "modrm" "0")])
+
+ (define_expand "indirect_jump"
+- [(set (pc) (match_operand 0 "indirect_branch_operand" ""))])
++ [(set (pc) (match_operand 0 "indirect_branch_operand" ""))]
++ ""
++{
++ if (TARGET_X32)
++ operands[0] = convert_memory_address (word_mode, operands[0]);
++})
+
+ (define_insn "*indirect_jump"
+- [(set (pc) (match_operand:P 0 "indirect_branch_operand" "rw"))]
++ [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw"))]
+ ""
+ "jmp\t%A0"
+ [(set_attr "type" "ibr")
+@@ -11171,12 +11183,13 @@
+ operands[0] = expand_simple_binop (Pmode, code, op0, op1, NULL_RTX, 0,
+ OPTAB_DIRECT);
+ }
+- else if (TARGET_X32)
+- operands[0] = convert_memory_address (Pmode, operands[0]);
++
++ if (TARGET_X32)
++ operands[0] = convert_memory_address (word_mode, operands[0]);
+ })
+
+ (define_insn "*tablejump_1"
+- [(set (pc) (match_operand:P 0 "indirect_branch_operand" "rw"))
++ [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw"))
+ (use (label_ref (match_operand 1 "" "")))]
+ ""
+ "jmp\t%A0"
+@@ -11264,7 +11277,7 @@
+ })
+
+ (define_insn_and_split "*call_vzeroupper"
+- [(call (mem:QI (match_operand:P 0 "call_insn_operand" "<c>zw"))
++ [(call (mem:QI (match_operand:W 0 "call_insn_operand" "<c>zw"))
+ (match_operand 1 "" ""))
+ (unspec [(match_operand 2 "const_int_operand" "")]
+ UNSPEC_CALL_NEEDS_VZEROUPPER)]
+@@ -11276,7 +11289,7 @@
+ [(set_attr "type" "call")])
+
+ (define_insn "*call"
+- [(call (mem:QI (match_operand:P 0 "call_insn_operand" "<c>zw"))
++ [(call (mem:QI (match_operand:W 0 "call_insn_operand" "<c>zw"))
+ (match_operand 1 "" ""))]
+ "!SIBLING_CALL_P (insn)"
+ "* return ix86_output_call_insn (insn, operands[0]);"
+@@ -11328,7 +11341,7 @@
+ [(set_attr "type" "call")])
+
+ (define_insn_and_split "*sibcall_vzeroupper"
+- [(call (mem:QI (match_operand:P 0 "sibcall_insn_operand" "Uz"))
++ [(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "Uz"))
+ (match_operand 1 "" ""))
+ (unspec [(match_operand 2 "const_int_operand" "")]
+ UNSPEC_CALL_NEEDS_VZEROUPPER)]
+@@ -11340,7 +11353,7 @@
+ [(set_attr "type" "call")])
+
+ (define_insn "*sibcall"
+- [(call (mem:QI (match_operand:P 0 "sibcall_insn_operand" "Uz"))
++ [(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "Uz"))
+ (match_operand 1 "" ""))]
+ "SIBLING_CALL_P (insn)"
+ "* return ix86_output_call_insn (insn, operands[0]);"
+@@ -11437,7 +11450,7 @@
+
+ (define_insn_and_split "*call_value_vzeroupper"
+ [(set (match_operand 0 "" "")
+- (call (mem:QI (match_operand:P 1 "call_insn_operand" "<c>zw"))
++ (call (mem:QI (match_operand:W 1 "call_insn_operand" "<c>zw"))
+ (match_operand 2 "" "")))
+ (unspec [(match_operand 3 "const_int_operand" "")]
+ UNSPEC_CALL_NEEDS_VZEROUPPER)]
+@@ -11450,7 +11463,7 @@
+
+ (define_insn "*call_value"
+ [(set (match_operand 0 "" "")
+- (call (mem:QI (match_operand:P 1 "call_insn_operand" "<c>zw"))
++ (call (mem:QI (match_operand:W 1 "call_insn_operand" "<c>zw"))
+ (match_operand 2 "" "")))]
+ "!SIBLING_CALL_P (insn)"
+ "* return ix86_output_call_insn (insn, operands[1]);"
+@@ -11458,7 +11471,7 @@
+
+ (define_insn_and_split "*sibcall_value_vzeroupper"
+ [(set (match_operand 0 "" "")
+- (call (mem:QI (match_operand:P 1 "sibcall_insn_operand" "Uz"))
++ (call (mem:QI (match_operand:W 1 "sibcall_insn_operand" "Uz"))
+ (match_operand 2 "" "")))
+ (unspec [(match_operand 3 "const_int_operand" "")]
+ UNSPEC_CALL_NEEDS_VZEROUPPER)]
+@@ -11471,7 +11484,7 @@
+
+ (define_insn "*sibcall_value"
+ [(set (match_operand 0 "" "")
+- (call (mem:QI (match_operand:P 1 "sibcall_insn_operand" "Uz"))
++ (call (mem:QI (match_operand:W 1 "sibcall_insn_operand" "Uz"))
+ (match_operand 2 "" "")))]
+ "SIBLING_CALL_P (insn)"
+ "* return ix86_output_call_insn (insn, operands[1]);"
+@@ -12576,7 +12589,7 @@
+ [(set (match_operand:SI 0 "register_operand" "=a")
+ (unspec:SI
+ [(match_operand:SI 1 "register_operand" "b")
+- (match_operand:SI 2 "tls_symbolic_operand" "")
++ (match_operand 2 "tls_symbolic_operand" "")
+ (match_operand:SI 3 "constant_call_address_operand" "z")]
+ UNSPEC_TLS_GD))
+ (clobber (match_scratch:SI 4 "=d"))
+@@ -12601,20 +12614,20 @@
+ [(parallel
+ [(set (match_operand:SI 0 "register_operand" "")
+ (unspec:SI [(match_operand:SI 2 "register_operand" "")
+- (match_operand:SI 1 "tls_symbolic_operand" "")
++ (match_operand 1 "tls_symbolic_operand" "")
+ (match_operand:SI 3 "constant_call_address_operand" "")]
+ UNSPEC_TLS_GD))
+ (clobber (match_scratch:SI 4 ""))
+ (clobber (match_scratch:SI 5 ""))
+ (clobber (reg:CC FLAGS_REG))])])
+
+-(define_insn "*tls_global_dynamic_64"
+- [(set (match_operand:DI 0 "register_operand" "=a")
+- (call:DI
+- (mem:QI (match_operand:DI 2 "constant_call_address_operand" "z"))
+- (match_operand:DI 3 "" "")))
+- (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]
+- UNSPEC_TLS_GD)]
++(define_insn "*tls_global_dynamic_64_<mode>"
++ [(set (match_operand:P 0 "register_operand" "=a")
++ (call:P
++ (mem:QI (match_operand:P 2 "constant_call_address_operand" "z"))
++ (match_operand:P 3 "" "")))
++ (unspec:P [(match_operand 1 "tls_symbolic_operand" "")]
++ UNSPEC_TLS_GD)]
+ "TARGET_64BIT"
+ {
+ if (!TARGET_X32)
+@@ -12631,14 +12644,15 @@
+ (set (attr "length")
+ (symbol_ref "TARGET_X32 ? 15 : 16"))])
+
+-(define_expand "tls_global_dynamic_64"
++(define_expand "tls_global_dynamic_64_<mode>"
+ [(parallel
+- [(set (match_operand:DI 0 "register_operand" "")
+- (call:DI
+- (mem:QI (match_operand:DI 2 "constant_call_address_operand" ""))
++ [(set (match_operand:P 0 "register_operand" "")
++ (call:P
++ (mem:QI (match_operand:P 2 "constant_call_address_operand" ""))
+ (const_int 0)))
+- (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]
+- UNSPEC_TLS_GD)])])
++ (unspec:P [(match_operand 1 "tls_symbolic_operand" "")]
++ UNSPEC_TLS_GD)])]
++ "TARGET_64BIT")
+
+ (define_insn "*tls_local_dynamic_base_32_gnu"
+ [(set (match_operand:SI 0 "register_operand" "=a")
+@@ -12675,12 +12689,12 @@
+ (clobber (match_scratch:SI 4 ""))
+ (clobber (reg:CC FLAGS_REG))])])
+
+-(define_insn "*tls_local_dynamic_base_64"
+- [(set (match_operand:DI 0 "register_operand" "=a")
+- (call:DI
+- (mem:QI (match_operand:DI 1 "constant_call_address_operand" "z"))
+- (match_operand:DI 2 "" "")))
+- (unspec:DI [(const_int 0)] UNSPEC_TLS_LD_BASE)]
++(define_insn "*tls_local_dynamic_base_64_<mode>"
++ [(set (match_operand:P 0 "register_operand" "=a")
++ (call:P
++ (mem:QI (match_operand:P 1 "constant_call_address_operand" "z"))
++ (match_operand:P 2 "" "")))
++ (unspec:P [(const_int 0)] UNSPEC_TLS_LD_BASE)]
+ "TARGET_64BIT"
+ {
+ output_asm_insn
+@@ -12692,13 +12706,14 @@
+ [(set_attr "type" "multi")
+ (set_attr "length" "12")])
+
+-(define_expand "tls_local_dynamic_base_64"
++(define_expand "tls_local_dynamic_base_64_<mode>"
+ [(parallel
+- [(set (match_operand:DI 0 "register_operand" "")
+- (call:DI
+- (mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
++ [(set (match_operand:P 0 "register_operand" "")
++ (call:P
++ (mem:QI (match_operand:P 1 "constant_call_address_operand" ""))
+ (const_int 0)))
+- (unspec:DI [(const_int 0)] UNSPEC_TLS_LD_BASE)])])
++ (unspec:P [(const_int 0)] UNSPEC_TLS_LD_BASE)])]
++ "TARGET_64BIT")
+
+ ;; Local dynamic of a single variable is a lose. Show combine how
+ ;; to convert that back to global dynamic.
+@@ -12710,7 +12725,7 @@
+ (match_operand:SI 2 "constant_call_address_operand" "z")]
+ UNSPEC_TLS_LD_BASE)
+ (const:SI (unspec:SI
+- [(match_operand:SI 3 "tls_symbolic_operand" "")]
++ [(match_operand 3 "tls_symbolic_operand" "")]
+ UNSPEC_DTPOFF))))
+ (clobber (match_scratch:SI 4 "=d"))
+ (clobber (match_scratch:SI 5 "=c"))
+@@ -12808,7 +12823,7 @@
+ (define_insn "tls_initial_exec_64_sun"
+ [(set (match_operand:DI 0 "register_operand" "=a")
+ (unspec:DI
+- [(match_operand:DI 1 "tls_symbolic_operand" "")]
++ [(match_operand 1 "tls_symbolic_operand" "")]
+ UNSPEC_TLS_IE_SUN))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT && TARGET_SUN_TLS"
+@@ -12825,7 +12840,7 @@
+ [(set (match_dup 3)
+ (plus:SI (match_operand:SI 2 "register_operand" "")
+ (const:SI
+- (unspec:SI [(match_operand:SI 1 "tls_symbolic_operand" "")]
++ (unspec:SI [(match_operand 1 "tls_symbolic_operand" "")]
+ UNSPEC_TLSDESC))))
+ (parallel
+ [(set (match_operand:SI 0 "register_operand" "")
+@@ -12843,7 +12858,7 @@
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (plus:SI (match_operand:SI 1 "register_operand" "b")
+ (const:SI
+- (unspec:SI [(match_operand:SI 2 "tls_symbolic_operand" "")]
++ (unspec:SI [(match_operand 2 "tls_symbolic_operand" "")]
+ UNSPEC_TLSDESC))))]
+ "!TARGET_64BIT && TARGET_GNU2_TLS"
+ "lea{l}\t{%E2@TLSDESC(%1), %0|%0, %E2@TLSDESC[%1]}"
+@@ -12854,7 +12869,7 @@
+
+ (define_insn "*tls_dynamic_gnu2_call_32"
+ [(set (match_operand:SI 0 "register_operand" "=a")
+- (unspec:SI [(match_operand:SI 1 "tls_symbolic_operand" "")
++ (unspec:SI [(match_operand 1 "tls_symbolic_operand" "")
+ (match_operand:SI 2 "register_operand" "0")
+ ;; we have to make sure %ebx still points to the GOT
+ (match_operand:SI 3 "register_operand" "b")
+@@ -12870,13 +12885,13 @@
+ (define_insn_and_split "*tls_dynamic_gnu2_combine_32"
+ [(set (match_operand:SI 0 "register_operand" "=&a")
+ (plus:SI
+- (unspec:SI [(match_operand:SI 3 "tls_modbase_operand" "")
++ (unspec:SI [(match_operand 3 "tls_modbase_operand" "")
+ (match_operand:SI 4 "" "")
+ (match_operand:SI 2 "register_operand" "b")
+ (reg:SI SP_REG)]
+ UNSPEC_TLSDESC)
+ (const:SI (unspec:SI
+- [(match_operand:SI 1 "tls_symbolic_operand" "")]
++ [(match_operand 1 "tls_symbolic_operand" "")]
+ UNSPEC_DTPOFF))))
+ (clobber (reg:CC FLAGS_REG))]
+ "!TARGET_64BIT && TARGET_GNU2_TLS"
+@@ -12930,7 +12945,7 @@
+ (define_insn_and_split "*tls_dynamic_gnu2_combine_64"
+ [(set (match_operand:DI 0 "register_operand" "=&a")
+ (plus:DI
+- (unspec:DI [(match_operand:DI 2 "tls_modbase_operand" "")
++ (unspec:DI [(match_operand 2 "tls_modbase_operand" "")
+ (match_operand:DI 3 "" "")
+ (reg:DI SP_REG)]
+ UNSPEC_TLSDESC)
+@@ -15729,17 +15744,17 @@
+ "ix86_current_function_needs_cld = 1;")
+
+ (define_insn "*strmovdi_rex_1"
+- [(set (mem:DI (match_operand:DI 2 "register_operand" "0"))
+- (mem:DI (match_operand:DI 3 "register_operand" "1")))
+- (set (match_operand:DI 0 "register_operand" "=D")
+- (plus:DI (match_dup 2)
+- (const_int 8)))
+- (set (match_operand:DI 1 "register_operand" "=S")
+- (plus:DI (match_dup 3)
+- (const_int 8)))]
++ [(set (mem:DI (match_operand:P 2 "register_operand" "0"))
++ (mem:DI (match_operand:P 3 "register_operand" "1")))
++ (set (match_operand:P 0 "register_operand" "=D")
++ (plus:P (match_dup 2)
++ (const_int 8)))
++ (set (match_operand:P 1 "register_operand" "=S")
++ (plus:P (match_dup 3)
++ (const_int 8)))]
+ "TARGET_64BIT
+ && !(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "movsq"
++ "%^movsq"
+ [(set_attr "type" "str")
+ (set_attr "memory" "both")
+ (set_attr "mode" "DI")])
+@@ -15754,7 +15769,7 @@
+ (plus:P (match_dup 3)
+ (const_int 4)))]
+ "!(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "movs{l|d}"
++ "%^movs{l|d}"
+ [(set_attr "type" "str")
+ (set_attr "memory" "both")
+ (set_attr "mode" "SI")])
+@@ -15769,7 +15784,7 @@
+ (plus:P (match_dup 3)
+ (const_int 2)))]
+ "!(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "movsw"
++ "%^movsw"
+ [(set_attr "type" "str")
+ (set_attr "memory" "both")
+ (set_attr "mode" "HI")])
+@@ -15784,7 +15799,7 @@
+ (plus:P (match_dup 3)
+ (const_int 1)))]
+ "!(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "movsb"
++ "%^movsb"
+ [(set_attr "type" "str")
+ (set_attr "memory" "both")
+ (set (attr "prefix_rex")
+@@ -15807,20 +15822,20 @@
+ "ix86_current_function_needs_cld = 1;")
+
+ (define_insn "*rep_movdi_rex64"
+- [(set (match_operand:DI 2 "register_operand" "=c") (const_int 0))
+- (set (match_operand:DI 0 "register_operand" "=D")
+- (plus:DI (ashift:DI (match_operand:DI 5 "register_operand" "2")
+- (const_int 3))
+- (match_operand:DI 3 "register_operand" "0")))
+- (set (match_operand:DI 1 "register_operand" "=S")
+- (plus:DI (ashift:DI (match_dup 5) (const_int 3))
+- (match_operand:DI 4 "register_operand" "1")))
++ [(set (match_operand:P 2 "register_operand" "=c") (const_int 0))
++ (set (match_operand:P 0 "register_operand" "=D")
++ (plus:P (ashift:P (match_operand:P 5 "register_operand" "2")
++ (const_int 3))
++ (match_operand:P 3 "register_operand" "0")))
++ (set (match_operand:P 1 "register_operand" "=S")
++ (plus:P (ashift:P (match_dup 5) (const_int 3))
++ (match_operand:P 4 "register_operand" "1")))
+ (set (mem:BLK (match_dup 3))
+ (mem:BLK (match_dup 4)))
+ (use (match_dup 5))]
+ "TARGET_64BIT
+ && !(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "rep{%;} movsq"
++ "%^rep{%;} movsq"
+ [(set_attr "type" "str")
+ (set_attr "prefix_rep" "1")
+ (set_attr "memory" "both")
+@@ -15839,7 +15854,7 @@
+ (mem:BLK (match_dup 4)))
+ (use (match_dup 5))]
+ "!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "rep{%;} movs{l|d}"
++ "%^rep{%;} movs{l|d}"
+ [(set_attr "type" "str")
+ (set_attr "prefix_rep" "1")
+ (set_attr "memory" "both")
+@@ -15856,7 +15871,7 @@
+ (mem:BLK (match_dup 4)))
+ (use (match_dup 5))]
+ "!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "rep{%;} movsb"
++ "%^rep{%;} movsb"
+ [(set_attr "type" "str")
+ (set_attr "prefix_rep" "1")
+ (set_attr "memory" "both")
+@@ -15917,14 +15932,14 @@
+ "ix86_current_function_needs_cld = 1;")
+
+ (define_insn "*strsetdi_rex_1"
+- [(set (mem:DI (match_operand:DI 1 "register_operand" "0"))
++ [(set (mem:DI (match_operand:P 1 "register_operand" "0"))
+ (match_operand:DI 2 "register_operand" "a"))
+- (set (match_operand:DI 0 "register_operand" "=D")
+- (plus:DI (match_dup 1)
+- (const_int 8)))]
++ (set (match_operand:P 0 "register_operand" "=D")
++ (plus:P (match_dup 1)
++ (const_int 8)))]
+ "TARGET_64BIT
+ && !(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
+- "stosq"
++ "%^stosq"
+ [(set_attr "type" "str")
+ (set_attr "memory" "store")
+ (set_attr "mode" "DI")])
+@@ -15936,7 +15951,7 @@
+ (plus:P (match_dup 1)
+ (const_int 4)))]
+ "!(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
+- "stos{l|d}"
++ "%^stos{l|d}"
+ [(set_attr "type" "str")
+ (set_attr "memory" "store")
+ (set_attr "mode" "SI")])
+@@ -15948,7 +15963,7 @@
+ (plus:P (match_dup 1)
+ (const_int 2)))]
+ "!(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
+- "stosw"
++ "%^stosw"
+ [(set_attr "type" "str")
+ (set_attr "memory" "store")
+ (set_attr "mode" "HI")])
+@@ -15960,7 +15975,7 @@
+ (plus:P (match_dup 1)
+ (const_int 1)))]
+ "!(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
+- "stosb"
++ "%^stosb"
+ [(set_attr "type" "str")
+ (set_attr "memory" "store")
+ (set (attr "prefix_rex")
+@@ -15981,18 +15996,18 @@
+ "ix86_current_function_needs_cld = 1;")
+
+ (define_insn "*rep_stosdi_rex64"
+- [(set (match_operand:DI 1 "register_operand" "=c") (const_int 0))
+- (set (match_operand:DI 0 "register_operand" "=D")
+- (plus:DI (ashift:DI (match_operand:DI 4 "register_operand" "1")
+- (const_int 3))
+- (match_operand:DI 3 "register_operand" "0")))
++ [(set (match_operand:P 1 "register_operand" "=c") (const_int 0))
++ (set (match_operand:P 0 "register_operand" "=D")
++ (plus:P (ashift:P (match_operand:P 4 "register_operand" "1")
++ (const_int 3))
++ (match_operand:P 3 "register_operand" "0")))
+ (set (mem:BLK (match_dup 3))
+ (const_int 0))
+ (use (match_operand:DI 2 "register_operand" "a"))
+ (use (match_dup 4))]
+ "TARGET_64BIT
+ && !(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
+- "rep{%;} stosq"
++ "%^rep{%;} stosq"
+ [(set_attr "type" "str")
+ (set_attr "prefix_rep" "1")
+ (set_attr "memory" "store")
+@@ -16009,7 +16024,7 @@
+ (use (match_operand:SI 2 "register_operand" "a"))
+ (use (match_dup 4))]
+ "!(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
+- "rep{%;} stos{l|d}"
++ "%^rep{%;} stos{l|d}"
+ [(set_attr "type" "str")
+ (set_attr "prefix_rep" "1")
+ (set_attr "memory" "store")
+@@ -16025,7 +16040,7 @@
+ (use (match_operand:QI 2 "register_operand" "a"))
+ (use (match_dup 4))]
+ "!(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
+- "rep{%;} stosb"
++ "%^rep{%;} stosb"
+ [(set_attr "type" "str")
+ (set_attr "prefix_rep" "1")
+ (set_attr "memory" "store")
+@@ -16146,7 +16161,7 @@
+ (clobber (match_operand:P 1 "register_operand" "=D"))
+ (clobber (match_operand:P 2 "register_operand" "=c"))]
+ "!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "repz{%;} cmpsb"
++ "%^repz{%;} cmpsb"
+ [(set_attr "type" "str")
+ (set_attr "mode" "QI")
+ (set (attr "prefix_rex")
+@@ -16186,7 +16201,7 @@
+ (clobber (match_operand:P 1 "register_operand" "=D"))
+ (clobber (match_operand:P 2 "register_operand" "=c"))]
+ "!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
+- "repz{%;} cmpsb"
++ "%^repz{%;} cmpsb"
+ [(set_attr "type" "str")
+ (set_attr "mode" "QI")
+ (set (attr "prefix_rex")
+@@ -16227,7 +16242,7 @@
+ (clobber (match_operand:P 1 "register_operand" "=D"))
+ (clobber (reg:CC FLAGS_REG))]
+ "!(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
+- "repnz{%;} scasb"
++ "%^repnz{%;} scasb"
+ [(set_attr "type" "str")
+ (set_attr "mode" "QI")
+ (set (attr "prefix_rex")
+@@ -17372,131 +17387,131 @@
+ ;; alternative when no register is available later.
+
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))
+ (clobber (mem:BLK (scratch)))])]
+ "(TARGET_SINGLE_PUSH || optimize_insn_for_size_p ())
+- && INTVAL (operands[0]) == -GET_MODE_SIZE (Pmode)"
++ && INTVAL (operands[0]) == -GET_MODE_SIZE (word_mode)"
+ [(clobber (match_dup 1))
+- (parallel [(set (mem:P (pre_dec:P (reg:P SP_REG))) (match_dup 1))
++ (parallel [(set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
+ (clobber (mem:BLK (scratch)))])])
+
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))
+ (clobber (mem:BLK (scratch)))])]
+ "(TARGET_DOUBLE_PUSH || optimize_insn_for_size_p ())
+- && INTVAL (operands[0]) == -2*GET_MODE_SIZE (Pmode)"
++ && INTVAL (operands[0]) == -2*GET_MODE_SIZE (word_mode)"
+ [(clobber (match_dup 1))
+- (set (mem:P (pre_dec:P (reg:P SP_REG))) (match_dup 1))
+- (parallel [(set (mem:P (pre_dec:P (reg:P SP_REG))) (match_dup 1))
++ (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
++ (parallel [(set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
+ (clobber (mem:BLK (scratch)))])])
+
+ ;; Convert esp subtractions to push.
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))])]
+ "(TARGET_SINGLE_PUSH || optimize_insn_for_size_p ())
+- && INTVAL (operands[0]) == -GET_MODE_SIZE (Pmode)"
++ && INTVAL (operands[0]) == -GET_MODE_SIZE (word_mode)"
+ [(clobber (match_dup 1))
+- (set (mem:P (pre_dec:P (reg:P SP_REG))) (match_dup 1))])
++ (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))])
+
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))])]
+ "(TARGET_DOUBLE_PUSH || optimize_insn_for_size_p ())
+- && INTVAL (operands[0]) == -2*GET_MODE_SIZE (Pmode)"
++ && INTVAL (operands[0]) == -2*GET_MODE_SIZE (word_mode)"
+ [(clobber (match_dup 1))
+- (set (mem:P (pre_dec:P (reg:P SP_REG))) (match_dup 1))
+- (set (mem:P (pre_dec:P (reg:P SP_REG))) (match_dup 1))])
++ (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
++ (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))])
+
+ ;; Convert epilogue deallocator to pop.
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))
+ (clobber (mem:BLK (scratch)))])]
+ "(TARGET_SINGLE_POP || optimize_insn_for_size_p ())
+- && INTVAL (operands[0]) == GET_MODE_SIZE (Pmode)"
+- [(parallel [(set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))
++ && INTVAL (operands[0]) == GET_MODE_SIZE (word_mode)"
++ [(parallel [(set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))
+ (clobber (mem:BLK (scratch)))])])
+
+ ;; Two pops case is tricky, since pop causes dependency
+ ;; on destination register. We use two registers if available.
+ (define_peephole2
+- [(match_scratch:P 1 "r")
+- (match_scratch:P 2 "r")
++ [(match_scratch:W 1 "r")
++ (match_scratch:W 2 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))
+ (clobber (mem:BLK (scratch)))])]
+ "(TARGET_DOUBLE_POP || optimize_insn_for_size_p ())
+- && INTVAL (operands[0]) == 2*GET_MODE_SIZE (Pmode)"
+- [(parallel [(set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))
++ && INTVAL (operands[0]) == 2*GET_MODE_SIZE (word_mode)"
++ [(parallel [(set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))
+ (clobber (mem:BLK (scratch)))])
+- (set (match_dup 2) (mem:P (post_inc:P (reg:P SP_REG))))])
++ (set (match_dup 2) (mem:W (post_inc:P (reg:P SP_REG))))])
+
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))
+ (clobber (mem:BLK (scratch)))])]
+ "optimize_insn_for_size_p ()
+- && INTVAL (operands[0]) == 2*GET_MODE_SIZE (Pmode)"
+- [(parallel [(set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))
++ && INTVAL (operands[0]) == 2*GET_MODE_SIZE (word_mode)"
++ [(parallel [(set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))
+ (clobber (mem:BLK (scratch)))])
+- (set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))])
++ (set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))])
+
+ ;; Convert esp additions to pop.
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))])]
+- "INTVAL (operands[0]) == GET_MODE_SIZE (Pmode)"
+- [(set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))])
++ "INTVAL (operands[0]) == GET_MODE_SIZE (word_mode)"
++ [(set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))])
+
+ ;; Two pops case is tricky, since pop causes dependency
+ ;; on destination register. We use two registers if available.
+ (define_peephole2
+- [(match_scratch:P 1 "r")
+- (match_scratch:P 2 "r")
++ [(match_scratch:W 1 "r")
++ (match_scratch:W 2 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))])]
+- "INTVAL (operands[0]) == 2*GET_MODE_SIZE (Pmode)"
+- [(set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))
+- (set (match_dup 2) (mem:P (post_inc:P (reg:P SP_REG))))])
++ "INTVAL (operands[0]) == 2*GET_MODE_SIZE (word_mode)"
++ [(set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))
++ (set (match_dup 2) (mem:W (post_inc:P (reg:P SP_REG))))])
+
+ (define_peephole2
+- [(match_scratch:P 1 "r")
++ [(match_scratch:W 1 "r")
+ (parallel [(set (reg:P SP_REG)
+ (plus:P (reg:P SP_REG)
+ (match_operand:P 0 "const_int_operand" "")))
+ (clobber (reg:CC FLAGS_REG))])]
+ "optimize_insn_for_size_p ()
+- && INTVAL (operands[0]) == 2*GET_MODE_SIZE (Pmode)"
+- [(set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))
+- (set (match_dup 1) (mem:P (post_inc:P (reg:P SP_REG))))])
++ && INTVAL (operands[0]) == 2*GET_MODE_SIZE (word_mode)"
++ [(set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))
++ (set (match_dup 1) (mem:W (post_inc:P (reg:P SP_REG))))])
+
+ ;; Convert compares with 1 to shorter inc/dec operations when CF is not
+ ;; required and register dies. Similarly for 128 to -128.
+@@ -17607,7 +17622,7 @@
+ ;; leal (%edx,%eax,4), %eax
+
+ (define_peephole2
+- [(match_scratch:P 5 "r")
++ [(match_scratch:W 5 "r")
+ (parallel [(set (match_operand 0 "register_operand" "")
+ (ashift (match_operand 1 "register_operand" "")
+ (match_operand 2 "const_int_operand" "")))
+@@ -17633,16 +17648,16 @@
+ enum machine_mode op1mode = GET_MODE (operands[1]);
+ enum machine_mode mode = op1mode == DImode ? DImode : SImode;
+ int scale = 1 << INTVAL (operands[2]);
+- rtx index = gen_lowpart (Pmode, operands[1]);
+- rtx base = gen_lowpart (Pmode, operands[5]);
++ rtx index = gen_lowpart (word_mode, operands[1]);
++ rtx base = gen_lowpart (word_mode, operands[5]);
+ rtx dest = gen_lowpart (mode, operands[3]);
+
+- operands[1] = gen_rtx_PLUS (Pmode, base,
+- gen_rtx_MULT (Pmode, index, GEN_INT (scale)));
++ operands[1] = gen_rtx_PLUS (word_mode, base,
++ gen_rtx_MULT (word_mode, index, GEN_INT (scale)));
+ operands[5] = base;
+- if (mode != Pmode)
++ if (mode != word_mode)
+ operands[1] = gen_rtx_SUBREG (mode, operands[1], 0);
+- if (op1mode != Pmode)
++ if (op1mode != word_mode)
+ operands[5] = gen_rtx_SUBREG (op1mode, operands[5], 0);
+ operands[0] = dest;
+ })
+@@ -18033,7 +18048,7 @@
+ {
+ rtx (*insn)(rtx);
+
+- insn = (TARGET_64BIT
++ insn = (Pmode == DImode
+ ? gen_lwp_slwpcbdi
+ : gen_lwp_slwpcbsi);
+
+--- a/gcc/config/i386/i386.opt
++++ b/gcc/config/i386/i386.opt
+@@ -159,6 +159,20 @@ Enum(cmodel) String(32) Value(CM_32)
+ EnumValue
+ Enum(cmodel) String(kernel) Value(CM_KERNEL)
+
++maddress-mode=
++Target RejectNegative Joined Enum(pmode) Var(ix86_pmode) Init(PMODE_SI)
++Use given address mode
++
++Enum
++Name(pmode) Type(enum pmode)
++Known address mode (for use with the -maddress-mode= option):
++
++EnumValue
++Enum(pmode) String(short) Value(PMODE_SI)
++
++EnumValue
++Enum(pmode) String(long) Value(PMODE_DI)
++
+ mcpu=
+ Target RejectNegative Joined Undocumented Alias(mtune=) Warn(%<-mcpu=%> is deprecated; use %<-mtune=%> or %<-march=%> instead)
+
+@@ -204,7 +218,7 @@ EnumValue
+ Enum(fpmath_unit) String(both) Value({(enum fpmath_unit) (FPMATH_SSE | FPMATH_387)})
+
+ mhard-float
+-Target RejectNegative Mask(80387) MaskExists Save
++Target RejectNegative Mask(80387) Save
+ Use hardware fp
+
+ mieee-fp
+@@ -411,11 +425,11 @@ Target RejectNegative Negative(m64) Report InverseMask(ISA_64BIT) Var(ix86_isa_f
+ Generate 32bit i386 code
+
+ m64
+-Target RejectNegative Negative(mx32) Report Mask(ISA_64BIT) Var(ix86_isa_flags) Save
++Target RejectNegative Negative(mx32) Report Mask(ABI_64) Var(ix86_isa_flags) Save
+ Generate 64bit x86-64 code
+
+ mx32
+-Target RejectNegative Negative(m32) Report Mask(ISA_X32) Var(ix86_isa_flags) Save
++Target RejectNegative Negative(m32) Report Mask(ABI_X32) Var(ix86_isa_flags) Save
+ Generate 32bit x86-64 code
+
+ mmmx
+@@ -455,11 +469,11 @@ Target Report Mask(ISA_SSE4_2) Var(ix86_isa_flags) Save
+ Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 and SSE4.2 built-in functions and code generation
+
+ msse4
+-Target RejectNegative Report Mask(ISA_SSE4_2) MaskExists Var(ix86_isa_flags) Save
++Target RejectNegative Report Mask(ISA_SSE4_2) Var(ix86_isa_flags) Save
+ Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 and SSE4.2 built-in functions and code generation
+
+ mno-sse4
+-Target RejectNegative Report InverseMask(ISA_SSE4_1) MaskExists Var(ix86_isa_flags) Save
++Target RejectNegative Report InverseMask(ISA_SSE4_1) Var(ix86_isa_flags) Save
+ Do not support SSE4.1 and SSE4.2 built-in functions and code generation
+
+ msse5
+--- a/gcc/config/i386/predicates.md
++++ b/gcc/config/i386/predicates.md
+@@ -341,6 +341,16 @@
+ (match_operand 0 "general_operand")))
+
+ ;; Return true if OP is general operand representable on x86_64
++;; as zero extended constant. This predicate is used in zero-extending
++;; conversion operations that require non-VOIDmode immediate operands.
++(define_predicate "x86_64_zext_general_operand"
++ (if_then_else (match_test "TARGET_64BIT")
++ (ior (match_operand 0 "nonimmediate_operand")
++ (and (match_operand 0 "x86_64_zext_immediate_operand")
++ (match_test "GET_MODE (op) != VOIDmode")))
++ (match_operand 0 "general_operand")))
++
++;; Return true if OP is general operand representable on x86_64
+ ;; as either sign extended or zero extended constant.
+ (define_predicate "x86_64_szext_general_operand"
+ (if_then_else (match_test "TARGET_64BIT")
+@@ -483,11 +493,11 @@
+ (match_operand 0 "local_symbolic_operand")))
+
+ ;; Test for various thread-local symbols.
+-(define_predicate "tls_symbolic_operand"
++(define_special_predicate "tls_symbolic_operand"
+ (and (match_code "symbol_ref")
+ (match_test "SYMBOL_REF_TLS_MODEL (op)")))
+
+-(define_predicate "tls_modbase_operand"
++(define_special_predicate "tls_modbase_operand"
+ (and (match_code "symbol_ref")
+ (match_test "op == ix86_tls_module_base ()")))
+
+@@ -558,20 +568,23 @@
+
+ ;; Test for a valid operand for indirect branch.
+ (define_predicate "indirect_branch_operand"
+- (if_then_else (match_test "TARGET_X32")
+- (match_operand 0 "register_operand")
+- (match_operand 0 "nonimmediate_operand")))
++ (ior (match_operand 0 "register_operand")
++ (and (not (match_test "TARGET_X32"))
++ (match_operand 0 "memory_operand"))))
+
+ ;; Test for a valid operand for a call instruction.
+-(define_predicate "call_insn_operand"
+- (ior (match_operand 0 "constant_call_address_operand")
++;; Allow constant call address operands in Pmode only.
++(define_special_predicate "call_insn_operand"
++ (ior (match_test "constant_call_address_operand
++ (op, mode == VOIDmode ? mode : Pmode)")
+ (match_operand 0 "call_register_no_elim_operand")
+ (and (not (match_test "TARGET_X32"))
+ (match_operand 0 "memory_operand"))))
+
+ ;; Similarly, but for tail calls, in which we cannot allow memory references.
+-(define_predicate "sibcall_insn_operand"
+- (ior (match_operand 0 "constant_call_address_operand")
++(define_special_predicate "sibcall_insn_operand"
++ (ior (match_test "constant_call_address_operand
++ (op, mode == VOIDmode ? mode : Pmode)")
+ (match_operand 0 "register_no_elim_operand")))
+
+ ;; Match exactly zero.
+--- a/gcc/config/i386/sse.md
++++ b/gcc/config/i386/sse.md
+@@ -8054,8 +8054,8 @@
+ "monitor\t%0, %1, %2"
+ [(set_attr "length" "3")])
+
+-(define_insn "sse3_monitor64"
+- [(unspec_volatile [(match_operand:DI 0 "register_operand" "a")
++(define_insn "sse3_monitor64_<mode>"
++ [(unspec_volatile [(match_operand:P 0 "register_operand" "a")
+ (match_operand:SI 1 "register_operand" "c")
+ (match_operand:SI 2 "register_operand" "d")]
+ UNSPECV_MONITOR)]
+--- a/gcc/config/m68k/m68k.opt
++++ b/gcc/config/m68k/m68k.opt
+@@ -136,7 +136,7 @@ Target RejectNegative
+ Generate code for a Fido A
+
+ mhard-float
+-Target RejectNegative Mask(HARD_FLOAT) MaskExists
++Target RejectNegative Mask(HARD_FLOAT)
+ Generate code which uses hardware floating point instructions
+
+ mid-shared-library
+--- a/gcc/config/mep/mep.opt
++++ b/gcc/config/mep/mep.opt
+@@ -55,7 +55,7 @@ Target Mask(COP)
+ Enable MeP Coprocessor
+
+ mcop32
+-Target Mask(COP) MaskExists RejectNegative
++Target Mask(COP) RejectNegative
+ Enable MeP Coprocessor with 32-bit registers
+
+ mcop64
+--- a/gcc/config/pa/pa-hpux.opt
++++ b/gcc/config/pa/pa-hpux.opt
+@@ -23,7 +23,7 @@ Variable
+ int flag_pa_unix = TARGET_HPUX_11_31 ? 2003 : TARGET_HPUX_11_11 ? 1998 : TARGET_HPUX_10_10 ? 1995 : 1993
+
+ msio
+-Target RejectNegative Mask(SIO) MaskExists
++Target RejectNegative Mask(SIO)
+ Generate cpp defines for server IO
+
+ munix=93
+--- a/gcc/config/pa/pa64-hpux.opt
++++ b/gcc/config/pa/pa64-hpux.opt
+@@ -19,7 +19,7 @@
+ ; <http://www.gnu.org/licenses/>.
+
+ mgnu-ld
+-Target RejectNegative Mask(GNU_LD) MaskExists
++Target RejectNegative Mask(GNU_LD)
+ Assume code will be linked by GNU ld
+
+ mhp-ld
+--- a/gcc/config/picochip/picochip.opt
++++ b/gcc/config/picochip/picochip.opt
+@@ -43,4 +43,4 @@ Target Mask(INEFFICIENT_WARNINGS)
+ Generate warnings when inefficient code is known to be generated.
+
+ minefficient
+-Target Mask(INEFFICIENT_WARNINGS) MaskExists Undocumented
++Target Mask(INEFFICIENT_WARNINGS) Undocumented
+--- a/gcc/config/rs6000/sysv4.opt
++++ b/gcc/config/rs6000/sysv4.opt
+@@ -66,7 +66,7 @@ Target Report RejectNegative Mask(LITTLE_ENDIAN)
+ Produce little endian code
+
+ mlittle
+-Target Report RejectNegative Mask(LITTLE_ENDIAN) MaskExists
++Target Report RejectNegative Mask(LITTLE_ENDIAN)
+ Produce little endian code
+
+ mbig-endian
+--- a/gcc/config/sh/sh.opt
++++ b/gcc/config/sh/sh.opt
+@@ -316,7 +316,7 @@ Target Report RejectNegative Mask(RELAX)
+ Shorten address references during linking
+
+ mrenesas
+-Target Mask(HITACHI) MaskExists
++Target Mask(HITACHI)
+ Follow Renesas (formerly Hitachi) / SuperH calling conventions
+
+ msoft-atomic
+--- a/gcc/config/sparc/long-double-switch.opt
++++ b/gcc/config/sparc/long-double-switch.opt
+@@ -19,7 +19,7 @@
+ ; <http://www.gnu.org/licenses/>.
+
+ mlong-double-128
+-Target Report RejectNegative Mask(LONG_DOUBLE_128) MaskExists
++Target Report RejectNegative Mask(LONG_DOUBLE_128)
+ Use 128-bit long double
+
+ mlong-double-64
+--- a/gcc/config/sparc/sparc.opt
++++ b/gcc/config/sparc/sparc.opt
+@@ -30,7 +30,7 @@ Target Report Mask(FPU)
+ Use hardware FP
+
+ mhard-float
+-Target RejectNegative Mask(FPU) MaskExists
++Target RejectNegative Mask(FPU)
+ Use hardware FP
+
+ msoft-float
+--- a/gcc/config/v850/v850.opt
++++ b/gcc/config/v850/v850.opt
+@@ -102,7 +102,7 @@ Target RejectNegative Mask(V850E1)
+ Compile for the v850e1 processor
+
+ mv850es
+-Target RejectNegative Mask(V850E1) MaskExists
++Target RejectNegative Mask(V850E1)
+ Compile for the v850es variant of the v850e1
+
+ mv850e2
+--- a/gcc/config/vax/vax.opt
++++ b/gcc/config/vax/vax.opt
+@@ -31,7 +31,7 @@ Target RejectNegative Mask(G_FLOAT)
+ Generate GFLOAT double precision code
+
+ mg-float
+-Target RejectNegative Mask(G_FLOAT) MaskExists
++Target RejectNegative Mask(G_FLOAT)
+ Generate GFLOAT double precision code
+
+ mgnu
+--- a/gcc/configure
++++ b/gcc/configure
+@@ -13796,7 +13796,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/gcc/doc/invoke.texi
++++ b/gcc/doc/invoke.texi
+@@ -637,7 +637,7 @@ Objective-C and Objective-C++ Dialects}.
+ -mveclibabi=@var{type} -mvect8-ret-in-mem @gol
+ -mpc32 -mpc64 -mpc80 -mstackrealign @gol
+ -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs @gol
+--mcmodel=@var{code-model} -mabi=@var{name} @gol
++-mcmodel=@var{code-model} -mabi=@var{name} -maddress-mode=@var{mode} @gol
+ -m32 -m64 -mx32 -mlarge-data-threshold=@var{num} @gol
+ -msse2avx -mfentry -m8bit-idiv @gol
+ -mavx256-split-unaligned-load -mavx256-split-unaligned-store}
+@@ -13548,6 +13548,12 @@ Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
+ byte boundary. If @option{-mpreferred-stack-boundary} is not specified,
+ the default is 4 (16 bytes or 128 bits).
+
++@strong{Warning:} When generating code for the x86-64 architecture with
++SSE extensions disabled, @option{-mpreferred-stack-boundary=3} can be
++used to keep the stack boundary aligned to 8 byte boundary. You must
++build all modules with @option{-mpreferred-stack-boundary=3}, including
++any libraries. This includes the system libraries and startup modules.
++
+ @item -mincoming-stack-boundary=@var{num}
+ @opindex mincoming-stack-boundary
+ Assume the incoming stack is aligned to a 2 raised to @var{num} byte
+@@ -13941,6 +13947,18 @@ be statically or dynamically linked.
+ @opindex mcmodel=large
+ Generate code for the large model: This model makes no assumptions
+ about addresses and sizes of sections.
++
++@item -maddress-mode=long
++@opindex maddress-mode=long
++Generate code for long address mode. This is only supported for 64-bit
++and x32 environments. It is the default address mode for 64-bit
++environments.
++
++@item -maddress-mode=short
++@opindex maddress-mode=short
++Generate code for short address mode. This is only supported for 32-bit
++and x32 environments. It is the default address mode for 32-bit and
++x32 environments.
+ @end table
+
+ @node i386 and x86-64 Windows Options
+--- a/gcc/doc/options.texi
++++ b/gcc/doc/options.texi
+@@ -346,8 +346,6 @@ the value 1 when the option is active and 0 otherwise. If you use @code{Var}
+ to attach the option to a different variable, the associated macros are
+ called @code{OPTION_MASK_@var{name}} and @code{OPTION_@var{name}} respectively.
+
+-You can disable automatic bit allocation using @code{MaskExists}.
+-
+ @item InverseMask(@var{othername})
+ @itemx InverseMask(@var{othername}, @var{thisname})
+ The option is the inverse of another option that has the
+@@ -355,15 +353,6 @@ The option is the inverse of another option that has the
+ the options-processing script will declare a @code{TARGET_@var{thisname}}
+ macro that is 1 when the option is active and 0 otherwise.
+
+-@item MaskExists
+-The mask specified by the @code{Mask} property already exists.
+-No @code{MASK} or @code{TARGET} definitions should be added to
+-@file{options.h} in response to this option record.
+-
+-The main purpose of this property is to support synonymous options.
+-The first option should use @samp{Mask(@var{name})} and the others
+-should use @samp{Mask(@var{name}) MaskExists}.
+-
+ @item Enum(@var{name})
+ The option's argument is a string from the set of strings associated
+ with the corresponding @samp{Enum} record. The string is checked and
+--- a/gcc/dwarf2out.c
++++ b/gcc/dwarf2out.c
+@@ -10181,7 +10181,9 @@ dbx_reg_number (const_rtx rtl)
+ }
+ #endif
+
+- return DBX_REGISTER_NUMBER (regno);
++ regno = DBX_REGISTER_NUMBER (regno);
++ gcc_assert (regno != INVALID_REGNUM);
++ return regno;
+ }
+
+ /* Optionally add a DW_OP_piece term to a location description expression.
+@@ -11669,6 +11671,8 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode,
+ case REG:
+ if (GET_MODE_CLASS (mode) != MODE_INT
+ || (GET_MODE_SIZE (mode) > DWARF2_ADDR_SIZE
++ && rtl != arg_pointer_rtx
++ && rtl != frame_pointer_rtx
+ #ifdef POINTERS_EXTEND_UNSIGNED
+ && (mode != Pmode || mem_mode == VOIDmode)
+ #endif
+@@ -11941,7 +11945,9 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode,
+ case PLUS:
+ plus:
+ if (is_based_loc (rtl)
+- && GET_MODE_SIZE (mode) <= DWARF2_ADDR_SIZE
++ && (GET_MODE_SIZE (mode) <= DWARF2_ADDR_SIZE
++ || XEXP (rtl, 0) == arg_pointer_rtx
++ || XEXP (rtl, 0) == frame_pointer_rtx)
+ && GET_MODE_CLASS (mode) == MODE_INT)
+ mem_loc_result = based_loc_descr (XEXP (rtl, 0),
+ INTVAL (XEXP (rtl, 1)),
+--- a/gcc/emit-rtl.c
++++ b/gcc/emit-rtl.c
+@@ -964,6 +964,22 @@ void
+ set_reg_attrs_from_value (rtx reg, rtx x)
+ {
+ int offset;
++ bool can_be_reg_pointer = true;
++
++ /* Don't call mark_reg_pointer for incompatible pointer sign
++ extension. */
++ while (GET_CODE (x) == SIGN_EXTEND
++ || GET_CODE (x) == ZERO_EXTEND
++ || GET_CODE (x) == TRUNCATE
++ || (GET_CODE (x) == SUBREG && subreg_lowpart_p (x)))
++ {
++#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
++ if ((GET_CODE (x) == SIGN_EXTEND && POINTERS_EXTEND_UNSIGNED)
++ || (GET_CODE (x) != SIGN_EXTEND && ! POINTERS_EXTEND_UNSIGNED))
++ can_be_reg_pointer = false;
++#endif
++ x = XEXP (x, 0);
++ }
+
+ /* Hard registers can be reused for multiple purposes within the same
+ function, so setting REG_ATTRS, REG_POINTER and REG_POINTER_ALIGN
+@@ -977,14 +993,14 @@ set_reg_attrs_from_value (rtx reg, rtx x)
+ if (MEM_OFFSET_KNOWN_P (x))
+ REG_ATTRS (reg) = get_reg_attrs (MEM_EXPR (x),
+ MEM_OFFSET (x) + offset);
+- if (MEM_POINTER (x))
++ if (can_be_reg_pointer && MEM_POINTER (x))
+ mark_reg_pointer (reg, 0);
+ }
+ else if (REG_P (x))
+ {
+ if (REG_ATTRS (x))
+ update_reg_offset (reg, x, offset);
+- if (REG_POINTER (x))
++ if (can_be_reg_pointer && REG_POINTER (x))
+ mark_reg_pointer (reg, REGNO_POINTER_ALIGN (REGNO (x)));
+ }
+ }
+--- a/gcc/opth-gen.awk
++++ b/gcc/opth-gen.awk
+@@ -298,16 +298,25 @@ print "";
+
+ for (i = 0; i < n_opts; i++) {
+ name = opt_args("Mask", flags[i])
+- vname = var_name(flags[i])
+- mask = "MASK_"
+- mask_1 = "1"
+- if (vname != "") {
+- mask = "OPTION_MASK_"
+- if (host_wide_int[vname] == "yes")
+- mask_1 = "HOST_WIDE_INT_1"
++ if (name == "") {
++ opt = opt_args("InverseMask", flags[i])
++ if (opt ~ ",")
++ name = nth_arg(0, opt)
++ else
++ name = opt
+ }
+- if (name != "" && !flag_set_p("MaskExists", flags[i]))
++ if (name != "" && mask_bits[name] == 0) {
++ mask_bits[name] = 1
++ vname = var_name(flags[i])
++ mask = "MASK_"
++ mask_1 = "1"
++ if (vname != "") {
++ mask = "OPTION_MASK_"
++ if (host_wide_int[vname] == "yes")
++ mask_1 = "HOST_WIDE_INT_1"
++ }
+ print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")"
++ }
+ }
+ for (i = 0; i < n_extra_masks; i++) {
+ print "#define MASK_" extra_masks[i] " (1 << " masknum[""]++ ")"
+@@ -330,17 +339,26 @@ print ""
+
+ for (i = 0; i < n_opts; i++) {
+ name = opt_args("Mask", flags[i])
+- vname = var_name(flags[i])
+- macro = "OPTION_"
+- mask = "OPTION_MASK_"
+- if (vname == "") {
+- vname = "target_flags"
+- macro = "TARGET_"
+- mask = "MASK_"
++ if (name == "") {
++ opt = opt_args("InverseMask", flags[i])
++ if (opt ~ ",")
++ name = nth_arg(0, opt)
++ else
++ name = opt
+ }
+- if (name != "" && !flag_set_p("MaskExists", flags[i]))
++ if (name != "" && mask_macros[name] == 0) {
++ mask_macros[name] = 1
++ vname = var_name(flags[i])
++ macro = "OPTION_"
++ mask = "OPTION_MASK_"
++ if (vname == "") {
++ vname = "target_flags"
++ macro = "TARGET_"
++ mask = "MASK_"
++ }
+ print "#define " macro name \
+ " ((" vname " & " mask name ") != 0)"
++ }
+ }
+ for (i = 0; i < n_extra_masks; i++) {
+ print "#define TARGET_" extra_masks[i] \
+--- a/gcc/reginfo.c
++++ b/gcc/reginfo.c
+@@ -1222,17 +1222,7 @@ reg_scan_mark_refs (rtx x, rtx insn)
+ /* If this is setting a register from a register or from a simple
+ conversion of a register, propagate REG_EXPR. */
+ if (REG_P (dest) && !REG_ATTRS (dest))
+- {
+- rtx src = SET_SRC (x);
+-
+- while (GET_CODE (src) == SIGN_EXTEND
+- || GET_CODE (src) == ZERO_EXTEND
+- || GET_CODE (src) == TRUNCATE
+- || (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)))
+- src = XEXP (src, 0);
+-
+- set_reg_attrs_from_value (dest, src);
+- }
++ set_reg_attrs_from_value (dest, SET_SRC (x));
+
+ /* ... fall through ... */
+
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/torture/pr52530.c
+@@ -0,0 +1,30 @@
++/* { dg-do run } */
++
++extern void abort (void);
++
++struct foo
++{
++ int *f;
++ int i;
++};
++
++int baz;
++
++void __attribute__ ((noinline))
++bar (struct foo x)
++{
++ *(x.f) = x.i;
++}
++
++int
++main ()
++{
++ struct foo x = { &baz, 0xdeadbeef };
++
++ bar (x);
++
++ if (baz != 0xdeadbeef)
++ abort ();
++
++ return 0;
++}
+--- a/gcc/testsuite/gcc.target/i386/pr52146.c
++++ b/gcc/testsuite/gcc.target/i386/pr52146.c
+@@ -15,4 +15,4 @@ test2 (void)
+ *apic_tpr_addr = 0;
+ }
+
+-/* { dg-final { scan-assembler-not "-18874240" } } */
++/* { dg-final { scan-assembler-not "\[,\\t \]+-18874240" } } */
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr52857-1.c
+@@ -0,0 +1,10 @@
++/* { dg-do compile { target { ! { ia32 } } } } */
++/* { dg-options "-g -O -mx32 -maddress-mode=long" } */
++
++extern void get_BID128 (int *);
++void
++__bid128_div (void)
++{
++ int res;
++ get_BID128 (&res);
++}
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr52857-2.c
+@@ -0,0 +1,8 @@
++/* { dg-do compile { target { ! { ia32 } } } } */
++/* { dg-options "-g -O -mx32 -maddress-mode=long" } */
++
++void uw_init_context_1 (void *);
++void _Unwind_ForcedUnwind (void)
++{
++ uw_init_context_1 (__builtin_dwarf_cfa ());
++}
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr52876.c
+@@ -0,0 +1,25 @@
++/* { dg-do run { target { x32 } } } */
++/* { dg-options "-O2 -mx32 -maddress-mode=long" } */
++
++extern void abort (void);
++
++long long li;
++
++long long
++__attribute__ ((noinline))
++testfunc (void* addr)
++{
++ li = (long long)(int)addr;
++ li &= 0xffffffff;
++ return li;
++}
++
++int main (void)
++{
++ volatile long long rv_test;
++ rv_test = testfunc((void*)0x87651234);
++ if (rv_test != 0x87651234ULL)
++ abort ();
++
++ return 0;
++}
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr52882.c
+@@ -0,0 +1,19 @@
++/* { dg-do compile } */
++/* { dg-options "-O" } */
++
++struct S1 {
++ int f0;
++ int f1;
++};
++
++int fn1 ();
++void fn2 (struct S1);
++
++void
++fn3 () {
++ struct S1 a = { 1, 0 };
++ if (fn1 ())
++ fn2 (a);
++ for (; a.f1;) {
++ }
++}
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr52883.c
+@@ -0,0 +1,25 @@
++/* { dg-do compile } */
++/* { dg-options "-O" } */
++
++int a, b, d, e, f, i, j, k, l, m;
++unsigned c;
++int g[] = { }, h[0];
++
++int
++fn1 () {
++ return 0;
++}
++
++void
++fn2 () {
++ c = 0;
++ e = 0;
++ for (;; e = 0)
++ if (f > j) {
++ k = fn1 ();
++ l = (d || k) * b;
++ m = l * a;
++ h[0] = m <= i;
++ } else
++ i = g[c];
++}
+--- a/gcc/testsuite/gcc.target/i386/pr54157.c
++++ b/gcc/testsuite/gcc.target/i386/pr54157.c
+@@ -1,5 +1,5 @@
+ /* { dg-do compile { target { ! { ia32 } } } } */
+-/* { dg-options "-O2 -mx32 -ftree-vectorize" } */
++/* { dg-options "-O2 -mx32 -maddress-mode=long -ftree-vectorize" } */
+
+ struct s2{
+ int n[24 -1][24 -1][24 -1];
+--- a/libffi/configure
++++ b/libffi/configure
+@@ -6282,7 +6282,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libffi/src/x86/ffi64.c
++++ b/libffi/src/x86/ffi64.c
+@@ -426,7 +426,7 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+ /* If the return value is passed in memory, add the pointer as the
+ first integer argument. */
+ if (ret_in_memory)
+- reg_args->gpr[gprcount++] = (long) rvalue;
++ reg_args->gpr[gprcount++] = (unsigned long) rvalue;
+
+ avn = cif->nargs;
+ arg_types = cif->arg_types;
+@@ -501,9 +501,11 @@ ffi_prep_closure_loc (ffi_closure* closure,
+ tramp = (volatile unsigned short *) &closure->tramp[0];
+
+ tramp[0] = 0xbb49; /* mov <code>, %r11 */
+- *(void * volatile *) &tramp[1] = ffi_closure_unix64;
++ *((unsigned long long * volatile) &tramp[1])
++ = (unsigned long) ffi_closure_unix64;
+ tramp[5] = 0xba49; /* mov <data>, %r10 */
+- *(void * volatile *) &tramp[6] = codeloc;
++ *((unsigned long long * volatile) &tramp[6])
++ = (unsigned long) codeloc;
+
+ /* Set the carry bit iff the function uses any sse registers.
+ This is clc or stc, together with the first byte of the jmp. */
+@@ -542,7 +544,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
+ {
+ /* The return value goes in memory. Arrange for the closure
+ return value to go directly back to the original caller. */
+- rvalue = (void *) reg_args->gpr[gprcount++];
++ rvalue = (void *) (unsigned long) reg_args->gpr[gprcount++];
+ /* We don't have to do anything in asm for the return. */
+ ret = FFI_TYPE_VOID;
+ }
+--- a/libffi/src/x86/ffitarget.h
++++ b/libffi/src/x86/ffitarget.h
+@@ -53,9 +53,16 @@ typedef unsigned long long ffi_arg;
+ typedef long long ffi_sarg;
+ #endif
+ #else
++#if defined __x86_64__ && defined __ILP32__
++#define FFI_SIZEOF_ARG 8
++#define FFI_SIZEOF_JAVA_RAW 4
++typedef unsigned long long ffi_arg;
++typedef long long ffi_sarg;
++#else
+ typedef unsigned long ffi_arg;
+ typedef signed long ffi_sarg;
+ #endif
++#endif
+
+ typedef enum ffi_abi {
+ FFI_FIRST_ABI = 0,
+--- a/libgcc/unwind-dw2.c
++++ b/libgcc/unwind-dw2.c
+@@ -294,7 +294,8 @@ _Unwind_SetGRValue (struct _Unwind_Context *context, int index,
+ {
+ index = DWARF_REG_TO_UNWIND_COLUMN (index);
+ gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
+- gcc_assert (dwarf_reg_size_table[index] == sizeof (_Unwind_Context_Reg_Val));
++ /* Return column size may be smaller than _Unwind_Context_Reg_Val. */
++ gcc_assert (dwarf_reg_size_table[index] <= sizeof (_Unwind_Context_Reg_Val));
+
+ context->by_value[index] = 1;
+ context->reg[index] = _Unwind_Get_Unwind_Context_Reg_Val (val);
+--- a/libgfortran/configure
++++ b/libgfortran/configure
+@@ -8071,7 +8071,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libgomp/configure
++++ b/libgomp/configure
+@@ -6596,7 +6596,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libgomp/configure.tgt
++++ b/libgomp/configure.tgt
+@@ -59,7 +59,7 @@ if test $enable_linux_futex = yes; then
+ i[456]86-*-linux*)
+ config_path="linux/x86 linux posix"
+ case " ${CC} ${CFLAGS} " in
+- *" -m64 "*)
++ *" -m64 "*|*" -mx32 "*)
+ ;;
+ *)
+ if test -z "$with_arch"; then
+--- a/libitm/configure
++++ b/libitm/configure
+@@ -7285,7 +7285,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libitm/configure.tgt
++++ b/libitm/configure.tgt
+@@ -53,7 +53,7 @@ case "${target_cpu}" in
+
+ i[3456]86)
+ case " ${CC} ${CFLAGS} " in
+- *" -m64 "*)
++ *" -m64 "*|*" -mx32 "*)
+ ;;
+ *)
+ if test -z "$with_arch"; then
+--- a/libjava/classpath/configure
++++ b/libjava/classpath/configure
+@@ -7592,7 +7592,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libjava/configure
++++ b/libjava/configure
+@@ -8843,7 +8843,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libjava/include/x86_64-signal.h
++++ b/libjava/include/x86_64-signal.h
+@@ -47,6 +47,10 @@ do \
+ \
+ bool _is_64_bit = false; \
+ \
++ /* Skip 67h address size prefix. */ \
++ if (_rip[0] == 0x67) \
++ _rip++; \
++ \
+ if ((_rip[0] & 0xf0) == 0x40) /* REX byte present. */ \
+ { \
+ unsigned char _rex = _rip[0] & 0x0f; \
+@@ -64,10 +68,10 @@ do \
+ { \
+ if (_is_64_bit) \
+ _min_value_dividend = \
+- _gregs[REG_RAX] == (greg_t)0x8000000000000000UL; \
++ _gregs[REG_RAX] == (greg_t)0x8000000000000000ULL; \
+ else \
+ _min_value_dividend = \
+- (_gregs[REG_RAX] & 0xffffffff) == (greg_t)0x80000000UL; \
++ (_gregs[REG_RAX] & 0xffffffff) == (greg_t)0x80000000ULL; \
+ } \
+ \
+ if (_min_value_dividend) \
+--- a/libmudflap/configure
++++ b/libmudflap/configure
+@@ -6393,7 +6393,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libobjc/configure
++++ b/libobjc/configure
+@@ -6079,7 +6079,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libquadmath/configure
++++ b/libquadmath/configure
+@@ -6264,7 +6264,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libssp/configure
++++ b/libssp/configure
+@@ -6401,7 +6401,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libstdc++-v3/configure
++++ b/libstdc++-v3/configure
+@@ -3025,8 +3025,7 @@ test -n "$target_alias" &&
+ target_alias=${target_alias-$host_alias}
+
+ # Handy for debugging:
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: $build / $host / $target / $host_alias / $target_alias" >&5
+-$as_echo "$as_me: $build / $host / $target / $host_alias / $target_alias" >&6;}; sleep 5
++#AC_MSG_NOTICE($build / $host / $target / $host_alias / $target_alias); sleep 5
+
+ if test "$build" != "$host"; then
+ # We are being configured with some form of cross compiler.
+@@ -7120,7 +7119,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/libtool.m4
++++ b/libtool.m4
+@@ -1232,7 +1232,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/lto-plugin/configure
++++ b/lto-plugin/configure
+@@ -6060,7 +6060,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+--- a/zlib/configure
++++ b/zlib/configure
+@@ -5869,7 +5869,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+- LD="${LD-ld} -m elf_i386"
++ case `/usr/bin/file conftest.o` in
++ *x86-64*)
++ LD="${LD-ld} -m elf32_x86_64"
++ ;;
++ *)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ esac
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
diff --git a/4.7.3/gentoo/92_all_freebsd-pie.patch b/4.7.3/gentoo/92_all_freebsd-pie.patch
new file mode 100644
index 0000000..4905db7
--- /dev/null
+++ b/4.7.3/gentoo/92_all_freebsd-pie.patch
@@ -0,0 +1,71 @@
+https://bugs.gentoo.org/415185
+http://gcc.gnu.org/ml/gcc-patches/2012-05/msg00555.html
+
+From: Alexis Ballier <aballier@gentoo.org>
+To: gcc-patches@gcc.gnu.org
+Cc: Alexis Ballier <aballier@gentoo.org>
+Date: Tue, 8 May 2012 09:53:43 -0400
+Subject: [PATCH] gcc/config/freebsd-spec.h: Fix building PIE executables. Link them with crt{begin,end}S.o and Scrt1.o which are PIC instead of crt{begin,end}.o and crt1.o which are not. Spec synced from gnu-user.h.
+
+gcc/config/i386/freebsd.h: Likewise.
+---
+ gcc/config/freebsd-spec.h | 9 +++------
+ gcc/config/i386/freebsd.h | 9 +++------
+ 2 files changed, 6 insertions(+), 12 deletions(-)
+
+diff --git a/gcc/config/freebsd-spec.h b/gcc/config/freebsd-spec.h
+index 770a3d1..2808582 100644
+--- a/gcc/config/freebsd-spec.h
++++ b/gcc/config/freebsd-spec.h
+@@ -64,11 +64,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ before entering `main'. */
+
+ #define FBSD_STARTFILE_SPEC \
+- "%{!shared: \
+- %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \
+- %{!p:%{profile:gcrt1.o%s} \
+- %{!profile:crt1.o%s}}}} \
+- crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
++ "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
++ crti.o%s %{shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+
+ /* Provide a ENDFILE_SPEC appropriate for FreeBSD. Here we tack on
+ the magical crtend.o file (see crtstuff.c) which provides part of
+@@ -77,7 +74,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ `crtn.o'. */
+
+ #define FBSD_ENDFILE_SPEC \
+- "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
++ "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+
+ /* Provide a LIB_SPEC appropriate for FreeBSD as configured and as
+ required by the user-land thread model. Before __FreeBSD_version
+diff --git a/gcc/config/i386/freebsd.h b/gcc/config/i386/freebsd.h
+index 649274d..dd69e43 100644
+--- a/gcc/config/i386/freebsd.h
++++ b/gcc/config/i386/freebsd.h
+@@ -67,11 +67,8 @@ along with GCC; see the file COPYING3. If not see
+
+ #undef STARTFILE_SPEC
+ #define STARTFILE_SPEC \
+- "%{!shared: \
+- %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \
+- %{!p:%{profile:gcrt1.o%s} \
+- %{!profile:crt1.o%s}}}} \
+- crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
++ "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
++ crti.o%s %{shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+
+ /* Provide a ENDFILE_SPEC appropriate for FreeBSD. Here we tack on
+ the magical crtend.o file (see crtstuff.c) which provides part of
+@@ -81,7 +78,7 @@ along with GCC; see the file COPYING3. If not see
+
+ #undef ENDFILE_SPEC
+ #define ENDFILE_SPEC \
+- "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
++ "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+
+ /* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support
+ for the special GCC options -static and -shared, which allow us to
+--
+1.7.8.6
diff --git a/4.7.3/gentoo/93_all_pr33763_4.7.3_extern-inline.patch b/4.7.3/gentoo/93_all_pr33763_4.7.3_extern-inline.patch
new file mode 100644
index 0000000..7d5b838
--- /dev/null
+++ b/4.7.3/gentoo/93_all_pr33763_4.7.3_extern-inline.patch
@@ -0,0 +1,86 @@
+Silently ignore always_inline attribute for redefined extern inline functions.
+
+https://bugs.gentoo.org/423945
+
+http://gcc.gnu.org/PR33763
+http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=192121
+
+
+--- /dev/null
++++ b/gcc/testsuite/c-c++-common/pr33763.c
+@@ -0,0 +1,60 @@
++/* PR tree-optimization/33763 */
++/* { dg-do compile } */
++/* { dg-options "-O2" } */
++
++typedef struct
++{
++ void *a;
++ void *b;
++} T;
++extern void *foo (const char *, const char *);
++extern void *bar (void *, const char *, T);
++extern int baz (const char *, int);
++
++extern inline __attribute__ ((always_inline, gnu_inline)) int
++baz (const char *x, int y)
++{
++ return 2;
++}
++
++int
++baz (const char *x, int y)
++{
++ return 1;
++}
++
++int xa, xb;
++
++static void *
++inl (const char *x, const char *y)
++{
++ T t = { &xa, &xb };
++ int *f = (int *) __builtin_malloc (sizeof (int));
++ const char *z;
++ int o = 0;
++ void *r = 0;
++
++ for (z = y; *z; z++)
++ {
++ if (*z == 'r')
++ o |= 1;
++ if (*z == 'w')
++ o |= 2;
++ }
++ if (o == 1)
++ *f = baz (x, 0);
++ if (o == 2)
++ *f = baz (x, 1);
++ if (o == 3)
++ *f = baz (x, 2);
++
++ if (o && *f > 0)
++ r = bar (f, "w", t);
++ return r;
++}
++
++void *
++foo (const char *x, const char *y)
++{
++ return inl (x, y);
++}
+--- a/gcc/tree-inline.c
++++ b/gcc/tree-inline.c
+@@ -3836,6 +3836,12 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
+ goto egress;
+
+ if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn))
++ /* For extern inline functions that get redefined we always
++ silently ignored always_inline flag. Better behaviour would
++ be to be able to keep both bodies and use extern inline body
++ for inlining, but we can't do that because frontends overwrite
++ the body. */
++ && !cg_edge->callee->local.redefined_extern_inline
+ /* Avoid warnings during early inline pass. */
+ && cgraph_global_info_ready
+ /* PR 20090218-1_0.c. Body can be provided by another module. */
diff --git a/4.7.3/gentoo/94_all_pr53708_4.7.3_user-alignment.patch b/4.7.3/gentoo/94_all_pr53708_4.7.3_user-alignment.patch
new file mode 100644
index 0000000..681c59b
--- /dev/null
+++ b/4.7.3/gentoo/94_all_pr53708_4.7.3_user-alignment.patch
@@ -0,0 +1,22 @@
+Do not override explicit alignment on user-defined sections.
+
+http://gcc.gnu.org/PR53708
+http://gcc.gnu.org/viewcvs?view=revision&revision=193121
+
+
+--- a/gcc/tree-vect-data-refs.c
++++ b/gcc/tree-vect-data-refs.c
+@@ -4574,6 +4574,13 @@ vect_can_force_dr_alignment_p (const_tree decl, unsigned int alignment)
+ if (TREE_ASM_WRITTEN (decl))
+ return false;
+
++ /* Do not override explicit alignment set by the user when an explicit
++ section name is also used. This is a common idiom used by many
++ software projects. */
++ if (DECL_SECTION_NAME (decl) != NULL_TREE
++ && !DECL_HAS_IMPLICIT_SECTION_NAME_P (decl))
++ return false;
++
+ if (TREE_STATIC (decl))
+ return (alignment <= MAX_OFILE_ALIGNMENT);
+ else
diff --git a/4.7.3/gentoo/95_all_pr55940_4.7.3_x86-stack-parameters.patch b/4.7.3/gentoo/95_all_pr55940_4.7.3_x86-stack-parameters.patch
new file mode 100644
index 0000000..6117bc7
--- /dev/null
+++ b/4.7.3/gentoo/95_all_pr55940_4.7.3_x86-stack-parameters.patch
@@ -0,0 +1,93 @@
+Incorrect code for accessing parameters with 32-bit Intel hosts
+http://gcc.gnu.org/PR55940
+
+
+commit eccae624ce764c52ff7ffbc3db95fc58c01ab5d4
+Author: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Fri Feb 1 14:09:38 2013 +0000
+
+ Backported from mainline
+ 2013-01-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/55940
+ * function.c (thread_prologue_and_epilogue_insns): Always
+ add crtl->drap_reg to set_up_by_prologue.set, even if
+ stack_realign_drap is false.
+
+ * gcc.dg/pr55940.c: New test.
+
+
+ git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@195656 138bc75d-0d04-0410-961f-82ee72b054a4
+---
+ gcc/function.c | 2 +-
+ gcc/testsuite/gcc.dg/pr55940.c | 54 ++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 67 insertions(+), 1 deletion(-)
+
+--- a/gcc/function.c
++++ b/gcc/function.c
+@@ -5961,7 +5961,7 @@ thread_prologue_and_epilogue_insns (void)
+ if (pic_offset_table_rtx)
+ add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
+ PIC_OFFSET_TABLE_REGNUM);
+- if (stack_realign_drap && crtl->drap_reg)
++ if (crtl->drap_reg)
+ add_to_hard_reg_set (&set_up_by_prologue.set,
+ GET_MODE (crtl->drap_reg),
+ REGNO (crtl->drap_reg));
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/pr55940.c
+@@ -0,0 +1,54 @@
++/* PR target/55940 */
++/* { dg-do run } */
++/* { dg-options "-Os" } */
++/* { dg-additional-options "-mpreferred-stack-boundary=2" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
++
++struct S { int s; unsigned long t; };
++
++__attribute__ ((noinline, noclone)) unsigned long long
++bar (struct S *x, unsigned long y)
++{
++ asm volatile ("" : : "r" (x), "r" (y) : "memory");
++ return x->s + y;
++}
++
++__attribute__ ((noinline, noclone)) unsigned long long
++foo (struct S *x, unsigned long y)
++{
++ unsigned long a;
++ if (__builtin_expect (((__UINTPTR_TYPE__) (x) + 0x1000U < 0x2000U), 0))
++ return ~0ULL;
++ if (__builtin_expect (x->s <= 0 || x->s > 9, 0))
++ return ~0ULL;
++ a = x->t >> 12;
++ if (y == a)
++ return ~0ULL;
++ if (x->s == 3)
++ return x->t + y * 4096;
++ return bar (x, y);
++}
++
++int va, vb, vc, vd;
++
++int
++main ()
++{
++ struct S s;
++ asm volatile ("" : : : "memory");
++ int a = va, b = vb, c = vc, d = vd;
++ asm volatile ("" : : : "memory");
++ int i;
++ for (i = 0; i < 64; i++)
++ if (foo ((struct S *) 0, 0) != ~0ULL)
++ __builtin_abort ();
++ s.s = 3;
++ s.t = 2 << 12;
++ if (foo (&s, 2) != ~0ULL)
++ __builtin_abort ();
++ if (foo (&s, 3) != (2 << 12) + 3 * 4096)
++ __builtin_abort ();
++ asm volatile ("" : : : "memory");
++ va = a; vb = b; vc = c; vd = d;
++ asm volatile ("" : : : "memory");
++ return 0;
++}
diff --git a/4.7.3/gentoo/96_all_pr56125_4.7.3_ffast-math-pow.patch b/4.7.3/gentoo/96_all_pr56125_4.7.3_ffast-math-pow.patch
new file mode 100644
index 0000000..e86b06d
--- /dev/null
+++ b/4.7.3/gentoo/96_all_pr56125_4.7.3_ffast-math-pow.patch
@@ -0,0 +1,111 @@
+-O2 -ffast-math generates bad code when dividing a double by the square of another double.
+
+http://gcc.gnu.org/PR56125
+
+
+commit a42ec1527275f12e8584e1640bc6b16a9d2ca858
+Author: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Fri Feb 1 14:17:50 2013 +0000
+
+ Backported from mainline
+ 2013-01-28 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/56125
+ * tree-ssa-math-opts.c (gimple_expand_builtin_pow): Don't optimize
+ pow(x,c) into sqrt(x) * powi(x, n/2) or
+ 1.0 / (sqrt(x) * powi(x, abs(n/2))) if c is an integer or when
+ optimizing for size.
+ Don't optimize pow(x,c) into powi(x, n/3) * powi(cbrt(x), n%3) or
+ 1.0 / (powi(x, abs(n)/3) * powi(cbrt(x), abs(n)%3)) if 2c is an
+ integer.
+
+ * gcc.dg/pr56125.c: New test.
+
+
+ git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@195664 138bc75d-0d04-0410-961f-82ee72b054a4
+---
+ gcc/ChangeLog | 11 +++++++++++
+ gcc/testsuite/ChangeLog | 5 +++++
+ gcc/testsuite/gcc.dg/pr56125.c | 21 +++++++++++++++++++++
+ gcc/tree-ssa-math-opts.c | 14 ++++++++++----
+ 4 files changed, 47 insertions(+), 4 deletions(-)
+
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/pr56125.c
+@@ -0,0 +1,21 @@
++/* PR tree-optimization/56125 */
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math" } */
++
++extern void abort (void);
++extern double fabs (double);
++
++__attribute__((cold)) double
++foo (double x, double n)
++{
++ double u = x / (n * n);
++ return u;
++}
++
++int
++main ()
++{
++ if (fabs (foo (29, 2) - 7.25) > 0.001)
++ abort ();
++ return 0;
++}
+--- a/gcc/tree-ssa-math-opts.c
++++ b/gcc/tree-ssa-math-opts.c
+@@ -1113,7 +1113,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
+ tree type, sqrtfn, cbrtfn, sqrt_arg0, sqrt_sqrt, result, cbrt_x, powi_cbrt_x;
+ tree target = NULL_TREE;
+ enum machine_mode mode;
+- bool hw_sqrt_exists;
++ bool hw_sqrt_exists, c_is_int, c2_is_int;
+
+ /* If the exponent isn't a constant, there's nothing of interest
+ to be done. */
+@@ -1125,8 +1125,9 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
+ c = TREE_REAL_CST (arg1);
+ n = real_to_integer (&c);
+ real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
++ c_is_int = real_identical (&c, &cint);
+
+- if (real_identical (&c, &cint)
++ if (c_is_int
+ && ((n >= -1 && n <= 2)
+ || (flag_unsafe_math_optimizations
+ && optimize_insn_for_speed_p ()
+@@ -1224,7 +1225,8 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
+ return build_and_insert_call (gsi, loc, &target, cbrtfn, sqrt_arg0);
+ }
+
+- /* Optimize pow(x,c), where n = 2c for some nonzero integer n, into
++ /* Optimize pow(x,c), where n = 2c for some nonzero integer n
++ and c not an integer, into
+
+ sqrt(x) * powi(x, n/2), n > 0;
+ 1.0 / (sqrt(x) * powi(x, abs(n/2))), n < 0.
+@@ -1233,10 +1235,13 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
+ real_arithmetic (&c2, MULT_EXPR, &c, &dconst2);
+ n = real_to_integer (&c2);
+ real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
++ c2_is_int = real_identical (&c2, &cint);
+
+ if (flag_unsafe_math_optimizations
+ && sqrtfn
+- && real_identical (&c2, &cint))
++ && c2_is_int
++ && !c_is_int
++ && optimize_function_for_speed_p (cfun))
+ {
+ tree powi_x_ndiv2 = NULL_TREE;
+
+@@ -1289,6 +1294,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
+ && cbrtfn
+ && (gimple_val_nonnegative_real_p (arg0) || !HONOR_NANS (mode))
+ && real_identical (&c2, &c)
++ && !c2_is_int
+ && optimize_function_for_speed_p (cfun)
+ && powi_cost (n / 3) <= POWI_MAX_MULTS)
+ {
diff --git a/4.7.3/gentoo/README.history b/4.7.3/gentoo/README.history
new file mode 100644
index 0000000..0a33a5e
--- /dev/null
+++ b/4.7.3/gentoo/README.history
@@ -0,0 +1,31 @@
+1.0 (pending)
+ + 10_all_default-fortify-source.patch
+ + 11_all_default-warn-format-security.patch
+ + 12_all_default-warn-trampolines.patch
+ + 15_all_libgfortran-Werror.patch
+ + 15_all_libgomp-Werror.patch
+ + 16_all_libgo-Werror-pr53679.patch
+ + 18_all_libgcc-cross-canadian.patch
+ + 25_all_alpha-mieee-default.patch
+ + 26_all_alpha-asm-mcpu.patch
+ + 29_all_arm_armv4t-default.patch
+ + 30_all_arm_armv4-no-thumb-fix-link.patch
+ + 33_all_armhf.patch
+ + 34_all_ia64_note.GNU-stack.patch
+ + 38_all_sh_pr24836_all-archs.patch
+ + 39_all_gfortran-sysroot-pr54725.patch
+ + 42_all_superh_default-multilib.patch
+ + 48_all_x86_pr53113_libitm-avx.patch
+ + 49_all_x86_pr52695_libitm-m64.patch
+ + 50_all_libiberty-asprintf.patch
+ + 51_all_libiberty-pic.patch
+ + 52_all_netbsd-Bsymbolic.patch
+ + 67_all_gcc-poison-system-directories.patch
+ + 74_all_gcc47_cloog-dl.patch
+ + 82_all_alpha_4.6.4_pr56023_bootstrap.patch
+ + 90_all_gcc-4.7-x32.patch
+ + 92_all_freebsd-pie.patch
+ + 93_all_pr33763_4.7.3_extern-inline.patch
+ + 94_all_pr53708_4.7.3_user-alignment.patch
+ + 95_all_pr55940_4.7.3_x86-stack-parameters.patch
+ + 96_all_pr56125_4.7.3_ffast-math-pow.patch