diff --git a/.gcc.metadata b/.gcc.metadata
index c38b824..cdc1fdf 100644
--- a/.gcc.metadata
+++ b/.gcc.metadata
@@ -1,4 +1,4 @@
 85f620a26aabf6a934c44ca40a9799af0952f863 SOURCES/cloog-0.18.0.tar.gz
 8263777994323f58bb81869354fb18c6ca32f88a SOURCES/fastjar-0.97.tar.gz
-4dc43586c58752ff53f9dbda92b16c761dca8b65 SOURCES/gcc-4.8.2-20140120.tar.bz2
+67cb44e56acd1a81e8641595b8ba300a50d5a04a SOURCES/gcc-4.8.3-20140911.tar.bz2
 d7936929c3937e03f09b64c3c54e49422fa8ddb3 SOURCES/isl-0.11.1.tar.bz2
diff --git a/.gitignore b/.gitignore
index ebc57bd..eb870f7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
 SOURCES/cloog-0.18.0.tar.gz
 SOURCES/fastjar-0.97.tar.gz
-SOURCES/gcc-4.8.2-20140120.tar.bz2
+SOURCES/gcc-4.8.3-20140911.tar.bz2
 SOURCES/isl-0.11.1.tar.bz2
diff --git a/SOURCES/cloog-0.18.0-ppc64le-config.patch b/SOURCES/cloog-0.18.0-ppc64le-config.patch
new file mode 100644
index 0000000..5538a24
--- /dev/null
+++ b/SOURCES/cloog-0.18.0-ppc64le-config.patch
@@ -0,0 +1,717 @@
+--- cloog-0.18.0/m4/libtool.m4.jj	2014-04-10 14:29:12.547772844 -0700
++++ cloog-0.18.0/m4/libtool.m4	2014-04-10 14:33:01.848642792 -0700
+@@ -1312,7 +1312,7 @@
+   rm -rf conftest*
+   ;;
+ 
+-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
++x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+   # Find out which ABI we are using.
+   echo 'int i;' > conftest.$ac_ext
+@@ -1326,7 +1326,10 @@
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_i386"
+ 	    ;;
+-	  ppc64-*linux*|powerpc64-*linux*)
++	  powerpc64le-*linux*)
++	    LD="${LD-ld} -m elf32lppclinux"
++	    ;;
++	  powerpc64-*linux*)
+ 	    LD="${LD-ld} -m elf32ppclinux"
+ 	    ;;
+ 	  s390x-*linux*)
+@@ -1345,7 +1348,10 @@
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_x86_64"
+ 	    ;;
+-	  ppc*-*linux*|powerpc*-*linux*)
++	  powerpcle-*linux*)
++	    LD="${LD-ld} -m elf64lppc"
++	    ;;
++	  powerpc-*linux*)
+ 	    LD="${LD-ld} -m elf64ppc"
+ 	    ;;
+ 	  s390*-*linux*|s390*-*tpf*)
+--- cloog-0.18.0/autoconf/config.sub.jj	2013-10-11 09:27:45.000000000 +0200
++++ cloog-0.18.0/autoconf/config.sub	2014-04-10 10:38:39.000000000 +0200
+@@ -1,24 +1,18 @@
+ #! /bin/sh
+ # Configuration validation subroutine script.
+-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+-#   2011, 2012 Free Software Foundation, Inc.
+-
+-timestamp='2012-04-18'
+-
+-# This file is (in principle) common to ALL GNU software.
+-# The presence of a machine in this file suggests that SOME GNU software
+-# can handle that machine.  It does not imply ALL GNU software can.
+-#
+-# This file is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++#   Copyright 1992-2013 Free Software Foundation, Inc.
++
++timestamp='2013-10-01'
++
++# This file is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-# GNU General Public License for more details.
++# This program is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++# General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, see <http://www.gnu.org/licenses/>.
+@@ -26,11 +20,12 @@ timestamp='2012-04-18'
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
++# the same distribution terms that you use for the rest of that
++# program.  This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+ 
+ 
+-# Please send patches to <config-patches@gnu.org>.  Submit a context
+-# diff and a properly formatted GNU ChangeLog entry.
++# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+ #
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+@@ -73,9 +68,7 @@ Report bugs and patches to <config-patch
+ version="\
+ GNU config.sub ($timestamp)
+ 
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+-Free Software Foundation, Inc.
++Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -123,7 +116,7 @@ esac
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
++  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+   knetbsd*-gnu* | netbsd*-gnu* | \
+   kopensolaris*-gnu* | \
+   storm-chaos* | os2-emx* | rtmk-nova*)
+@@ -156,7 +149,7 @@ case $os in
+ 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+-	-apple | -axis | -knuth | -cray | -microblaze)
++	-apple | -axis | -knuth | -cray | -microblaze*)
+ 		os=
+ 		basic_machine=$1
+ 		;;
+@@ -259,10 +252,12 @@ case $basic_machine in
+ 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ 	| am33_2.0 \
+-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+-        | be32 | be64 \
++	| arc | arceb \
++	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
++	| avr | avr32 \
++	| be32 | be64 \
+ 	| bfin \
+-	| c4x | clipper \
++	| c4x | c8051 | clipper \
+ 	| d10v | d30v | dlx | dsp16xx \
+ 	| epiphany \
+ 	| fido | fr30 | frv \
+@@ -270,10 +265,11 @@ case $basic_machine in
+ 	| hexagon \
+ 	| i370 | i860 | i960 | ia64 \
+ 	| ip2k | iq2000 \
++	| k1om \
+ 	| le32 | le64 \
+ 	| lm32 \
+ 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+-	| maxq | mb | microblaze | mcore | mep | metag \
++	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ 	| mips | mipsbe | mipseb | mipsel | mipsle \
+ 	| mips16 \
+ 	| mips64 | mips64el \
+@@ -291,16 +287,17 @@ case $basic_machine in
+ 	| mipsisa64r2 | mipsisa64r2el \
+ 	| mipsisa64sb1 | mipsisa64sb1el \
+ 	| mipsisa64sr71k | mipsisa64sr71kel \
++	| mipsr5900 | mipsr5900el \
+ 	| mipstx39 | mipstx39el \
+ 	| mn10200 | mn10300 \
+ 	| moxie \
+ 	| mt \
+ 	| msp430 \
+ 	| nds32 | nds32le | nds32be \
+-	| nios | nios2 \
++	| nios | nios2 | nios2eb | nios2el \
+ 	| ns16k | ns32k \
+ 	| open8 \
+-	| or32 \
++	| or1k | or32 \
+ 	| pdp10 | pdp11 | pj | pjl \
+ 	| powerpc | powerpc64 | powerpc64le | powerpcle \
+ 	| pyramid \
+@@ -328,7 +325,7 @@ case $basic_machine in
+ 	c6x)
+ 		basic_machine=tic6x-unknown
+ 		;;
+-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
++	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ 		basic_machine=$basic_machine-unknown
+ 		os=-none
+ 		;;
+@@ -370,13 +367,13 @@ case $basic_machine in
+ 	| aarch64-* | aarch64_be-* \
+ 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+ 	| avr-* | avr32-* \
+ 	| be32-* | be64-* \
+ 	| bfin-* | bs2000-* \
+ 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+-	| clipper-* | craynv-* | cydra-* \
++	| c8051-* | clipper-* | craynv-* | cydra-* \
+ 	| d10v-* | d30v-* | dlx-* \
+ 	| elxsi-* \
+ 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+@@ -385,11 +382,13 @@ case $basic_machine in
+ 	| hexagon-* \
+ 	| i*86-* | i860-* | i960-* | ia64-* \
+ 	| ip2k-* | iq2000-* \
++	| k1om-* \
+ 	| le32-* | le64-* \
+ 	| lm32-* \
+ 	| m32c-* | m32r-* | m32rle-* \
+ 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
++	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
++	| microblaze-* | microblazeel-* \
+ 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ 	| mips16-* \
+ 	| mips64-* | mips64el-* \
+@@ -407,12 +406,13 @@ case $basic_machine in
+ 	| mipsisa64r2-* | mipsisa64r2el-* \
+ 	| mipsisa64sb1-* | mipsisa64sb1el-* \
+ 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
++	| mipsr5900-* | mipsr5900el-* \
+ 	| mipstx39-* | mipstx39el-* \
+ 	| mmix-* \
+ 	| mt-* \
+ 	| msp430-* \
+ 	| nds32-* | nds32le-* | nds32be-* \
+-	| nios-* | nios2-* \
++	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+ 	| none-* | np1-* | ns16k-* | ns32k-* \
+ 	| open8-* \
+ 	| orion-* \
+@@ -788,11 +788,15 @@ case $basic_machine in
+ 		basic_machine=ns32k-utek
+ 		os=-sysv
+ 		;;
+-	microblaze)
++	microblaze*)
+ 		basic_machine=microblaze-xilinx
+ 		;;
++	mingw64)
++		basic_machine=x86_64-pc
++		os=-mingw64
++		;;
+ 	mingw32)
+-		basic_machine=i386-pc
++		basic_machine=i686-pc
+ 		os=-mingw32
+ 		;;
+ 	mingw32ce)
+@@ -828,7 +832,7 @@ case $basic_machine in
+ 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ 		;;
+ 	msys)
+-		basic_machine=i386-pc
++		basic_machine=i686-pc
+ 		os=-msys
+ 		;;
+ 	mvs)
+@@ -1019,7 +1023,11 @@ case $basic_machine in
+ 		basic_machine=i586-unknown
+ 		os=-pw32
+ 		;;
+-	rdos)
++	rdos | rdos64)
++		basic_machine=x86_64-pc
++		os=-rdos
++		;;
++	rdos32)
+ 		basic_machine=i386-pc
+ 		os=-rdos
+ 		;;
+@@ -1346,21 +1354,21 @@ case $os in
+ 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+-	      | -sym* | -kopensolaris* \
++	      | -sym* | -kopensolaris* | -plan9* \
+ 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ 	      | -aos* | -aros* \
+ 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+-	      | -openbsd* | -solidbsd* \
++	      | -bitrig* | -openbsd* | -solidbsd* \
+ 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ 	      | -chorusos* | -chorusrdb* | -cegcc* \
+ 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+-	      | -mingw32* | -linux-gnu* | -linux-android* \
+-	      | -linux-newlib* | -linux-uclibc* \
++	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ 	      | -uxpv* | -beos* | -mpeix* | -udk* \
+ 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+@@ -1492,9 +1500,6 @@ case $os in
+ 	-aros*)
+ 		os=-aros
+ 		;;
+-	-kaos*)
+-		os=-kaos
+-		;;
+ 	-zvmoe)
+ 		os=-zvmoe
+ 		;;
+@@ -1543,6 +1548,9 @@ case $basic_machine in
+ 	c4x-* | tic4x-*)
+ 		os=-coff
+ 		;;
++	c8051-*)
++		os=-elf
++		;;
+ 	hexagon-*)
+ 		os=-elf
+ 		;;
+@@ -1586,6 +1594,9 @@ case $basic_machine in
+ 	mips*-*)
+ 		os=-elf
+ 		;;
++	or1k-*)
++		os=-elf
++		;;
+ 	or32-*)
+ 		os=-coff
+ 		;;
+--- cloog-0.18.0/autoconf/config.guess.jj	2013-10-11 09:27:45.000000000 +0200
++++ cloog-0.18.0/autoconf/config.guess	2014-04-10 10:38:36.000000000 +0200
+@@ -1,14 +1,12 @@
+ #! /bin/sh
+ # Attempt to guess a canonical system name.
+-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+-#   2011, 2012 Free Software Foundation, Inc.
++#   Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+-timestamp='2012-02-10'
++timestamp='2013-06-10'
+ 
+ # This file is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful, but
+@@ -22,19 +20,17 @@ timestamp='2012-02-10'
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
+-
+-
+-# Originally written by Per Bothner.  Please send patches (context
+-# diff format) to <config-patches@gnu.org> and include a ChangeLog
+-# entry.
++# the same distribution terms that you use for the rest of that
++# program.  This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+ #
+-# This script attempts to guess a canonical system name similar to
+-# config.sub.  If it succeeds, it prints the system name on stdout, and
+-# exits with 0.  Otherwise, it exits with 1.
++# Originally written by Per Bothner.
+ #
+ # You can get the latest version of this script from:
+ # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
++#
++# Please send patches with a ChangeLog entry to config-patches@gnu.org.
++
+ 
+ me=`echo "$0" | sed -e 's,.*/,,'`
+ 
+@@ -54,9 +50,7 @@ version="\
+ GNU config.guess ($timestamp)
+ 
+ Originally written by Per Bothner.
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+-Free Software Foundation, Inc.
++Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` |
+ UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+ 
++case "${UNAME_SYSTEM}" in
++Linux|GNU|GNU/*)
++	# If the system lacks a compiler, then just pick glibc.
++	# We could probably try harder.
++	LIBC=gnu
++
++	eval $set_cc_for_build
++	cat <<-EOF > $dummy.c
++	#include <features.h>
++	#if defined(__UCLIBC__)
++	LIBC=uclibc
++	#elif defined(__dietlibc__)
++	LIBC=dietlibc
++	#else
++	LIBC=gnu
++	#endif
++	EOF
++	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
++	;;
++esac
++
+ # Note: order is significant - the case branches are not exclusive.
+ 
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+@@ -200,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+ 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ 	echo "${machine}-${os}${release}"
+ 	exit ;;
++    *:Bitrig:*:*)
++	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
++	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
++	exit ;;
+     *:OpenBSD:*:*)
+ 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+@@ -302,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ 	echo arm-acorn-riscix${UNAME_RELEASE}
+ 	exit ;;
+-    arm:riscos:*:*|arm:RISCOS:*:*)
++    arm*:riscos:*:*|arm*:RISCOS:*:*)
+ 	echo arm-unknown-riscos
+ 	exit ;;
+     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+@@ -801,6 +820,9 @@ EOF
+     i*:CYGWIN*:*)
+ 	echo ${UNAME_MACHINE}-pc-cygwin
+ 	exit ;;
++    *:MINGW64*:*)
++	echo ${UNAME_MACHINE}-pc-mingw64
++	exit ;;
+     *:MINGW*:*)
+ 	echo ${UNAME_MACHINE}-pc-mingw32
+ 	exit ;;
+@@ -852,21 +874,21 @@ EOF
+ 	exit ;;
+     *:GNU:*:*)
+ 	# the GNU system
+-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
++	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ 	exit ;;
+     *:GNU/*:*:*)
+ 	# other systems with GNU libc and userland
+-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
++	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ 	exit ;;
+     i*86:Minix:*:*)
+ 	echo ${UNAME_MACHINE}-pc-minix
+ 	exit ;;
+     aarch64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     aarch64_be:Linux:*:*)
+ 	UNAME_MACHINE=aarch64_be
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     alpha:Linux:*:*)
+ 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+@@ -879,59 +901,54 @@ EOF
+ 	  EV68*) UNAME_MACHINE=alphaev68 ;;
+ 	esac
+ 	objdump --private-headers /bin/sh | grep -q ld.so.1
+-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
++	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
++    arc:Linux:*:* | arceb:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     arm*:Linux:*:*)
+ 	eval $set_cc_for_build
+ 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ 	    | grep -q __ARM_EABI__
+ 	then
+-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
++	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	else
+ 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ 		| grep -q __ARM_PCS_VFP
+ 	    then
+-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
++		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+ 	    else
+-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
++		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+ 	    fi
+ 	fi
+ 	exit ;;
+     avr32*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     cris:Linux:*:*)
+-	echo ${UNAME_MACHINE}-axis-linux-gnu
++	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
+     crisv32:Linux:*:*)
+-	echo ${UNAME_MACHINE}-axis-linux-gnu
++	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
+     frv:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     hexagon:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:Linux:*:*)
+-	LIBC=gnu
+-	eval $set_cc_for_build
+-	sed 's/^	//' << EOF >$dummy.c
+-	#ifdef __dietlibc__
+-	LIBC=dietlibc
+-	#endif
+-EOF
+-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
++	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ 	exit ;;
+     ia64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     m32r*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     m68*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     mips:Linux:*:* | mips64:Linux:*:*)
+ 	eval $set_cc_for_build
+@@ -950,54 +967,63 @@ EOF
+ 	#endif
+ EOF
+ 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
++	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ 	;;
++    or1k:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
+     or32:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     padre:Linux:*:*)
+-	echo sparc-unknown-linux-gnu
++	echo sparc-unknown-linux-${LIBC}
+ 	exit ;;
+     parisc64:Linux:*:* | hppa64:Linux:*:*)
+-	echo hppa64-unknown-linux-gnu
++	echo hppa64-unknown-linux-${LIBC}
+ 	exit ;;
+     parisc:Linux:*:* | hppa:Linux:*:*)
+ 	# Look for CPU level
+ 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+-	  *)    echo hppa-unknown-linux-gnu ;;
++	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
++	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
++	  *)    echo hppa-unknown-linux-${LIBC} ;;
+ 	esac
+ 	exit ;;
+     ppc64:Linux:*:*)
+-	echo powerpc64-unknown-linux-gnu
++	echo powerpc64-unknown-linux-${LIBC}
+ 	exit ;;
+     ppc:Linux:*:*)
+-	echo powerpc-unknown-linux-gnu
++	echo powerpc-unknown-linux-${LIBC}
++	exit ;;
++    ppc64le:Linux:*:*)
++	echo powerpc64le-unknown-linux-${LIBC}
++	exit ;;
++    ppcle:Linux:*:*)
++	echo powerpcle-unknown-linux-${LIBC}
+ 	exit ;;
+     s390:Linux:*:* | s390x:Linux:*:*)
+-	echo ${UNAME_MACHINE}-ibm-linux
++	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+ 	exit ;;
+     sh64*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     sh*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     sparc:Linux:*:* | sparc64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     tile*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     vax:Linux:*:*)
+-	echo ${UNAME_MACHINE}-dec-linux-gnu
++	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ 	exit ;;
+     x86_64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     xtensa*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:DYNIX/ptx:4*:*)
+ 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+@@ -1201,6 +1227,9 @@ EOF
+     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+ 	echo i586-pc-haiku
+ 	exit ;;
++    x86_64:Haiku:*:*)
++	echo x86_64-unknown-haiku
++	exit ;;
+     SX-4:SUPER-UX:*:*)
+ 	echo sx4-nec-superux${UNAME_RELEASE}
+ 	exit ;;
+@@ -1227,19 +1256,21 @@ EOF
+ 	exit ;;
+     *:Darwin:*:*)
+ 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+-	case $UNAME_PROCESSOR in
+-	    i386)
+-		eval $set_cc_for_build
+-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+-		      grep IS_64BIT_ARCH >/dev/null
+-		  then
+-		      UNAME_PROCESSOR="x86_64"
+-		  fi
+-		fi ;;
+-	    unknown) UNAME_PROCESSOR=powerpc ;;
+-	esac
++	eval $set_cc_for_build
++	if test "$UNAME_PROCESSOR" = unknown ; then
++	    UNAME_PROCESSOR=powerpc
++	fi
++	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
++	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
++		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
++		grep IS_64BIT_ARCH >/dev/null
++	    then
++		case $UNAME_PROCESSOR in
++		    i386) UNAME_PROCESSOR=x86_64 ;;
++		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
++		esac
++	    fi
++	fi
+ 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ 	exit ;;
+     *:procnto*:*:* | *:QNX:[0123456789]*:*)
+@@ -1256,7 +1287,7 @@ EOF
+     NEO-?:NONSTOP_KERNEL:*:*)
+ 	echo neo-tandem-nsk${UNAME_RELEASE}
+ 	exit ;;
+-    NSE-?:NONSTOP_KERNEL:*:*)
++    NSE-*:NONSTOP_KERNEL:*:*)
+ 	echo nse-tandem-nsk${UNAME_RELEASE}
+ 	exit ;;
+     NSR-?:NONSTOP_KERNEL:*:*)
+@@ -1330,9 +1361,6 @@ EOF
+ 	exit ;;
+ esac
+ 
+-#echo '(No uname command or uname output not recognized.)' 1>&2
+-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+-
+ eval $set_cc_for_build
+ cat >$dummy.c <<EOF
+ #ifdef _SEQUENT_
+--- cloog-0.18.0/configure.jj	2013-10-11 09:27:47.000000000 +0200
++++ cloog-0.18.0/configure	2014-04-10 20:38:25.078020675 +0200
+@@ -6383,7 +6383,7 @@ ia64-*-hpux*)
+   rm -rf conftest*
+   ;;
+ 
+-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
++x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+   # Find out which ABI we are using.
+   echo 'int i;' > conftest.$ac_ext
+@@ -1326,7 +1326,10 @@
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_i386"
+ 	    ;;
+-	  ppc64-*linux*|powerpc64-*linux*)
++	  powerpc64le-*linux*)
++	    LD="${LD-ld} -m elf32lppclinux"
++	    ;;
++	  powerpc64-*linux*)
+ 	    LD="${LD-ld} -m elf32ppclinux"
+ 	    ;;
+ 	  s390x-*linux*)
+@@ -1345,7 +1348,10 @@
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_x86_64"
+ 	    ;;
+-	  ppc*-*linux*|powerpc*-*linux*)
++	  powerpcle-*linux*)
++	    LD="${LD-ld} -m elf64lppc"
++	    ;;
++	  powerpc-*linux*)
+ 	    LD="${LD-ld} -m elf64ppc"
+ 	    ;;
+ 	  s390*-*linux*|s390*-*tpf*)
diff --git a/SOURCES/fastjar-0.97-ppc64le-config.patch b/SOURCES/fastjar-0.97-ppc64le-config.patch
new file mode 100644
index 0000000..5671561
--- /dev/null
+++ b/SOURCES/fastjar-0.97-ppc64le-config.patch
@@ -0,0 +1,708 @@
+--- fastjar-0.97/m4/libtool.m4.jj	2008-10-16 10:14:54.000000000 +0200
++++ fastjar-0.97/m4/libtool.m4	2014-04-10 20:41:26.563064023 +0200
+@@ -1263,7 +1263,7 @@ ia64-*-hpux*)
+   rm -rf conftest*
+   ;;
+ 
+-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
++x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+   # Find out which ABI we are using.
+   echo 'int i;' > conftest.$ac_ext
+@@ -1277,7 +1277,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_i386"
+ 	    ;;
+-	  ppc64-*linux*|powerpc64-*linux*)
++	  powerpc64le-*linux*)
++	    LD="${LD-ld} -m elf32lppclinux"
++	    ;;
++	  powerpc64-*linux*)
+ 	    LD="${LD-ld} -m elf32ppclinux"
+ 	    ;;
+ 	  s390x-*linux*)
+@@ -1296,7 +1299,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_x86_64"
+ 	    ;;
+-	  ppc*-*linux*|powerpc*-*linux*)
++	  powerpcle-*linux*)
++	    LD="${LD-ld} -m elf64lppc"
++	    ;;
++	  powerpc-*linux*)
+ 	    LD="${LD-ld} -m elf64ppc"
+ 	    ;;
+ 	  s390*-*linux*|s390*-*tpf*)
+--- fastjar-0.97/config.sub.jj	2014-04-10 20:40:53.000000000 +0200
++++ fastjar-0.97/config.sub	2014-04-10 10:38:39.000000000 +0200
+@@ -1,24 +1,18 @@
+ #! /bin/sh
+ # Configuration validation subroutine script.
+-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+-#   2011, 2012 Free Software Foundation, Inc.
+-
+-timestamp='2012-04-18'
+-
+-# This file is (in principle) common to ALL GNU software.
+-# The presence of a machine in this file suggests that SOME GNU software
+-# can handle that machine.  It does not imply ALL GNU software can.
+-#
+-# This file is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++#   Copyright 1992-2013 Free Software Foundation, Inc.
++
++timestamp='2013-10-01'
++
++# This file is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-# GNU General Public License for more details.
++# This program is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++# General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, see <http://www.gnu.org/licenses/>.
+@@ -26,11 +20,12 @@ timestamp='2012-04-18'
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
++# the same distribution terms that you use for the rest of that
++# program.  This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+ 
+ 
+-# Please send patches to <config-patches@gnu.org>.  Submit a context
+-# diff and a properly formatted GNU ChangeLog entry.
++# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+ #
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+@@ -73,9 +68,7 @@ Report bugs and patches to <config-patch
+ version="\
+ GNU config.sub ($timestamp)
+ 
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+-Free Software Foundation, Inc.
++Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -123,7 +116,7 @@ esac
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
++  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+   knetbsd*-gnu* | netbsd*-gnu* | \
+   kopensolaris*-gnu* | \
+   storm-chaos* | os2-emx* | rtmk-nova*)
+@@ -156,7 +149,7 @@ case $os in
+ 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+-	-apple | -axis | -knuth | -cray | -microblaze)
++	-apple | -axis | -knuth | -cray | -microblaze*)
+ 		os=
+ 		basic_machine=$1
+ 		;;
+@@ -259,10 +252,12 @@ case $basic_machine in
+ 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ 	| am33_2.0 \
+-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+-        | be32 | be64 \
++	| arc | arceb \
++	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
++	| avr | avr32 \
++	| be32 | be64 \
+ 	| bfin \
+-	| c4x | clipper \
++	| c4x | c8051 | clipper \
+ 	| d10v | d30v | dlx | dsp16xx \
+ 	| epiphany \
+ 	| fido | fr30 | frv \
+@@ -270,10 +265,11 @@ case $basic_machine in
+ 	| hexagon \
+ 	| i370 | i860 | i960 | ia64 \
+ 	| ip2k | iq2000 \
++	| k1om \
+ 	| le32 | le64 \
+ 	| lm32 \
+ 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+-	| maxq | mb | microblaze | mcore | mep | metag \
++	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ 	| mips | mipsbe | mipseb | mipsel | mipsle \
+ 	| mips16 \
+ 	| mips64 | mips64el \
+@@ -291,16 +287,17 @@ case $basic_machine in
+ 	| mipsisa64r2 | mipsisa64r2el \
+ 	| mipsisa64sb1 | mipsisa64sb1el \
+ 	| mipsisa64sr71k | mipsisa64sr71kel \
++	| mipsr5900 | mipsr5900el \
+ 	| mipstx39 | mipstx39el \
+ 	| mn10200 | mn10300 \
+ 	| moxie \
+ 	| mt \
+ 	| msp430 \
+ 	| nds32 | nds32le | nds32be \
+-	| nios | nios2 \
++	| nios | nios2 | nios2eb | nios2el \
+ 	| ns16k | ns32k \
+ 	| open8 \
+-	| or32 \
++	| or1k | or32 \
+ 	| pdp10 | pdp11 | pj | pjl \
+ 	| powerpc | powerpc64 | powerpc64le | powerpcle \
+ 	| pyramid \
+@@ -328,7 +325,7 @@ case $basic_machine in
+ 	c6x)
+ 		basic_machine=tic6x-unknown
+ 		;;
+-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
++	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ 		basic_machine=$basic_machine-unknown
+ 		os=-none
+ 		;;
+@@ -370,13 +367,13 @@ case $basic_machine in
+ 	| aarch64-* | aarch64_be-* \
+ 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+ 	| avr-* | avr32-* \
+ 	| be32-* | be64-* \
+ 	| bfin-* | bs2000-* \
+ 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+-	| clipper-* | craynv-* | cydra-* \
++	| c8051-* | clipper-* | craynv-* | cydra-* \
+ 	| d10v-* | d30v-* | dlx-* \
+ 	| elxsi-* \
+ 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+@@ -385,11 +382,13 @@ case $basic_machine in
+ 	| hexagon-* \
+ 	| i*86-* | i860-* | i960-* | ia64-* \
+ 	| ip2k-* | iq2000-* \
++	| k1om-* \
+ 	| le32-* | le64-* \
+ 	| lm32-* \
+ 	| m32c-* | m32r-* | m32rle-* \
+ 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
++	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
++	| microblaze-* | microblazeel-* \
+ 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ 	| mips16-* \
+ 	| mips64-* | mips64el-* \
+@@ -407,12 +406,13 @@ case $basic_machine in
+ 	| mipsisa64r2-* | mipsisa64r2el-* \
+ 	| mipsisa64sb1-* | mipsisa64sb1el-* \
+ 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
++	| mipsr5900-* | mipsr5900el-* \
+ 	| mipstx39-* | mipstx39el-* \
+ 	| mmix-* \
+ 	| mt-* \
+ 	| msp430-* \
+ 	| nds32-* | nds32le-* | nds32be-* \
+-	| nios-* | nios2-* \
++	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+ 	| none-* | np1-* | ns16k-* | ns32k-* \
+ 	| open8-* \
+ 	| orion-* \
+@@ -788,11 +788,15 @@ case $basic_machine in
+ 		basic_machine=ns32k-utek
+ 		os=-sysv
+ 		;;
+-	microblaze)
++	microblaze*)
+ 		basic_machine=microblaze-xilinx
+ 		;;
++	mingw64)
++		basic_machine=x86_64-pc
++		os=-mingw64
++		;;
+ 	mingw32)
+-		basic_machine=i386-pc
++		basic_machine=i686-pc
+ 		os=-mingw32
+ 		;;
+ 	mingw32ce)
+@@ -828,7 +832,7 @@ case $basic_machine in
+ 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ 		;;
+ 	msys)
+-		basic_machine=i386-pc
++		basic_machine=i686-pc
+ 		os=-msys
+ 		;;
+ 	mvs)
+@@ -1019,7 +1023,11 @@ case $basic_machine in
+ 		basic_machine=i586-unknown
+ 		os=-pw32
+ 		;;
+-	rdos)
++	rdos | rdos64)
++		basic_machine=x86_64-pc
++		os=-rdos
++		;;
++	rdos32)
+ 		basic_machine=i386-pc
+ 		os=-rdos
+ 		;;
+@@ -1346,21 +1354,21 @@ case $os in
+ 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+-	      | -sym* | -kopensolaris* \
++	      | -sym* | -kopensolaris* | -plan9* \
+ 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ 	      | -aos* | -aros* \
+ 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+-	      | -openbsd* | -solidbsd* \
++	      | -bitrig* | -openbsd* | -solidbsd* \
+ 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ 	      | -chorusos* | -chorusrdb* | -cegcc* \
+ 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+-	      | -mingw32* | -linux-gnu* | -linux-android* \
+-	      | -linux-newlib* | -linux-uclibc* \
++	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ 	      | -uxpv* | -beos* | -mpeix* | -udk* \
+ 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+@@ -1492,9 +1500,6 @@ case $os in
+ 	-aros*)
+ 		os=-aros
+ 		;;
+-	-kaos*)
+-		os=-kaos
+-		;;
+ 	-zvmoe)
+ 		os=-zvmoe
+ 		;;
+@@ -1543,6 +1548,9 @@ case $basic_machine in
+ 	c4x-* | tic4x-*)
+ 		os=-coff
+ 		;;
++	c8051-*)
++		os=-elf
++		;;
+ 	hexagon-*)
+ 		os=-elf
+ 		;;
+@@ -1586,6 +1594,9 @@ case $basic_machine in
+ 	mips*-*)
+ 		os=-elf
+ 		;;
++	or1k-*)
++		os=-elf
++		;;
+ 	or32-*)
+ 		os=-coff
+ 		;;
+--- fastjar-0.97/config.guess.jj	2014-04-10 20:40:53.000000000 +0200
++++ fastjar-0.97/config.guess	2014-04-10 10:38:36.000000000 +0200
+@@ -1,14 +1,12 @@
+ #! /bin/sh
+ # Attempt to guess a canonical system name.
+-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+-#   2011, 2012 Free Software Foundation, Inc.
++#   Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+-timestamp='2012-06-10'
++timestamp='2013-06-10'
+ 
+ # This file is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful, but
+@@ -22,19 +20,17 @@ timestamp='2012-06-10'
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
+-
+-
+-# Originally written by Per Bothner.  Please send patches (context
+-# diff format) to <config-patches@gnu.org> and include a ChangeLog
+-# entry.
++# the same distribution terms that you use for the rest of that
++# program.  This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+ #
+-# This script attempts to guess a canonical system name similar to
+-# config.sub.  If it succeeds, it prints the system name on stdout, and
+-# exits with 0.  Otherwise, it exits with 1.
++# Originally written by Per Bothner.
+ #
+ # You can get the latest version of this script from:
+ # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
++#
++# Please send patches with a ChangeLog entry to config-patches@gnu.org.
++
+ 
+ me=`echo "$0" | sed -e 's,.*/,,'`
+ 
+@@ -54,9 +50,7 @@ version="\
+ GNU config.guess ($timestamp)
+ 
+ Originally written by Per Bothner.
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+-Free Software Foundation, Inc.
++Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` |
+ UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+ 
++case "${UNAME_SYSTEM}" in
++Linux|GNU|GNU/*)
++	# If the system lacks a compiler, then just pick glibc.
++	# We could probably try harder.
++	LIBC=gnu
++
++	eval $set_cc_for_build
++	cat <<-EOF > $dummy.c
++	#include <features.h>
++	#if defined(__UCLIBC__)
++	LIBC=uclibc
++	#elif defined(__dietlibc__)
++	LIBC=dietlibc
++	#else
++	LIBC=gnu
++	#endif
++	EOF
++	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
++	;;
++esac
++
+ # Note: order is significant - the case branches are not exclusive.
+ 
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+@@ -200,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+ 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ 	echo "${machine}-${os}${release}"
+ 	exit ;;
++    *:Bitrig:*:*)
++	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
++	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
++	exit ;;
+     *:OpenBSD:*:*)
+ 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+@@ -302,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ 	echo arm-acorn-riscix${UNAME_RELEASE}
+ 	exit ;;
+-    arm:riscos:*:*|arm:RISCOS:*:*)
++    arm*:riscos:*:*|arm*:RISCOS:*:*)
+ 	echo arm-unknown-riscos
+ 	exit ;;
+     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+@@ -801,6 +820,9 @@ EOF
+     i*:CYGWIN*:*)
+ 	echo ${UNAME_MACHINE}-pc-cygwin
+ 	exit ;;
++    *:MINGW64*:*)
++	echo ${UNAME_MACHINE}-pc-mingw64
++	exit ;;
+     *:MINGW*:*)
+ 	echo ${UNAME_MACHINE}-pc-mingw32
+ 	exit ;;
+@@ -852,21 +874,21 @@ EOF
+ 	exit ;;
+     *:GNU:*:*)
+ 	# the GNU system
+-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
++	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ 	exit ;;
+     *:GNU/*:*:*)
+ 	# other systems with GNU libc and userland
+-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
++	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ 	exit ;;
+     i*86:Minix:*:*)
+ 	echo ${UNAME_MACHINE}-pc-minix
+ 	exit ;;
+     aarch64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     aarch64_be:Linux:*:*)
+ 	UNAME_MACHINE=aarch64_be
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     alpha:Linux:*:*)
+ 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+@@ -879,59 +901,54 @@ EOF
+ 	  EV68*) UNAME_MACHINE=alphaev68 ;;
+ 	esac
+ 	objdump --private-headers /bin/sh | grep -q ld.so.1
+-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
++	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
++    arc:Linux:*:* | arceb:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     arm*:Linux:*:*)
+ 	eval $set_cc_for_build
+ 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ 	    | grep -q __ARM_EABI__
+ 	then
+-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
++	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	else
+ 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ 		| grep -q __ARM_PCS_VFP
+ 	    then
+-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
++		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+ 	    else
+-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
++		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+ 	    fi
+ 	fi
+ 	exit ;;
+     avr32*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     cris:Linux:*:*)
+-	echo ${UNAME_MACHINE}-axis-linux-gnu
++	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
+     crisv32:Linux:*:*)
+-	echo ${UNAME_MACHINE}-axis-linux-gnu
++	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
+     frv:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     hexagon:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:Linux:*:*)
+-	LIBC=gnu
+-	eval $set_cc_for_build
+-	sed 's/^	//' << EOF >$dummy.c
+-	#ifdef __dietlibc__
+-	LIBC=dietlibc
+-	#endif
+-EOF
+-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
++	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ 	exit ;;
+     ia64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     m32r*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     m68*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     mips:Linux:*:* | mips64:Linux:*:*)
+ 	eval $set_cc_for_build
+@@ -950,54 +967,63 @@ EOF
+ 	#endif
+ EOF
+ 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
++	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ 	;;
++    or1k:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
+     or32:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     padre:Linux:*:*)
+-	echo sparc-unknown-linux-gnu
++	echo sparc-unknown-linux-${LIBC}
+ 	exit ;;
+     parisc64:Linux:*:* | hppa64:Linux:*:*)
+-	echo hppa64-unknown-linux-gnu
++	echo hppa64-unknown-linux-${LIBC}
+ 	exit ;;
+     parisc:Linux:*:* | hppa:Linux:*:*)
+ 	# Look for CPU level
+ 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+-	  *)    echo hppa-unknown-linux-gnu ;;
++	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
++	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
++	  *)    echo hppa-unknown-linux-${LIBC} ;;
+ 	esac
+ 	exit ;;
+     ppc64:Linux:*:*)
+-	echo powerpc64-unknown-linux-gnu
++	echo powerpc64-unknown-linux-${LIBC}
+ 	exit ;;
+     ppc:Linux:*:*)
+-	echo powerpc-unknown-linux-gnu
++	echo powerpc-unknown-linux-${LIBC}
++	exit ;;
++    ppc64le:Linux:*:*)
++	echo powerpc64le-unknown-linux-${LIBC}
++	exit ;;
++    ppcle:Linux:*:*)
++	echo powerpcle-unknown-linux-${LIBC}
+ 	exit ;;
+     s390:Linux:*:* | s390x:Linux:*:*)
+-	echo ${UNAME_MACHINE}-ibm-linux
++	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+ 	exit ;;
+     sh64*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     sh*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     sparc:Linux:*:* | sparc64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     tile*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     vax:Linux:*:*)
+-	echo ${UNAME_MACHINE}-dec-linux-gnu
++	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ 	exit ;;
+     x86_64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     xtensa*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:DYNIX/ptx:4*:*)
+ 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+@@ -1201,6 +1227,9 @@ EOF
+     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+ 	echo i586-pc-haiku
+ 	exit ;;
++    x86_64:Haiku:*:*)
++	echo x86_64-unknown-haiku
++	exit ;;
+     SX-4:SUPER-UX:*:*)
+ 	echo sx4-nec-superux${UNAME_RELEASE}
+ 	exit ;;
+@@ -1227,19 +1256,21 @@ EOF
+ 	exit ;;
+     *:Darwin:*:*)
+ 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+-	case $UNAME_PROCESSOR in
+-	    i386)
+-		eval $set_cc_for_build
+-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+-		      grep IS_64BIT_ARCH >/dev/null
+-		  then
+-		      UNAME_PROCESSOR="x86_64"
+-		  fi
+-		fi ;;
+-	    unknown) UNAME_PROCESSOR=powerpc ;;
+-	esac
++	eval $set_cc_for_build
++	if test "$UNAME_PROCESSOR" = unknown ; then
++	    UNAME_PROCESSOR=powerpc
++	fi
++	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
++	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
++		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
++		grep IS_64BIT_ARCH >/dev/null
++	    then
++		case $UNAME_PROCESSOR in
++		    i386) UNAME_PROCESSOR=x86_64 ;;
++		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
++		esac
++	    fi
++	fi
+ 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ 	exit ;;
+     *:procnto*:*:* | *:QNX:[0123456789]*:*)
+@@ -1330,9 +1361,6 @@ EOF
+ 	exit ;;
+ esac
+ 
+-#echo '(No uname command or uname output not recognized.)' 1>&2
+-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+-
+ eval $set_cc_for_build
+ cat >$dummy.c <<EOF
+ #ifdef _SEQUENT_
+--- fastjar-0.97/configure.jj	2008-10-16 10:15:10.000000000 +0200
++++ fastjar-0.97/configure	2014-04-10 20:43:07.458531730 +0200
+@@ -6918,7 +6918,7 @@ ia64-*-hpux*)
+   rm -rf conftest*
+   ;;
+ 
+-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
++x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+   # Find out which ABI we are using.
+   echo 'int i;' > conftest.$ac_ext
+@@ -6936,7 +6936,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_i386"
+ 	    ;;
+-	  ppc64-*linux*|powerpc64-*linux*)
++	  powerpc64le-*linux*)
++	    LD="${LD-ld} -m elf32lppclinux"
++	    ;;
++	  powerpc64-*linux*)
+ 	    LD="${LD-ld} -m elf32ppclinux"
+ 	    ;;
+ 	  s390x-*linux*)
+@@ -6955,7 +6958,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_x86_64"
+ 	    ;;
+-	  ppc*-*linux*|powerpc*-*linux*)
++	  powerpcle-*linux*)
++	    LD="${LD-ld} -m elf64lppc"
++	    ;;
++	  powerpc-*linux*)
+ 	    LD="${LD-ld} -m elf64ppc"
+ 	    ;;
+ 	  s390*-*linux*|s390*-*tpf*)
diff --git a/SOURCES/gcc48-aarch64-ada.patch b/SOURCES/gcc48-aarch64-ada.patch
new file mode 100644
index 0000000..4d2fb7d
--- /dev/null
+++ b/SOURCES/gcc48-aarch64-ada.patch
@@ -0,0 +1,96 @@
+2014-04-09  Richard Henderson  <rth@redhat.com>
+
+	* gcc-interface/Makefile.in: Support aarch64-linux.
+	* init.c: Enable alternate stack support also on aarch64.
+	* types.h (Fat_Pointer): Remove aligned attribute.
+
+--- gcc/ada/gcc-interface/Makefile.in
++++ gcc/ada/gcc-interface/Makefile.in
+@@ -2123,6 +2123,44 @@ ifeq ($(strip $(filter-out alpha% linux%,$(arch) $(osys))),)
+   LIBRARY_VERSION := $(LIB_VERSION)
+ endif
+ 
++# AArch64 Linux
++ifeq ($(strip $(filter-out aarch64% 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) \
++  $(ATOMICS_BUILTINS_TARGET_PAIRS) \
++  system.ads<system-linux-x86_64.ads
++  ## ^^ Note the above is a pretty-close placeholder.
++
++  TOOLS_TARGET_PAIRS =  \
++    mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++    indepsw.adb<indepsw-gnu.adb
++
++  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
++
+ # x86-64 Linux
+ ifeq ($(strip $(filter-out %x86_64 linux%,$(arch) $(osys))),)
+   LIBGNAT_TARGET_PAIRS = \
+--- gcc/ada/init.c
++++ gcc/ada/init.c
+@@ -562,7 +562,9 @@ __gnat_error_handler (int sig, siginfo_t *si ATTRIBUTE_UNUSED, void *ucontext)
+   Raise_From_Signal_Handler (exception, msg);
+ }
+ 
+-#if defined (i386) || defined (__x86_64__) || defined (__powerpc__)
++#if defined (i386) || defined (__x86_64__) || defined (__powerpc__) \
++    || defined (__aarch64__)
++#define HAVE_GNAT_ALTERNATE_STACK 1
+ /* This must be in keeping with System.OS_Interface.Alternate_Stack_Size.  */
+ char __gnat_alternate_stack[16 * 1024]; /* 2 * SIGSTKSZ */
+ #endif
+@@ -603,7 +605,7 @@ __gnat_install_handler (void)
+      handled properly, avoiding a SEGV generation from stack usage by the
+      handler itself.  */
+ 
+-#if defined (i386) || defined (__x86_64__) || defined (__powerpc__)
++#ifdef HAVE_GNAT_ALTERNATE_STACK
+   stack_t stack;
+   stack.ss_sp = __gnat_alternate_stack;
+   stack.ss_size = sizeof (__gnat_alternate_stack);
+@@ -624,7 +626,7 @@ __gnat_install_handler (void)
+     sigaction (SIGILL,  &act, NULL);
+   if (__gnat_get_interrupt_state (SIGBUS) != 's')
+     sigaction (SIGBUS,  &act, NULL);
+-#if defined (i386) || defined (__x86_64__) || defined (__powerpc__)
++#ifdef HAVE_GNAT_ALTERNATE_STACK
+   act.sa_flags |= SA_ONSTACK;
+ #endif
+   if (__gnat_get_interrupt_state (SIGSEGV) != 's')
+--- gcc/ada/types.h
++++ gcc/ada/types.h
+@@ -79,8 +79,7 @@ typedef Char *Str_Ptr;
+ /* Types for the fat pointer used for strings and the template it
+    points to.  */
+ typedef struct {int Low_Bound, High_Bound; } String_Template;
+-typedef struct {const char *Array; String_Template *Bounds; }
+-	__attribute ((aligned (sizeof (char *) * 2))) Fat_Pointer;
++typedef struct {const char *Array; String_Template *Bounds; } Fat_Pointer;
+ 
+ /* Types for Node/Entity Kinds:  */
+ 
diff --git a/SOURCES/gcc48-aarch64-async-unw-tables.patch b/SOURCES/gcc48-aarch64-async-unw-tables.patch
new file mode 100644
index 0000000..feec149
--- /dev/null
+++ b/SOURCES/gcc48-aarch64-async-unw-tables.patch
@@ -0,0 +1,35 @@
+2014-04-07  Richard Henderson  <rth@redhat.com>
+
+	* common/config/aarch64/aarch64-common.c (TARGET_OPTION_INIT_STRUCT):
+	Define.
+	(aarch64_option_init_struct): New function.
+
+--- gcc/common/config/aarch64/aarch64-common.c
++++ gcc/common/config/aarch64/aarch64-common.c
+@@ -39,6 +39,9 @@
+ #undef	TARGET_OPTION_OPTIMIZATION_TABLE
+ #define TARGET_OPTION_OPTIMIZATION_TABLE aarch_option_optimization_table
+ 
++#undef TARGET_OPTION_INIT_STRUCT
++#define TARGET_OPTION_INIT_STRUCT aarch64_option_init_struct
++
+ /* Set default optimization options.  */
+ static const struct default_options aarch_option_optimization_table[] =
+   {
+@@ -47,6 +50,16 @@ static const struct default_options aarch_option_optimization_table[] =
+     { OPT_LEVELS_NONE, 0, NULL, 0 }
+   };
+ 
++/* Implement TARGET_OPTION_INIT_STRUCT.  */
++
++static void
++aarch64_option_init_struct (struct gcc_options *opts)
++{
++  /* By default, always emit DWARF-2 unwind info.  This allows debugging
++     without maintaining a stack frame back-chain.  */
++  opts->x_flag_asynchronous_unwind_tables = 1;
++}
++
+ /* Implement TARGET_HANDLE_OPTION.
+    This function handles the target specific options for CPU/target selection.
+ 
diff --git a/SOURCES/gcc48-aarch64-unwind-opt.patch b/SOURCES/gcc48-aarch64-unwind-opt.patch
new file mode 100644
index 0000000..074cd7e
--- /dev/null
+++ b/SOURCES/gcc48-aarch64-unwind-opt.patch
@@ -0,0 +1,342 @@
+2014-08-08  Richard Henderson  <rth@redhat.com>
+
+	* config/aarch64/aarch64.c (aarch64_save_or_restore_fprs): Add
+	cfi_ops argument, for restore put REG_CFA_RESTORE notes into
+	*cfi_ops rather than on individual insns.  Cleanup.
+	(aarch64_save_or_restore_callee_save_registers): Likewise.
+	(aarch64_expand_prologue): Adjust caller.
+	(aarch64_expand_epilogue): Likewise.  Cleanup.  Emit queued cfi_ops
+	on the stack restore insn.
+
+--- gcc/config/aarch64/aarch64.c	2014-07-15 02:27:16.000000000 -0700
++++ gcc/config/aarch64/aarch64.c	2014-08-21 12:52:44.190455860 -0700
+@@ -1603,24 +1603,23 @@ aarch64_register_saved_on_entry (int reg
+ 
+ static void
+ aarch64_save_or_restore_fprs (int start_offset, int increment,
+-			      bool restore, rtx base_rtx)
+-
++			      bool restore, rtx base_rtx, rtx *cfi_ops)
+ {
+   unsigned regno;
+   unsigned regno2;
+   rtx insn;
+   rtx (*gen_mem_ref)(enum machine_mode, rtx) = (frame_pointer_needed)? gen_frame_mem : gen_rtx_MEM;
+ 
+-
+   for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
+     {
+       if (aarch64_register_saved_on_entry (regno))
+ 	{
+-	  rtx mem;
++	  rtx mem, reg1;
+ 	  mem = gen_mem_ref (DFmode,
+ 			     plus_constant (Pmode,
+ 					    base_rtx,
+ 					    start_offset));
++	  reg1 = gen_rtx_REG (DFmode, regno);
+ 
+ 	  for (regno2 = regno + 1;
+ 	       regno2 <= V31_REGNUM
+@@ -1632,54 +1631,51 @@ aarch64_save_or_restore_fprs (int start_
+ 	  if (regno2 <= V31_REGNUM &&
+ 	      aarch64_register_saved_on_entry (regno2))
+ 	    {
+-	      rtx mem2;
++	      rtx mem2, reg2;
+ 	      /* Next highest register to be saved.  */
+ 	      mem2 = gen_mem_ref (DFmode,
+ 				  plus_constant
+ 				  (Pmode,
+ 				   base_rtx,
+ 				   start_offset + increment));
++	      reg2 = gen_rtx_REG (DFmode, regno2);
++
+ 	      if (restore == false)
+ 		{
+-		  insn = emit_insn
+-		    ( gen_store_pairdf (mem, gen_rtx_REG (DFmode, regno),
+-					mem2, gen_rtx_REG (DFmode, regno2)));
+-
++		  insn = emit_insn (gen_store_pairdf (mem, reg1, mem2, reg2));
++		  /* The first part of a frame-related parallel insn
++		     is always assumed to be relevant to the frame
++		     calculations; subsequent parts, are only
++		     frame-related if explicitly marked.  */
++		  RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
++		  RTX_FRAME_RELATED_P (insn) = 1;
+ 		}
+ 	      else
+ 		{
+-		  insn = emit_insn
+-		    ( gen_load_pairdf (gen_rtx_REG (DFmode, regno), mem,
+-				       gen_rtx_REG (DFmode, regno2), mem2));
+-
+-		  add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DFmode, regno));
+-		  add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DFmode, regno2));
++		  emit_insn (gen_load_pairdf (reg1, mem, reg2, mem2));
++		  *cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg1, *cfi_ops);
++		  *cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg2, *cfi_ops);
+ 		}
+ 
+-		  /* The first part of a frame-related parallel insn
+-		     is always assumed to be relevant to the frame
+-		     calculations; subsequent parts, are only
+-		     frame-related if explicitly marked.  */
+-	      RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0,
+-					    1)) = 1;
+ 	      regno = regno2;
+ 	      start_offset += increment * 2;
+ 	    }
+ 	  else
+ 	    {
+ 	      if (restore == false)
+-		insn = emit_move_insn (mem, gen_rtx_REG (DFmode, regno));
++		{
++		  insn = emit_move_insn (mem, reg1);
++		  RTX_FRAME_RELATED_P (insn) = 1;
++		}
+ 	      else
+ 		{
+-		  insn = emit_move_insn (gen_rtx_REG (DFmode, regno), mem);
+-		  add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DImode, regno));
++		  emit_move_insn (reg1, mem);
++		  *cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg1, *cfi_ops);
+ 		}
+ 	      start_offset += increment;
+ 	    }
+-	  RTX_FRAME_RELATED_P (insn) = 1;
+ 	}
+     }
+-
+ }
+ 
+ 
+@@ -1687,13 +1683,14 @@ aarch64_save_or_restore_fprs (int start_
+    restore's have to happen.  */
+ static void
+ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset,
+-					    bool restore)
++					       bool restore, rtx *cfi_ops)
+ {
+   rtx insn;
+   rtx base_rtx = stack_pointer_rtx;
+   HOST_WIDE_INT start_offset = offset;
+   HOST_WIDE_INT increment = UNITS_PER_WORD;
+-  rtx (*gen_mem_ref)(enum machine_mode, rtx) = (frame_pointer_needed)? gen_frame_mem : gen_rtx_MEM;
++  rtx (*gen_mem_ref)(enum machine_mode, rtx)
++    = (frame_pointer_needed)? gen_frame_mem : gen_rtx_MEM;
+   unsigned limit = (frame_pointer_needed)? R28_REGNUM: R30_REGNUM;
+   unsigned regno;
+   unsigned regno2;
+@@ -1702,11 +1699,13 @@ aarch64_save_or_restore_callee_save_regi
+     {
+       if (aarch64_register_saved_on_entry (regno))
+ 	{
+-	  rtx mem;
++	  rtx mem, reg1;
++
+ 	  mem = gen_mem_ref (Pmode,
+ 			     plus_constant (Pmode,
+ 					    base_rtx,
+ 					    start_offset));
++	  reg1 = gen_rtx_REG (DImode, regno);
+ 
+ 	  for (regno2 = regno + 1;
+ 	       regno2 <= limit
+@@ -1718,56 +1717,54 @@ aarch64_save_or_restore_callee_save_regi
+ 	  if (regno2 <= limit &&
+ 	      aarch64_register_saved_on_entry (regno2))
+ 	    {
+-	      rtx mem2;
++	      rtx mem2, reg2;
+ 	      /* Next highest register to be saved.  */
+ 	      mem2 = gen_mem_ref (Pmode,
+ 				  plus_constant
+ 				  (Pmode,
+ 				   base_rtx,
+ 				   start_offset + increment));
++	      reg2 = gen_rtx_REG (DImode, regno2);
++
+ 	      if (restore == false)
+ 		{
+-		  insn = emit_insn
+-		    ( gen_store_pairdi (mem, gen_rtx_REG (DImode, regno),
+-					mem2, gen_rtx_REG (DImode, regno2)));
+-
++		  insn = emit_insn (gen_store_pairdi (mem, reg1, mem2, reg2));
++		  /* The first part of a frame-related parallel insn
++		     is always assumed to be relevant to the frame
++		     calculations; subsequent parts, are only
++		     frame-related if explicitly marked.  */
++		  RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
++	  	  RTX_FRAME_RELATED_P (insn) = 1;
+ 		}
+ 	      else
+ 		{
+-		  insn = emit_insn
+-		    ( gen_load_pairdi (gen_rtx_REG (DImode, regno), mem,
+-				     gen_rtx_REG (DImode, regno2), mem2));
+-
+-		  add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DImode, regno));
+-		  add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DImode, regno2));
++		  emit_insn (gen_load_pairdi (reg1, mem, reg2, mem2));
++		  *cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg1, *cfi_ops);
++		  *cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg2, *cfi_ops);
+ 		}
+ 
+-		  /* The first part of a frame-related parallel insn
+-		     is always assumed to be relevant to the frame
+-		     calculations; subsequent parts, are only
+-		     frame-related if explicitly marked.  */
+-	      RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0,
+-					    1)) = 1;
+ 	      regno = regno2;
+ 	      start_offset += increment * 2;
+ 	    }
+ 	  else
+ 	    {
+ 	      if (restore == false)
+-		insn = emit_move_insn (mem, gen_rtx_REG (DImode, regno));
++		{
++		  insn = emit_move_insn (mem, reg1);
++	  	  RTX_FRAME_RELATED_P (insn) = 1;
++		}
+ 	      else
+ 		{
+-		  insn = emit_move_insn (gen_rtx_REG (DImode, regno), mem);
+-		  add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DImode, regno));
++		  emit_move_insn (reg1, mem);
++		  *cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg1, *cfi_ops);
+ 		}
+ 	      start_offset += increment;
+ 	    }
+-	  RTX_FRAME_RELATED_P (insn) = 1;
+ 	}
+     }
+ 
+-  aarch64_save_or_restore_fprs (start_offset, increment, restore, base_rtx);
+-
++  aarch64_save_or_restore_fprs (start_offset, increment, restore,
++				base_rtx, cfi_ops);
+ }
+ 
+ /* AArch64 stack frames generated by this compiler look like:
+@@ -1966,7 +1963,7 @@ aarch64_expand_prologue (void)
+ 	}
+ 
+       aarch64_save_or_restore_callee_save_registers
+-	(fp_offset + cfun->machine->frame.hardfp_offset, 0);
++	(fp_offset + cfun->machine->frame.hardfp_offset, 0, NULL);
+     }
+ 
+   /* when offset >= 512,
+@@ -1991,6 +1988,7 @@ aarch64_expand_epilogue (bool for_sibcal
+   HOST_WIDE_INT fp_offset;
+   rtx insn;
+   rtx cfa_reg;
++  rtx cfi_ops = NULL;
+ 
+   aarch64_layout_frame ();
+   original_frame_size = get_frame_size () + cfun->machine->saved_varargs_size;
+@@ -2035,15 +2033,17 @@ aarch64_expand_epilogue (bool for_sibcal
+       insn = emit_insn (gen_add3_insn (stack_pointer_rtx,
+ 				       hard_frame_pointer_rtx,
+ 				       GEN_INT (- fp_offset)));
++      /* CFA should be calculated from the value of SP from now on.  */
++      add_reg_note (insn, REG_CFA_ADJUST_CFA,
++		    gen_rtx_SET (VOIDmode, stack_pointer_rtx,
++				 plus_constant (Pmode, hard_frame_pointer_rtx,
++						-fp_offset)));
+       RTX_FRAME_RELATED_P (insn) = 1;
+-      /* As SP is set to (FP - fp_offset), according to the rules in
+-	 dwarf2cfi.c:dwarf2out_frame_debug_expr, CFA should be calculated
+-	 from the value of SP from now on.  */
+       cfa_reg = stack_pointer_rtx;
+     }
+ 
+   aarch64_save_or_restore_callee_save_registers
+-    (fp_offset + cfun->machine->frame.hardfp_offset, 1);
++    (fp_offset + cfun->machine->frame.hardfp_offset, 1, &cfi_ops);
+ 
+   /* Restore the frame pointer and lr if the frame pointer is needed.  */
+   if (offset > 0)
+@@ -2051,6 +2051,8 @@ aarch64_expand_epilogue (bool for_sibcal
+       if (frame_pointer_needed)
+ 	{
+ 	  rtx mem_fp, mem_lr;
++	  rtx reg_fp = hard_frame_pointer_rtx;
++	  rtx reg_lr = gen_rtx_REG (DImode, LR_REGNUM);
+ 
+ 	  if (fp_offset)
+ 	    {
+@@ -2063,52 +2065,36 @@ aarch64_expand_epilogue (bool for_sibcal
+ 						     stack_pointer_rtx,
+ 						     fp_offset
+ 						     + UNITS_PER_WORD));
+-	      insn = emit_insn (gen_load_pairdi (hard_frame_pointer_rtx,
+-						 mem_fp,
+-						 gen_rtx_REG (DImode,
+-							      LR_REGNUM),
+-						 mem_lr));
++	      emit_insn (gen_load_pairdi (reg_fp, mem_fp, reg_lr, mem_lr));
++
++	      insn = emit_insn (gen_add2_insn (stack_pointer_rtx,
++					       GEN_INT (offset)));
+ 	    }
+ 	  else
+ 	    {
+ 	      insn = emit_insn (gen_loadwb_pairdi_di
+-				(stack_pointer_rtx,
+-				 stack_pointer_rtx,
+-				 hard_frame_pointer_rtx,
+-				 gen_rtx_REG (DImode, LR_REGNUM),
+-				 GEN_INT (offset),
++				(stack_pointer_rtx, stack_pointer_rtx,
++				 reg_fp, reg_lr, GEN_INT (offset),
+ 				 GEN_INT (GET_MODE_SIZE (DImode) + offset)));
+-	      RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 2)) = 1;
+-	      add_reg_note (insn, REG_CFA_ADJUST_CFA,
+-			    (gen_rtx_SET (Pmode, stack_pointer_rtx,
+-					  plus_constant (Pmode, cfa_reg,
+-							 offset))));
+-	    }
+-
+-	  /* The first part of a frame-related parallel insn
+-	     is always assumed to be relevant to the frame
+-	     calculations; subsequent parts, are only
+-	     frame-related if explicitly marked.  */
+-	  RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
+-	  RTX_FRAME_RELATED_P (insn) = 1;
+-	  add_reg_note (insn, REG_CFA_RESTORE, hard_frame_pointer_rtx);
+-	  add_reg_note (insn, REG_CFA_RESTORE,
+-			gen_rtx_REG (DImode, LR_REGNUM));
+-
+-	  if (fp_offset)
+-	    {
+-	      insn = emit_insn (gen_add2_insn (stack_pointer_rtx,
+-					       GEN_INT (offset)));
+-	      RTX_FRAME_RELATED_P (insn) = 1;
+ 	    }
++	  cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg_fp, cfi_ops);
++	  cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg_lr, cfi_ops);
+ 	}
+       else
+ 	{
+ 	  insn = emit_insn (gen_add2_insn (stack_pointer_rtx,
+ 					   GEN_INT (offset)));
+-	  RTX_FRAME_RELATED_P (insn) = 1;
+ 	}
++      cfi_ops = alloc_reg_note (REG_CFA_ADJUST_CFA,
++				gen_rtx_SET (VOIDmode, stack_pointer_rtx,
++					     plus_constant (Pmode, cfa_reg,
++							    offset)),
++				cfi_ops);
++      REG_NOTES (insn) = cfi_ops;
++      RTX_FRAME_RELATED_P (insn) = 1;
+     }
++  else
++    gcc_assert (cfi_ops == NULL);
+ 
+   /* Stack adjustment for exception handler.  */
+   if (crtl->calls_eh_return)
diff --git a/SOURCES/gcc48-libstdc++-docs.patch b/SOURCES/gcc48-libstdc++-docs.patch
index 6f87ea5..382666b 100644
--- a/SOURCES/gcc48-libstdc++-docs.patch
+++ b/SOURCES/gcc48-libstdc++-docs.patch
@@ -4,7 +4,7 @@
        <a class="link" href="http://www.fsf.org/" target="_top">FSF
        </a>
      </p><p>
-+      Release 4.8.1
++      Release 4.8.3
 +    </p><p>
        Permission is granted to copy, distribute and/or modify this
        document under the terms of the GNU Free Documentation
@@ -18,7 +18,7 @@
 -  The API documentation, rendered into HTML, can be viewed online:
 +  The API documentation, rendered into HTML, can be viewed here:
  </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>
-+      <a class="link" href="api/index.html" target="_top">for the 4.8.1 release, local
++      <a class="link" href="api/index.html" target="_top">for the 4.8.3 release, local
 +      </a>
 +    </p></li><li class="listitem"><p>
        <a class="link" href="http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/index.html" target="_top">for the 3.4 release
diff --git a/SOURCES/gcc48-ppc32-retaddr.patch b/SOURCES/gcc48-ppc32-retaddr.patch
index 78120cc..e906dad 100644
--- a/SOURCES/gcc48-ppc32-retaddr.patch
+++ b/SOURCES/gcc48-ppc32-retaddr.patch
@@ -8,9 +8,9 @@
 
 --- gcc/config/rs6000/rs6000.c.jj	2005-11-26 14:38:01.000000000 +0100
 +++ gcc/config/rs6000/rs6000.c	2005-11-28 20:32:18.000000000 +0100
-@@ -18325,18 +18325,22 @@ rs6000_return_addr (int count, rtx frame
-      don't try to be too clever here.  */
-   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
+@@ -21423,18 +21423,22 @@ rs6000_return_addr (int count, rtx frame
+   if (count != 0
+       || ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) && flag_pic))
      {
 +      rtx x;
        cfun->machine->ra_needs_full_frame = 1;
diff --git a/SOURCES/gcc48-pr57896.patch b/SOURCES/gcc48-pr57896.patch
deleted file mode 100644
index 7b27bf1..0000000
--- a/SOURCES/gcc48-pr57896.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-2014-02-21  Jakub Jelinek  <jakub@redhat.com>
-
-	* config/i386/i386.c (ix86_expand_vec_perm): Use V8SImode
-	mode for mask of V8SFmode permutation.
-
-2014-02-20  Jakub Jelinek  <jakub@redhat.com>
-
-	PR target/57896
-	* config/i386/i386.c (expand_vec_perm_interleave2): Don't call
-	gen_reg_rtx if d->testing_p.
-	(expand_vec_perm_pshufb2, expand_vec_perm_even_odd_1,
-	expand_vec_perm_broadcast_1): Return early if d->testing_p and
-	we will certainly return true.
-
---- gcc/config/i386/i386.c	(revision 207969)
-+++ gcc/config/i386/i386.c	(revision 207982)
-@@ -20460,7 +20460,7 @@ ix86_expand_vec_perm (rtx operands[])
- 	  return;
- 
- 	case V8SFmode:
--	  mask = gen_lowpart (V8SFmode, mask);
-+	  mask = gen_lowpart (V8SImode, mask);
- 	  if (one_operand_shuffle)
- 	    emit_insn (gen_avx2_permvarv8sf (target, op0, mask));
- 	  else
-@@ -39405,7 +39405,9 @@ expand_vec_perm_interleave2 (struct expa
-       else
- 	dfinal.perm[i] = e;
-     }
--  dfinal.op0 = gen_reg_rtx (dfinal.vmode);
-+
-+  if (!d->testing_p)
-+    dfinal.op0 = gen_reg_rtx (dfinal.vmode);
-   dfinal.op1 = dfinal.op0;
-   dfinal.one_operand_p = true;
-   dremap.target = dfinal.op0;
-@@ -39840,6 +39842,9 @@ expand_vec_perm_pshufb2 (struct expand_v
-     return false;
-   gcc_assert (!d->one_operand_p);
- 
-+  if (d->testing_p)
-+    return true;
-+
-   nelt = d->nelt;
-   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
- 
-@@ -40039,6 +40044,8 @@ expand_vec_perm_even_odd_1 (struct expan
-   switch (d->vmode)
-     {
-     case V4DFmode:
-+      if (d->testing_p)
-+	break;
-       t1 = gen_reg_rtx (V4DFmode);
-       t2 = gen_reg_rtx (V4DFmode);
- 
-@@ -40058,6 +40065,8 @@ expand_vec_perm_even_odd_1 (struct expan
-       {
- 	int mask = odd ? 0xdd : 0x88;
- 
-+	if (d->testing_p)
-+	  break;
- 	t1 = gen_reg_rtx (V8SFmode);
- 	t2 = gen_reg_rtx (V8SFmode);
- 	t3 = gen_reg_rtx (V8SFmode);
-@@ -40099,6 +40108,8 @@ expand_vec_perm_even_odd_1 (struct expan
- 	return expand_vec_perm_pshufb2 (d);
-       else
- 	{
-+	  if (d->testing_p)
-+	    break;
- 	  /* We need 2*log2(N)-1 operations to achieve odd/even
- 	     with interleave. */
- 	  t1 = gen_reg_rtx (V8HImode);
-@@ -40120,6 +40131,8 @@ expand_vec_perm_even_odd_1 (struct expan
- 	return expand_vec_perm_pshufb2 (d);
-       else
- 	{
-+	  if (d->testing_p)
-+	    break;
- 	  t1 = gen_reg_rtx (V16QImode);
- 	  t2 = gen_reg_rtx (V16QImode);
- 	  t3 = gen_reg_rtx (V16QImode);
-@@ -40152,6 +40165,9 @@ expand_vec_perm_even_odd_1 (struct expan
- 	  return expand_vec_perm_even_odd_1 (&d_copy, odd);
- 	}
- 
-+      if (d->testing_p)
-+	break;
-+
-       t1 = gen_reg_rtx (V4DImode);
-       t2 = gen_reg_rtx (V4DImode);
- 
-@@ -40178,6 +40194,9 @@ expand_vec_perm_even_odd_1 (struct expan
- 	  return expand_vec_perm_even_odd_1 (&d_copy, odd);
- 	}
- 
-+      if (d->testing_p)
-+	break;
-+
-       t1 = gen_reg_rtx (V8SImode);
-       t2 = gen_reg_rtx (V8SImode);
- 
-@@ -40270,6 +40289,8 @@ expand_vec_perm_broadcast_1 (struct expa
-     case V16QImode:
-       /* These can be implemented via interleave.  We save one insn by
- 	 stopping once we have promoted to V4SImode and then use pshufd.  */
-+      if (d->testing_p)
-+	return true;
-       do
- 	{
- 	  rtx dest;
diff --git a/SOURCES/gcc48-pr60046.patch b/SOURCES/gcc48-pr60046.patch
deleted file mode 100644
index fde6da9..0000000
--- a/SOURCES/gcc48-pr60046.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-2014-02-19  Jason Merrill  <jason@redhat.com>
-
-	PR c++/60046
-	* pt.c (maybe_instantiate_noexcept): Don't instantiate exception
-	spec from template context.
-
---- gcc/cp/pt.c	(revision 207920)
-+++ gcc/cp/pt.c	(revision 207921)
-@@ -18567,6 +18567,10 @@ maybe_instantiate_noexcept (tree fn)
- {
-   tree fntype, spec, noex, clone;
- 
-+  /* Don't instantiate a noexcept-specification from template context.  */
-+  if (processing_template_decl)
-+    return;
-+
-   if (DECL_CLONED_FUNCTION_P (fn))
-     fn = DECL_CLONED_FUNCTION (fn);
-   fntype = TREE_TYPE (fn);
---- gcc/testsuite/g++.dg/cpp0x/noexcept22.C	(revision 0)
-+++ gcc/testsuite/g++.dg/cpp0x/noexcept22.C	(revision 207921)
-@@ -0,0 +1,21 @@
-+// PR c++/60046
-+// { dg-require-effective-target c++11 }
-+
-+constexpr bool foo () { return noexcept (true); }
-+template <typename T>
-+struct V
-+{
-+  void bar (V &) noexcept (foo ()) {}
-+};
-+template <typename T>
-+struct W : public V <int>
-+{
-+  void bar (W &x) { V <int>::bar (x); }
-+};
-+
-+int
-+main ()
-+{
-+  W <int> a, b;
-+  a.bar (b);
-+}
diff --git a/SOURCES/gcc48-pr60137.patch b/SOURCES/gcc48-pr60137.patch
deleted file mode 100644
index 74cd998..0000000
--- a/SOURCES/gcc48-pr60137.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-2014-02-11  Michael Meissner  <meissner@linux.vnet.ibm.com>
-
-	PR target/60137
-	* config/rs6000/rs6000.md (128-bit GPR splitter): Add a splitter
-	for VSX/Altivec vectors that land in GPR registers.
-
-	* gcc.target/powerpc/pr60137.c: New file.
-
---- gcc/config/rs6000/rs6000.md	(revision 207698)
-+++ gcc/config/rs6000/rs6000.md	(revision 207699)
-@@ -9963,6 +9963,15 @@ (define_insn_and_split "reload_vsx_from_
-   [(set_attr "length" "12")
-    (set_attr "type" "three")])
- 
-+(define_split
-+  [(set (match_operand:FMOVE128_GPR 0 "nonimmediate_operand" "")
-+	(match_operand:FMOVE128_GPR 1 "input_operand" ""))]
-+  "reload_completed
-+   && (int_reg_operand (operands[0], <MODE>mode)
-+       || int_reg_operand (operands[1], <MODE>mode))"
-+  [(pc)]
-+{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
-+
- ;; Move SFmode to a VSX from a GPR register.  Because scalar floating point
- ;; type is stored internally as double precision in the VSX registers, we have
- ;; to convert it from the vector format.
---- gcc/testsuite/gcc.target/powerpc/pr60137.c	(revision 0)
-+++ gcc/testsuite/gcc.target/powerpc/pr60137.c	(revision 207699)
-@@ -0,0 +1,17 @@
-+/* { dg-do compile { target { powerpc*-*-* } } } */
-+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
-+/* { dg-require-effective-target powerpc_p8vector_ok } */
-+/* { dg-options "-mcpu=power8 -O3 -mno-vsx" } */
-+
-+/* target/60137, compiler got a 'could not split insn error'.  */
-+
-+extern int target_flags;
-+extern char fixed_regs[53];
-+extern char call_used_regs[53];
-+
-+void init_reg_sets_1(void)
-+{
-+  int i;
-+  for (i = 0; i < 53; i++)
-+    fixed_regs[i] = call_used_regs[i] = (call_used_regs[i] &((target_flags & 0x02000000) ? 2 : 1)) != 0;
-+}
diff --git a/SOURCES/gcc48-pr60233.patch b/SOURCES/gcc48-pr60233.patch
deleted file mode 100644
index 5402ac0..0000000
--- a/SOURCES/gcc48-pr60233.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-2014-02-18  Jakub Jelinek  <jakub@redhat.com>
-	    Uros Bizjak  <ubizjak@gmail.com>
-
-	PR driver/60233
-	* config/i386/driver-i386.c (host_detect_local_cpu): If
-	YMM state is not saved by the OS, also clear has_f16c.  Move
-	CPUID 0x80000001 handling before YMM state saving checking.
-
---- gcc/config/i386/driver-i386.c	(revision 207833)
-+++ gcc/config/i386/driver-i386.c	(revision 207834)
-@@ -488,6 +488,28 @@ const char *host_detect_local_cpu (int a
-       has_xsaveopt = eax & bit_XSAVEOPT;
-     }
- 
-+  /* Check cpuid level of extended features.  */
-+  __cpuid (0x80000000, ext_level, ebx, ecx, edx);
-+
-+  if (ext_level > 0x80000000)
-+    {
-+      __cpuid (0x80000001, eax, ebx, ecx, edx);
-+
-+      has_lahf_lm = ecx & bit_LAHF_LM;
-+      has_sse4a = ecx & bit_SSE4a;
-+      has_abm = ecx & bit_ABM;
-+      has_lwp = ecx & bit_LWP;
-+      has_fma4 = ecx & bit_FMA4;
-+      has_xop = ecx & bit_XOP;
-+      has_tbm = ecx & bit_TBM;
-+      has_lzcnt = ecx & bit_LZCNT;
-+      has_prfchw = ecx & bit_PRFCHW;
-+
-+      has_longmode = edx & bit_LM;
-+      has_3dnowp = edx & bit_3DNOWP;
-+      has_3dnow = edx & bit_3DNOW;
-+    }
-+
-   /* Get XCR_XFEATURE_ENABLED_MASK register with xgetbv.  */
- #define XCR_XFEATURE_ENABLED_MASK	0x0
- #define XSTATE_FP			0x1
-@@ -506,33 +528,12 @@ const char *host_detect_local_cpu (int a
-       has_avx2 = 0;
-       has_fma = 0;
-       has_fma4 = 0;
-+      has_f16c = 0;
-       has_xop = 0;
-       has_xsave = 0;
-       has_xsaveopt = 0;
-     }
- 
--  /* Check cpuid level of extended features.  */
--  __cpuid (0x80000000, ext_level, ebx, ecx, edx);
--
--  if (ext_level > 0x80000000)
--    {
--      __cpuid (0x80000001, eax, ebx, ecx, edx);
--
--      has_lahf_lm = ecx & bit_LAHF_LM;
--      has_sse4a = ecx & bit_SSE4a;
--      has_abm = ecx & bit_ABM;
--      has_lwp = ecx & bit_LWP;
--      has_fma4 = ecx & bit_FMA4;
--      has_xop = ecx & bit_XOP;
--      has_tbm = ecx & bit_TBM;
--      has_lzcnt = ecx & bit_LZCNT;
--      has_prfchw = ecx & bit_PRFCHW;
--
--      has_longmode = edx & bit_LM;
--      has_3dnowp = edx & bit_3DNOWP;
--      has_3dnow = edx & bit_3DNOW;
--    }
--
-   if (!arch)
-     {
-       if (vendor == signature_AMD_ebx
diff --git a/SOURCES/gcc48-pr60272.patch b/SOURCES/gcc48-pr60272.patch
deleted file mode 100644
index 2360a91..0000000
--- a/SOURCES/gcc48-pr60272.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-2014-02-20  Richard Henderson  <rth@redhat.com>
-
-	PR c++/60272
-	* builtins.c (expand_builtin_atomic_compare_exchange): Conditionalize
-	on failure the store back into EXPECT.  Always make a new pseudo for
-	OLDVAL.
-
-	* cas_n.c (libat_compare_exchange): Conditionalize on failure
-	the store back to EPTR.
-
---- gcc/builtins.c	(revision 207972)
-+++ gcc/builtins.c	(revision 207973)
-@@ -5350,7 +5350,7 @@ static rtx
- expand_builtin_atomic_compare_exchange (enum machine_mode mode, tree exp, 
- 					rtx target)
- {
--  rtx expect, desired, mem, oldval;
-+  rtx expect, desired, mem, oldval, label;
-   enum memmodel success, failure;
-   tree weak;
-   bool is_weak;
-@@ -5388,14 +5388,26 @@ expand_builtin_atomic_compare_exchange (
-   if (host_integerp (weak, 0) && tree_low_cst (weak, 0) != 0)
-     is_weak = true;
- 
--  oldval = expect;
--  if (!expand_atomic_compare_and_swap ((target == const0_rtx ? NULL : &target),
--				       &oldval, mem, oldval, desired,
-+  if (target == const0_rtx)
-+    target = NULL;
-+
-+  /* Lest the rtl backend create a race condition with an imporoper store
-+     to memory, always create a new pseudo for OLDVAL.  */
-+  oldval = NULL;
-+
-+  if (!expand_atomic_compare_and_swap (&target, &oldval, mem, expect, desired,
- 				       is_weak, success, failure))
-     return NULL_RTX;
- 
--  if (oldval != expect)
--    emit_move_insn (expect, oldval);
-+  /* Conditionally store back to EXPECT, lest we create a race condition
-+     with an improper store to memory.  */
-+  /* ??? With a rearrangement of atomics at the gimple level, we can handle
-+     the normal case where EXPECT is totally private, i.e. a register.  At
-+     which point the store can be unconditional.  */
-+  label = gen_label_rtx ();
-+  emit_cmp_and_jump_insns (target, const0_rtx, NE, NULL, VOIDmode, 1, label);
-+  emit_move_insn (expect, oldval);
-+  emit_label (label);
- 
-   return target;
- }
---- libatomic/cas_n.c	(revision 207972)
-+++ libatomic/cas_n.c	(revision 207973)
-@@ -51,10 +51,9 @@ SIZE(libat_compare_exchange) (UTYPE *mpt
- #if !DONE && N <= WORDSIZE && defined(atomic_compare_exchange_w)
- bool
- SIZE(libat_compare_exchange) (UTYPE *mptr, UTYPE *eptr, UTYPE newval,
--			      int smodel, int fmodel UNUSED)
-+			      int smodel, int fmodel)
- {
-   UWORD mask, shift, weval, woldval, wnewval, t, *wptr;
--  bool ret = false;
- 
-   pre_barrier (smodel);
- 
-@@ -82,12 +81,13 @@ SIZE(libat_compare_exchange) (UTYPE *mpt
-     }
-   while (!atomic_compare_exchange_w (wptr, &woldval, t, true,
- 				     __ATOMIC_RELAXED, __ATOMIC_RELAXED));
--  ret = true;
-+  post_barrier (smodel);
-+  return true;
-+
-  failure:
-   *eptr = woldval >> shift;
--
--  post_barrier (smodel);
--  return ret;
-+  post_barrier (fmodel);
-+  return false;
- }
- 
- #define DONE 1
-@@ -102,18 +102,17 @@ SIZE(libat_compare_exchange) (UTYPE *mpt
- {
-   UTYPE oldval;
-   UWORD magic;
--  bool ret = false;
-+  bool ret;
- 
-   pre_seq_barrier (smodel);
-   magic = protect_start (mptr);
- 
-   oldval = *mptr;
--  if (oldval == *eptr)
--    {
--      *mptr = newval;
--      ret = true;
--    }
--  *eptr = oldval;
-+  ret = (oldval == *eptr);
-+  if (ret)
-+    *mptr = newval;
-+  else
-+    *eptr = oldval;
- 
-   protect_end (mptr, magic);
-   post_seq_barrier (smodel);
diff --git a/SOURCES/gcc48-pr60274.patch b/SOURCES/gcc48-pr60274.patch
deleted file mode 100644
index 63f277c..0000000
--- a/SOURCES/gcc48-pr60274.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-2014-02-20  Jason Merrill  <jason@redhat.com>
-
-	PR c++/60274
-	* g++.dg/template/ref7.C: New test.
-
---- gcc/testsuite/g++.dg/template/ref7.C	(revision 0)
-+++ gcc/testsuite/g++.dg/template/ref7.C	(revision 207978)
-@@ -0,0 +1,16 @@
-+// PR c++/60274
-+
-+typedef const char *const&  ProtocolIdType;
-+
-+template <ProtocolIdType protocolId>
-+struct C {
-+  typedef int ProtocolVersion;
-+  struct D {
-+    ProtocolVersion GetProtocolVersion();
-+  };
-+};
-+template <ProtocolIdType protocolId>
-+typename C<protocolId>::ProtocolVersion C<protocolId>::D::GetProtocolVersion()
-+{
-+    return 1;
-+}
diff --git a/SOURCES/gcc48-pr61801.patch b/SOURCES/gcc48-pr61801.patch
deleted file mode 100644
index b75696e..0000000
--- a/SOURCES/gcc48-pr61801.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-2014-07-17  Richard Biener  <rguenther@suse.de>
-
-	PR rtl-optimization/61801
-	* sched-deps.c (sched_analyze_2): For ASM_OPERANDS and
-	ASM_INPUT don't set reg_pending_barrier if it appears in a
-	debug-insn.
-
-2014-08-06  Jakub Jelinek  <jakub@redhat.com>
-
-	PR rtl-optimization/61801
-	* gcc.target/i386/pr61801.c: Rewritten.
-
-2014-07-28  Richard Biener  <rguenther@suse.de>
-
-	PR rtl-optimization/61801
-	* gcc.target/i386/pr61801.c: Fix testcase.
-
-2014-07-28  Richard Biener  <rguenther@suse.de>
-
-	PR rtl-optimization/61801
-	* gcc.target/i386/pr61801.c: New testcase.
-
---- gcc/sched-deps.c	(revision 212737)
-+++ gcc/sched-deps.c	(revision 212738)
-@@ -2750,7 +2750,8 @@ sched_analyze_2 (struct deps_desc *deps,
- 	   Consider for instance a volatile asm that changes the fpu rounding
- 	   mode.  An insn should not be moved across this even if it only uses
- 	   pseudo-regs because it might give an incorrectly rounded result.  */
--	if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
-+	if ((code != ASM_OPERANDS || MEM_VOLATILE_P (x))
-+	    && !DEBUG_INSN_P (insn))
- 	  reg_pending_barrier = TRUE_BARRIER;
- 
- 	/* For all ASM_OPERANDS, we must traverse the vector of input operands.
---- gcc/testsuite/gcc.target/i386/pr61801.c	(revision 0)
-+++ gcc/testsuite/gcc.target/i386/pr61801.c	(revision 213654)
-@@ -0,0 +1,21 @@
-+/* PR rtl-optimization/61801 */
-+/* { dg-do compile } */
-+/* { dg-options "-Os -fcompare-debug" } */
-+
-+int a, c;
-+int bar (void);
-+void baz (void);
-+
-+void
-+foo (void)
-+{
-+  int d;
-+  if (bar ())
-+    {
-+      int e;
-+      baz ();
-+      asm volatile ("" : "=a" (e) : "0" (a), "i" (0));
-+      d = e;
-+    }
-+  c = d;
-+}
diff --git a/SOURCES/gcc48-pr63284.patch b/SOURCES/gcc48-pr63284.patch
new file mode 100644
index 0000000..592e000
--- /dev/null
+++ b/SOURCES/gcc48-pr63284.patch
@@ -0,0 +1,78 @@
+2014-09-17  Jakub Jelinek  <jakub@redhat.com>
+
+	PR debug/63284
+	* tree-cfgcleanup.c (fixup_noreturn_call): Don't split block
+	if there are only debug stmts after the noreturn call, instead
+	remove the debug stmts.
+
+	* gcc.dg/pr63284.c: New test.
+
+--- gcc/tree-cfgcleanup.c	(revision 215332)
++++ gcc/tree-cfgcleanup.c	(revision 215333)
+@@ -498,7 +498,20 @@ fixup_noreturn_call (gimple stmt)
+ 
+   /* First split basic block if stmt is not last.  */
+   if (stmt != gsi_stmt (gsi_last_bb (bb)))
+-    split_block (bb, stmt);
++    {
++      if (stmt == gsi_stmt (gsi_last_nondebug_bb (bb)))
++	{
++	  /* Don't split if there are only debug stmts
++	     after stmt, that can result in -fcompare-debug
++	     failures.  Remove the debug stmts instead,
++	     they should be all unreachable anyway.  */
++	  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
++	  for (gsi_next (&gsi); !gsi_end_p (gsi); )
++	    gsi_remove (&gsi, true);
++	}
++      else
++	split_block (bb, stmt);
++    }
+ 
+   changed |= remove_fallthru_edge (bb->succs);
+ 
+--- gcc/testsuite/gcc.dg/pr63284.c	(revision 0)
++++ gcc/testsuite/gcc.dg/pr63284.c	(revision 215333)
+@@ -0,0 +1,42 @@
++/* PR debug/63284 */
++/* { dg-do compile } */
++/* { dg-options "-O2 -fcompare-debug" } */
++
++int a[10], *b, *d, c, f;
++int fn2 (void);
++void fn3 (void);
++void fn4 (int);
++
++static int
++fn1 (int x)
++{
++  int e = a[0];
++  if (e)
++    return 1;
++  if (b)
++    switch (x)
++      {
++      case 1:
++        if (d)
++          e = fn2 ();
++        else
++          fn3 ();
++        break;
++      case 0:
++        if (d)
++          {
++            fn3 ();
++            if (c)
++              fn4 (1);
++          }
++        else
++          fn4 (0);
++      }
++  return e;
++}
++
++void
++fn6 (void)
++{
++  f = fn1 (0);
++}
diff --git a/SOURCES/gcc48-pr63341.patch b/SOURCES/gcc48-pr63341.patch
new file mode 100644
index 0000000..0d1d249
--- /dev/null
+++ b/SOURCES/gcc48-pr63341.patch
@@ -0,0 +1,224 @@
+2014-09-25  Jakub Jelinek  <jakub@redhat.com>
+
+	PR tree-optimization/63341
+	* tree-vectorizer.h (vect_create_data_ref_ptr,
+	vect_create_addr_base_for_vector_ref): Add another tree argument
+	defaulting to NULL_TREE.
+	* tree-vect-data-refs.c (vect_create_data_ref_ptr): Add byte_offset
+	argument, pass it down to vect_create_addr_base_for_vector_ref.
+	(vect_create_addr_base_for_vector_ref): Add byte_offset argument,
+	add that to base_offset too if non-NULL.
+	* tree-vect-stmts.c (vectorizable_load): Add byte_offset variable,
+	for dr_explicit_realign_optimized set it to vector byte size
+	- 1 instead of setting offset, pass byte_offset down to
+	vect_create_data_ref_ptr.
+
+	* gcc.dg/vect/pr63341-1.c: New test.
+	* gcc.dg/vect/pr63341-2.c: New test.
+
+--- gcc/tree-vectorizer.h	(revision 215586)
++++ gcc/tree-vectorizer.h	(revision 215587)
+@@ -931,7 +931,8 @@ extern tree vect_check_gather (gimple, l
+ extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *);
+ extern tree vect_create_data_ref_ptr (gimple, tree, struct loop *, tree,
+ 				      tree *, gimple_stmt_iterator *,
+-				      gimple *, bool, bool *);
++				      gimple *, bool, bool *,
++				      tree = NULL_TREE);
+ extern tree bump_vector_ptr (tree, gimple, gimple_stmt_iterator *, gimple, tree);
+ extern tree vect_create_destination_var (tree, tree);
+ extern bool vect_grouped_store_supported (tree, unsigned HOST_WIDE_INT);
+@@ -949,7 +950,8 @@ extern void vect_record_grouped_load_vec
+ extern int vect_get_place_in_interleaving_chain (gimple, gimple);
+ extern tree vect_get_new_vect_var (tree, enum vect_var_kind, const char *);
+ extern tree vect_create_addr_base_for_vector_ref (gimple, gimple_seq *,
+-                                                  tree, struct loop *);
++						  tree, struct loop *,
++						  tree = NULL_TREE);
+ 
+ /* In tree-vect-loop.c.  */
+ /* FORNOW: Used in tree-parloops.c.  */
+--- gcc/tree-vect-data-refs.c	(revision 215586)
++++ gcc/tree-vect-data-refs.c	(revision 215587)
+@@ -3553,6 +3553,9 @@ vect_get_new_vect_var (tree type, enum v
+ 	    is as follows:
+ 	    if LOOP=i_loop:	&in		(relative to i_loop)
+ 	    if LOOP=j_loop: 	&in+i*2B	(relative to j_loop)
++   BYTE_OFFSET: Optional, defaulted to NULL.  If supplied, it is added to the
++	    initial address.  Unlike OFFSET, which is number of elements to
++	    be added, BYTE_OFFSET is measured in bytes.
+ 
+    Output:
+    1. Return an SSA_NAME whose value is the address of the memory location of
+@@ -3566,7 +3569,8 @@ tree
+ vect_create_addr_base_for_vector_ref (gimple stmt,
+ 				      gimple_seq *new_stmt_list,
+ 				      tree offset,
+-				      struct loop *loop)
++				      struct loop *loop,
++				      tree byte_offset)
+ {
+   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
+@@ -3628,6 +3632,16 @@ vect_create_addr_base_for_vector_ref (gi
+       base_offset = force_gimple_operand (base_offset, &seq, false, tmp);
+       gimple_seq_add_seq (new_stmt_list, seq);
+     }
++  if (byte_offset)
++    {
++      tree tmp = create_tmp_var (sizetype, "offset");
++
++      byte_offset = fold_convert (sizetype, byte_offset);
++      base_offset = fold_build2 (PLUS_EXPR, sizetype,
++				 base_offset, byte_offset);
++      base_offset = force_gimple_operand (base_offset, &seq, false, tmp);
++      gimple_seq_add_seq (new_stmt_list, seq);
++    }
+ 
+   /* base + base_offset */
+   if (loop_vinfo)
+@@ -3692,6 +3706,10 @@ vect_create_addr_base_for_vector_ref (gi
+    5. BSI: location where the new stmts are to be placed if there is no loop
+    6. ONLY_INIT: indicate if ap is to be updated in the loop, or remain
+         pointing to the initial address.
++   7. BYTE_OFFSET (optional, defaults to NULL): a byte offset to be added
++	to the initial address accessed by the data-ref in STMT.  This is
++	similar to OFFSET, but OFFSET is counted in elements, while BYTE_OFFSET
++	in bytes.
+ 
+    Output:
+    1. Declare a new ptr to vector_type, and have it point to the base of the
+@@ -3705,6 +3723,8 @@ vect_create_addr_base_for_vector_ref (gi
+          initial_address = &a[init];
+       if OFFSET is supplied:
+          initial_address = &a[init + OFFSET];
++      if BYTE_OFFSET is supplied:
++	 initial_address = &a[init] + BYTE_OFFSET;
+ 
+       Return the initial_address in INITIAL_ADDRESS.
+ 
+@@ -3722,7 +3742,7 @@ tree
+ vect_create_data_ref_ptr (gimple stmt, tree aggr_type, struct loop *at_loop,
+ 			  tree offset, tree *initial_address,
+ 			  gimple_stmt_iterator *gsi, gimple *ptr_incr,
+-			  bool only_init, bool *inv_p)
++			  bool only_init, bool *inv_p, tree byte_offset)
+ {
+   const char *base_name;
+   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+@@ -3881,10 +3901,10 @@ vect_create_data_ref_ptr (gimple stmt, t
+   /* (2) Calculate the initial address of the aggregate-pointer, and set
+      the aggregate-pointer to point to it before the loop.  */
+ 
+-  /* Create: (&(base[init_val+offset]) in the loop preheader.  */
++  /* Create: (&(base[init_val+offset]+byte_offset) in the loop preheader.  */
+ 
+   new_temp = vect_create_addr_base_for_vector_ref (stmt, &new_stmt_list,
+-                                                   offset, loop);
++						   offset, loop, byte_offset);
+   if (new_stmt_list)
+     {
+       if (pe)
+--- gcc/tree-vect-stmts.c	(revision 215586)
++++ gcc/tree-vect-stmts.c	(revision 215587)
+@@ -4319,6 +4319,7 @@ vectorizable_load (gimple stmt, gimple_s
+   int i, j, group_size;
+   tree msq = NULL_TREE, lsq;
+   tree offset = NULL_TREE;
++  tree byte_offset = NULL_TREE;
+   tree realignment_token = NULL_TREE;
+   gimple phi = NULL;
+   vec<tree> dr_chain = vNULL;
+@@ -4934,7 +4935,8 @@ vectorizable_load (gimple stmt, gimple_s
+       if (alignment_support_scheme == dr_explicit_realign_optimized)
+ 	{
+ 	  phi = SSA_NAME_DEF_STMT (msq);
+-	  offset = size_int (TYPE_VECTOR_SUBPARTS (vectype) - 1);
++	  byte_offset = size_binop (MINUS_EXPR, TYPE_SIZE_UNIT (vectype),
++				    size_one_node);
+ 	}
+     }
+   else
+@@ -4955,7 +4957,8 @@ vectorizable_load (gimple stmt, gimple_s
+       if (j == 0)
+         dataref_ptr = vect_create_data_ref_ptr (first_stmt, aggr_type, at_loop,
+ 						offset, &dummy, gsi,
+-						&ptr_incr, false, &inv_p);
++						&ptr_incr, false, &inv_p,
++						byte_offset);
+       else
+         dataref_ptr = bump_vector_ptr (dataref_ptr, ptr_incr, gsi, stmt,
+ 				       TYPE_SIZE_UNIT (aggr_type));
+--- gcc/testsuite/gcc.dg/vect/pr63341-1.c	(revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr63341-1.c	(revision 215587)
+@@ -0,0 +1,32 @@
++/* PR tree-optimization/63341 */
++/* { dg-do run } */
++
++#include "tree-vect.h"
++
++typedef union U { unsigned short s; unsigned char c; } __attribute__((packed)) U;
++struct S { char e __attribute__((aligned (64))); U s[32]; };
++struct S t = {0, {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8},
++		  {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16},
++		  {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24},
++		  {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32}}};
++unsigned short d[32] = { 1 };
++
++__attribute__((noinline, noclone)) void
++foo ()
++{
++  int i;
++  for (i = 0; i < 32; i++)
++    d[i] = t.s[i].s;
++  if (__builtin_memcmp (d, t.s, sizeof d))
++    abort ();
++}
++
++int
++main ()
++{
++  check_vect ();
++  foo ();
++  return 0;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+--- gcc/testsuite/gcc.dg/vect/pr63341-2.c	(revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr63341-2.c	(revision 215587)
+@@ -0,0 +1,35 @@
++/* PR tree-optimization/63341 */
++/* { dg-do run } */
++
++#include "tree-vect.h"
++
++typedef union U { unsigned short s; unsigned char c; } __attribute__((packed)) U;
++struct S { char e __attribute__((aligned (64))); U s[32]; };
++struct S t = {0, {{0x5010}, {0x5111}, {0x5212}, {0x5313}, {0x5414}, {0x5515}, {0x5616}, {0x5717},
++		  {0x5818}, {0x5919}, {0x5a1a}, {0x5b1b}, {0x5c1c}, {0x5d1d}, {0x5e1e}, {0x5f1f},
++		  {0x6020}, {0x6121}, {0x6222}, {0x6323}, {0x6424}, {0x6525}, {0x6626}, {0x6727},
++		  {0x6828}, {0x6929}, {0x6a2a}, {0x6b2b}, {0x6c2c}, {0x6d2d}, {0x6e2e}, {0x6f2f}}};
++unsigned short d[32] = { 1 };
++
++__attribute__((noinline, noclone)) void
++foo ()
++{
++  int i;
++  for (i = 0; i < 32; i++)
++    d[i] = t.s[i].s + 4;
++  for (i = 0; i < 32; i++)
++    if (d[i] != t.s[i].s + 4)
++      abort ();
++    else
++      asm volatile ("" : : : "memory");
++}
++
++int
++main ()
++{
++  check_vect ();
++  foo ();
++  return 0;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/SOURCES/gcc48-rh1121077.patch b/SOURCES/gcc48-rh1121077.patch
deleted file mode 100644
index a610217..0000000
--- a/SOURCES/gcc48-rh1121077.patch
+++ /dev/null
@@ -1,5990 +0,0 @@
-2014-08-04  Jakub Jelinek  <jakub@redhat.com>
-
-	* task.c (GOMP_taskgroup_end): If taskgroup->num_children
-	is not zero, but taskgroup->children is NULL and there are
-	any task->children, schedule those instead of waiting.
-
-2014-08-01  Jakub Jelinek  <jakub@redhat.com>
-
-	* libgomp.h (struct gomp_task_depend_entry): Add redundant_out field.
-	(struct gomp_taskwait): New type.
-	(struct gomp_task): Add taskwait and parent_depends_on, remove
-	in_taskwait and taskwait_sem fields.
-	(gomp_finish_task): Don't destroy taskwait_sem.
-	* task.c (gomp_init_task): Don't init in_taskwait, instead init
-	taskwait and parent_depends_on.
-	(GOMP_task): For if (0) tasks with depend clause that depend on
-	earlier tasks don't defer them, instead call
-	gomp_task_maybe_wait_for_dependencies to wait for the dependencies.
-	Initialize redundant_out field, for redundant out entries just
-	move them at the end of linked list instead of removing them
-	completely, and set redundant_out flag instead of redundant.
-	(gomp_task_run_pre): Update last_parent_depends_on if scheduling
-	that task.
-	(gomp_task_run_post_handle_dependers): If parent is in
-	gomp_task_maybe_wait_for_dependencies and newly runnable task
-	is not parent_depends_on, queue it in parent->children linked
-	list after all runnable tasks with parent_depends_on set.
-	Adjust for addition of taskwait indirection.
-	(gomp_task_run_post_remove_parent): If parent is in
-	gomp_task_maybe_wait_for_dependencies and task to be removed
-	is parent_depends_on, decrement n_depend and if needed awake
-	parent.  Adjust for addition of taskwait indirection.
-	(GOMP_taskwait): Adjust for addition of taskwait indirection.
-	(gomp_task_maybe_wait_for_dependencies): New function.
-
-2013-10-14  Jakub Jelinek  <jakub@redhat.com>
-
-	* env.c (parse_bind_var): Initialize value to avoid
-	(false positive) warning.
-
-2013-10-12  Jakub Jelinek  <jakub@redhat.com>
-
-	PR libgomp/58691
-	* config/linux/proc.c (gomp_cpuset_popcount): Add unused attribute
-	to check variable.
-	(gomp_init_num_threads): Move i variable declaration into
-	#ifdef CPU_ALLOC_SIZE block.
-	* config/linux/affinity.c (gomp_affinity_init_level): Test
-	gomp_places_list_len == 0 rather than gomp_places_list == 0
-	when checking for topology reading error.
-	* team.c (gomp_team_start): Don't handle bind == omp_proc_bind_false.
-	* env.c (parse_affinity): Add ignore argument, if true, don't populate
-	gomp_places_list, only parse env var and always return false.
-	(parse_places_var): Likewise.  Don't check gomp_global_icv.bind_var.
-	(initialize_env): Always parse OMP_PLACES and GOMP_CPU_AFFINITY env
-	vars, default to OMP_PROC_BIND=true if OMP_PROC_BIND wasn't specified
-	and either of these variables were parsed correctly into a places
-	list.
-
-2013-10-11  Thomas Schwinge  <thomas@codesourcery.com>
-
-        * testsuite/libgomp.c/lib-1.c (main): Add missing error check.
-        * testsuite/libgomp.fortran/lib1.f90: Likewise.
-        * testsuite/libgomp.fortran/lib2.f: Likewise.
-        * testsuite/libgomp.fortran/lib3.f: Likewise.
-
-2013-10-11  Jakub Jelinek  <jakub@redhat.com>
-	    Tobias Burnus  <burnus@net-b.de>
-	    Richard Henderson  <rth@redhat.com>
-
-	* target.c: New file.
-	* Makefile.am (libgomp_la_SOURCES): Add target.c.
-	* Makefile.in: Regenerated.
-	* libgomp_g.h (GOMP_task): Add depend argument.
-	(GOMP_barrier_cancel, GOMP_loop_end_cancel,
-	GOMP_sections_end_cancel, GOMP_target, GOMP_target_data,
-	GOMP_target_end_data, GOMP_target_update, GOMP_teams,
-	GOMP_parallel_loop_static, GOMP_parallel_loop_dynamic,
-	GOMP_parallel_loop_guided, GOMP_parallel_loop_runtime,
-	GOMP_parallel, GOMP_cancel, GOMP_cancellation_point,
-	GOMP_taskgroup_start, GOMP_taskgroup_end,
-	GOMP_parallel_sections): New prototypes.
-	* fortran.c (omp_is_initial_device): Add ialias_redirect.
-	(omp_is_initial_device_): New function.
-	(ULP, STR1, STR2, ialias_redirect): Removed.
-	(omp_get_cancellation_, omp_get_proc_bind_, omp_set_default_device_,
-	omp_set_default_device_8_, omp_get_default_device_,
-	omp_get_num_devices_, omp_get_num_teams_, omp_get_team_num_): New
-	functions.
-	* libgomp.map (GOMP_barrier_cancel, GOMP_loop_end_cancel,
-	GOMP_sections_end_cancel, GOMP_target, GOMP_target_data,
-	GOMP_target_end_data, GOMP_target_update, GOMP_teams): Export
-	@@GOMP_4.0.
-	(omp_is_initial_device, omp_is_initial_device_, omp_get_cancellation,
-	omp_get_cancellation_, omp_get_proc_bind, omp_get_proc_bind_,
-	omp_set_default_device, omp_set_default_device_,
-	omp_set_default_device_8_, omp_get_default_device,
-	omp_get_default_device_, omp_get_num_devices, omp_get_num_devices_,
-	omp_get_num_teams, omp_get_num_teams_, omp_get_team_num,
-	omp_get_team_num_): Export @@OMP_4.0.
-	* team.c (struct gomp_thread_start_data): Add place field.
-	(gomp_thread_start): Clear thr->thread_pool and
-	thr->task before returning.  Use gomp_team_barrier_wait_final
-	instead of gomp_team_barrier_wait.  Initialize thr->place.
-	(gomp_new_team): Initialize work_shares_to_free, work_share_cancelled,
-	team_cancelled and task_queued_count fields.
-	(gomp_free_pool_helper): Clear thr->thread_pool and thr->task
-	before calling pthread_exit.
-	(gomp_free_thread): No longer static.  Use
-	gomp_managed_threads_lock instead of gomp_remaining_threads_lock.
-	(gomp_team_start): Add flags argument.  Set
-	thr->thread_pool->threads_busy to nthreads immediately after creating
-	new pool.  Use gomp_managed_threads_lock instead of
-	gomp_remaining_threads_lock.  Handle OpenMP 4.0 affinity.
-	(gomp_team_end): Use gomp_managed_threads_lock instead of
-	gomp_remaining_threads_lock.  Use gomp_team_barrier_wait_final instead
-	of gomp_team_barrier_wait.  If team->team_cancelled, call
-	gomp_fini_worshare on ws chain starting at team->work_shares_to_free
-	rather than thr->ts.work_share.
-	(initialize_team): Don't call gomp_sem_init here.
-	* sections.c (GOMP_parallel_sections_start): Adjust gomp_team_start
-	caller.
-	(GOMP_parallel_sections, GOMP_sections_end_cancel): New functions.
-	* env.c (gomp_global_icv): Add default_device_var, target_data and
-	bind_var initializers.
-	(gomp_cpu_affinity, gomp_cpu_affinity_len): Remove.
-	(gomp_bind_var_list, gomp_bind_var_list_len, gomp_places_list,
-	gomp_places_list_len): New variables.
-	(parse_bind_var, parse_one_place, parse_places_var): New functions.
-	(parse_affinity): Rewritten to construct OMP_PLACES list with unit
-	sized places.
-	(gomp_cancel_var): New global variable.
-	(parse_int): New function.
-	(handle_omp_display_env): New function.
-	(initialize_env): Use it.  Initialize default_device_var.
-	Parse OMP_CANCELLATION env var.  Use parse_bind_var to parse
-	OMP_PROC_BIND instead of parse_boolean.  Use parse_places_var for
-	OMP_PLACES parsing.  Don't call parse_affinity if OMP_PLACES has
-	been successfully parsed (and call gomp_init_affinity in that case).
-	(omp_get_cancellation, omp_get_proc_bind, omp_set_default_device,
-	omp_get_default_device, omp_get_num_devices, omp_get_num_teams,
-	omp_get_team_num, omp_is_initial_device): New functions.
-	* libgomp.h: Include stdlib.h.
-	(ialias_ulp, ialias_str1, ialias_str2, ialias_redirect, ialias_call):
-	Define.
-	(struct target_mem_desc): Forward declare.
-	(struct gomp_task_icv): Add default_device_var, target_data, bind_var
-	and thread_limit_var fields.
-	(gomp_get_num_devices): New prototype.
-	(gomp_cancel_var): New extern decl.
-	(struct gomp_team): Add work_shares_to_free, work_share_cancelled,
-	team_cancelled and task_queued_count fields.  Add comments about
-	task_{,queued_,running_}count.
-	(gomp_cancel_kind): New enum.
-	(gomp_work_share_end_cancel): New prototype.
-	(struct gomp_task): Add next_taskgroup, prev_taskgroup, taskgroup,
-	copy_ctors_done, dependers, depend_hash, depend_count, num_dependees
-	and depend fields.
-	(struct gomp_taskgroup): New type.
-	(struct gomp_task_depend_entry,
-	struct gomp_dependers_vec): New types.
-	(gomp_finish_task): Free depend_hash if non-NULL.
-	(struct gomp_team_state): Add place_partition_off
-	and place_partition_len fields.
-	(gomp_bind_var_list, gomp_bind_var_list_len, gomp_places_list,
-	gomp_places_list_len): New extern decls.
-	(struct gomp_thread): Add place field.
-	(gomp_cpu_affinity, gomp_cpu_affinity_len): Remove.
-	(gomp_init_thread_affinity): Add place argument.
-	(gomp_affinity_alloc, gomp_affinity_init_place, gomp_affinity_add_cpus,
-	gomp_affinity_remove_cpu, gomp_affinity_copy_place,
-	gomp_affinity_same_place, gomp_affinity_finalize_place_list,
-	gomp_affinity_init_level, gomp_affinity_print_place): New
-	prototypes.
-	(gomp_team_start): Add flags argument.
-	(gomp_thread_limit_var, gomp_remaining_threads_count,
-	gomp_remaining_threads_lock): Remove.
-	(gomp_managed_threads_lock): New variable.
-	(struct gomp_thread_pool): Add threads_busy field.
-	(gomp_free_thread): New prototype.
-	* task.c: Include hashtab.h.
-	(hash_entry_type): New typedef.
-	(htab_alloc, htab_free, htab_hash, htab_eq): New inlines.
-	(gomp_init_task): Clear dependers, depend_hash, depend_count,
-	copy_ctors_done and taskgroup fields.
-	(GOMP_task): Add depend argument, handle depend clauses.  If
-	gomp_team_barrier_cancelled or if it's taskgroup has been
-	cancelled, don't queue or start new tasks.  Set copy_ctors_done
-	field if needed.  Initialize taskgroup field.  If copy_ctors_done
-	and already cancelled, don't discard the task.  If taskgroup is
-	non-NULL, enqueue the task into taskgroup queue.  Increment
-	num_children field in taskgroup.  Increment task_queued_count.
-	(gomp_task_run_pre, gomp_task_run_post_remove_parent,
-	gomp_task_run_post_remove_taskgroup): New inline functions.
-	(gomp_task_run_post_handle_depend_hash,
-	gomp_task_run_post_handle_dependers,
-	gomp_task_run_post_handle_depend): New functions.
-	(GOMP_taskwait): Use them.  If more than one new tasks
-	have been queued, wake other threads if needed.
-	(gomp_barrier_handle_tasks): Likewise.  If
-	gomp_team_barrier_cancelled, don't start any new tasks, just free
-	all tasks.
-	(GOMP_taskgroup_start, GOMP_taskgroup_end): New functions.
-	* loop.c (gomp_parallel_loop_start): Add flags argument, pass it
-	through to gomp_team_start.
-	(GOMP_parallel_loop_static_start, GOMP_parallel_loop_dynamic_start,
-	GOMP_parallel_loop_guided_start, GOMP_parallel_loop_runtime_start):
-	Adjust gomp_parallel_loop_start callers.
-	(GOMP_parallel_loop_static, GOMP_parallel_loop_dynamic,
-	GOMP_parallel_loop_guided, GOMP_parallel_loop_runtime,
-	GOMP_loop_end_cancel): New functions.
-	(GOMP_parallel_end): Add ialias_redirect.
-	* hashtab.h: New file.
-	* work.c (gomp_work_share_end, gomp_work_share_end_nowait): Set
-	team->work_shares_to_free to thr->ts.work_share before calling
-	free_work_share.
-	(gomp_work_share_end_cancel): New function.
-	* config/linux/proc.c: Include errno.h.
-	(gomp_get_cpuset_size, gomp_cpuset_size, gomp_cpusetp): New variables.
-	(gomp_cpuset_popcount): Add cpusetsize argument, use it instead of
-	sizeof (cpu_set_t) to determine number of iterations.  Fix up check
-	extern decl.  Use CPU_COUNT_S if available, or CPU_COUNT if
-	gomp_cpuset_size is sizeof (cpu_set_t).
-	(gomp_init_num_threads): Initialize gomp_cpuset_size,
-	gomp_get_cpuset_size and gomp_cpusetp here, use gomp_cpusetp instead
-	of &cpuset and pass gomp_cpuset_size instead of sizeof (cpu_set_t)
-	to pthread_getaffinity_np.  Free and clear gomp_cpusetp if it didn't
-	contain any logical CPUs.
-	(get_num_procs): Don't call pthread_getaffinity_np if gomp_cpusetp
-	is NULL.  Use gomp_cpusetp instead of &cpuset and pass
-	gomp_get_cpuset_size instead of sizeof (cpu_set_t) to
-	pthread_getaffinity_np.  Check gomp_places_list instead of
-	gomp_cpu_affinity.  Adjust gomp_cpuset_popcount caller.
-	* config/linux/bar.c (gomp_barrier_wait_end,
-	gomp_barrier_wait_last): Use BAR_* defines.
-	(gomp_team_barrier_wait_end): Likewise.  Clear BAR_CANCELLED
-	from state where needed.  Set work_share_cancelled to 0 on last
-	thread.
-	(gomp_team_barrier_wait_final, gomp_team_barrier_wait_cancel_end,
-	gomp_team_barrier_wait_cancel, gomp_team_barrier_cancel): New
-	functions.
-	* config/linux/proc.h (gomp_cpuset_popcount): Add attribute_hidden.
-	Add cpusetsize argument.
-	(gomp_cpuset_size, gomp_cpusetp): Declare.
-	* config/linux/affinity.c: Include errno.h, stdio.h and string.h.
-	(affinity_counter): Remove.
-	(CPU_ISSET_S, CPU_ZERO_S, CPU_SET_S, CPU_CLR_S): Define
-	if CPU_ALLOC_SIZE isn't defined.
-	(gomp_init_affinity): Rewritten, if gomp_places_list is NULL, try
-	silently create OMP_PLACES=threads, if it is non-NULL afterwards,
-	bind current thread to the first place.
-	(gomp_init_thread_affinity): Rewritten.  Add place argument, just
-	pthread_setaffinity_np to gomp_places_list[place].
-	(gomp_affinity_alloc, gomp_affinity_init_place, gomp_affinity_add_cpus,
-	gomp_affinity_remove_cpu, gomp_affinity_copy_place,
-	gomp_affinity_same_place, gomp_affinity_finalize_place_list,
-	gomp_affinity_init_level, gomp_affinity_print_place): New functions.
-	* config/linux/bar.h (BAR_TASK_PENDING, BAR_WAS_LAST,
-	BAR_WAITING_FOR_TASK, BAR_INCR, BAR_CANCELLED): Define.
-	(gomp_barrier_t): Add awaited_final field.
-	(gomp_barrier_init): Initialize awaited_final field.
-	(gomp_team_barrier_wait_final, gomp_team_barrier_wait_cancel,
-	gomp_team_barrier_wait_cancel_end, gomp_team_barrier_cancel): New
-	prototypes.
-	(gomp_barrier_wait_start): Preserve BAR_CANCELLED bit.  Use BAR_*
-	defines.
-	(gomp_barrier_wait_cancel_start, gomp_team_barrier_wait_final_start,
-	gomp_team_barrier_cancelled): New inline functions.
-	(gomp_barrier_last_thread,
-	gomp_team_barrier_set_task_pending,
-	gomp_team_barrier_clear_task_pending,
-	gomp_team_barrier_set_waiting_for_tasks,
-	gomp_team_barrier_waiting_for_tasks,
-	gomp_team_barrier_done): Use BAR_* defines.
-	* config/posix/bar.c (gomp_barrier_init): Clear cancellable field.
-	(gomp_barrier_wait_end): Use BAR_* defines.
-	(gomp_team_barrier_wait_end): Clear BAR_CANCELLED from state.
-	Set work_share_cancelled to 0 on last thread, use __atomic_load_n.
-	Use BAR_* defines.
-	(gomp_team_barrier_wait_cancel_end, gomp_team_barrier_wait_cancel,
-	gomp_team_barrier_cancel): New functions.
-	* config/posix/affinity.c (gomp_init_thread_affinity): Add place
-	argument.
-	(gomp_affinity_alloc, gomp_affinity_init_place, gomp_affinity_add_cpus,
-	gomp_affinity_remove_cpu, gomp_affinity_copy_place,
-	gomp_affinity_same_place, gomp_affinity_finalize_place_list,
-	gomp_affinity_init_level, gomp_affinity_print_place): New stubs.
-	* config/posix/bar.h (BAR_TASK_PENDING, BAR_WAS_LAST,
-	BAR_WAITING_FOR_TASK, BAR_INCR, BAR_CANCELLED): Define.
-	(gomp_barrier_t): Add cancellable field.
-	(gomp_team_barrier_wait_cancel, gomp_team_barrier_wait_cancel_end,
-	gomp_team_barrier_cancel): New prototypes.
-	(gomp_barrier_wait_start): Preserve BAR_CANCELLED bit.
-	(gomp_barrier_wait_cancel_start, gomp_team_barrier_wait_final,
-	gomp_team_barrier_cancelled): New inline functions.
-	(gomp_barrier_wait_start, gomp_barrier_last_thread,
-	gomp_team_barrier_set_task_pending,
-	gomp_team_barrier_clear_task_pending,
-	gomp_team_barrier_set_waiting_for_tasks,
-	gomp_team_barrier_waiting_for_tasks,
-	gomp_team_barrier_done): Use BAR_* defines.
-	* barrier.c (GOMP_barrier_cancel): New function.
-	* parallel.c (GOMP_parallel, GOMP_cancel, GOMP_cancellation_point):
-	New functions.
-	(gomp_resolve_num_threads): Adjust for thread_limit now being in
-	icv->thread_limit_var.  Use UINT_MAX instead of ULONG_MAX as
-	infinity.  If not nested, just return minimum of max_num_threads
-	and icv->thread_limit_var and if thr->thread_pool, set threads_busy
-	to the returned value.  Otherwise, don't update atomically
-	gomp_remaining_threads_count, but instead thr->thread_pool->threads_busy.
-	(GOMP_parallel_end): Adjust for thread_limit now being in
-	icv->thread_limit_var.  Use UINT_MAX instead of ULONG_MAX as
-	infinity.  Adjust threads_busy in the pool rather than
-	gomp_remaining_threads_count.  Remember team->nthreads and call
-	gomp_team_end before adjusting threads_busy, if not nested
-	afterwards, just set it to 1 non-atomically.  Add ialias.
-	(GOMP_parallel_start): Adjust gomp_team_start caller.
-	* testsuite/libgomp.c/atomic-14.c: Add parens to make it valid.
-
---- libgomp/Makefile.am	(revision 210461)
-+++ libgomp/Makefile.am	(revision 210462)
-@@ -60,7 +60,7 @@ libgomp_la_LINK = $(LINK) $(libgomp_la_L
- libgomp_la_SOURCES = alloc.c barrier.c critical.c env.c error.c iter.c \
- 	iter_ull.c loop.c loop_ull.c ordered.c parallel.c sections.c single.c \
- 	task.c team.c work.c lock.c mutex.c proc.c sem.c bar.c ptrlock.c \
--	time.c fortran.c affinity.c
-+	time.c fortran.c affinity.c target.c
- 
- nodist_noinst_HEADERS = libgomp_f.h
- nodist_libsubinclude_HEADERS = omp.h
---- libgomp/Makefile.in	(revision 210461)
-+++ libgomp/Makefile.in	(revision 210462)
-@@ -96,7 +96,7 @@ am_libgomp_la_OBJECTS = alloc.lo barrier
- 	error.lo iter.lo iter_ull.lo loop.lo loop_ull.lo ordered.lo \
- 	parallel.lo sections.lo single.lo task.lo team.lo work.lo \
- 	lock.lo mutex.lo proc.lo sem.lo bar.lo ptrlock.lo time.lo \
--	fortran.lo affinity.lo
-+	fortran.lo affinity.lo target.lo
- libgomp_la_OBJECTS = $(am_libgomp_la_OBJECTS)
- DEFAULT_INCLUDES = -I.@am__isrc@
- depcomp = $(SHELL) $(top_srcdir)/../depcomp
-@@ -317,7 +317,7 @@ libgomp_la_LINK = $(LINK) $(libgomp_la_L
- libgomp_la_SOURCES = alloc.c barrier.c critical.c env.c error.c iter.c \
- 	iter_ull.c loop.c loop_ull.c ordered.c parallel.c sections.c single.c \
- 	task.c team.c work.c lock.c mutex.c proc.c sem.c bar.c ptrlock.c \
--	time.c fortran.c affinity.c
-+	time.c fortran.c affinity.c target.c
- 
- nodist_noinst_HEADERS = libgomp_f.h
- nodist_libsubinclude_HEADERS = omp.h
-@@ -474,6 +474,7 @@ distclean-compile:
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sections.Plo@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sem.Plo@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/single.Plo@am__quote@
-+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/target.Plo@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task.Plo@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/team.Plo@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@
---- libgomp/libgomp_g.h	(revision 210461)
-+++ libgomp/libgomp_g.h	(revision 210462)
-@@ -33,6 +33,7 @@
- /* barrier.c */
- 
- extern void GOMP_barrier (void);
-+extern bool GOMP_barrier_cancel (void);
- 
- /* critical.c */
- 
-@@ -76,9 +77,22 @@ extern void GOMP_parallel_loop_guided_st
- 					     unsigned, long, long, long, long);
- extern void GOMP_parallel_loop_runtime_start (void (*)(void *), void *,
- 					      unsigned, long, long, long);
-+extern void GOMP_parallel_loop_static (void (*)(void *), void *,
-+				       unsigned, long, long, long, long,
-+				       unsigned);
-+extern void GOMP_parallel_loop_dynamic (void (*)(void *), void *,
-+					unsigned, long, long, long, long,
-+					unsigned);
-+extern void GOMP_parallel_loop_guided (void (*)(void *), void *,
-+				       unsigned, long, long, long, long,
-+				       unsigned);
-+extern void GOMP_parallel_loop_runtime (void (*)(void *), void *,
-+					unsigned, long, long, long,
-+					unsigned);
- 
- extern void GOMP_loop_end (void);
- extern void GOMP_loop_end_nowait (void);
-+extern bool GOMP_loop_end_cancel (void);
- 
- /* loop_ull.c */
- 
-@@ -157,13 +171,18 @@ extern void GOMP_ordered_end (void);
- 
- extern void GOMP_parallel_start (void (*) (void *), void *, unsigned);
- extern void GOMP_parallel_end (void);
-+extern void GOMP_parallel (void (*) (void *), void *, unsigned, unsigned);
-+extern bool GOMP_cancel (int, bool);
-+extern bool GOMP_cancellation_point (int);
- 
- /* task.c */
- 
- extern void GOMP_task (void (*) (void *), void *, void (*) (void *, void *),
--		       long, long, bool, unsigned);
-+		       long, long, bool, unsigned, void **);
- extern void GOMP_taskwait (void);
- extern void GOMP_taskyield (void);
-+extern void GOMP_taskgroup_start (void);
-+extern void GOMP_taskgroup_end (void);
- 
- /* sections.c */
- 
-@@ -171,8 +190,11 @@ extern unsigned GOMP_sections_start (uns
- extern unsigned GOMP_sections_next (void);
- extern void GOMP_parallel_sections_start (void (*) (void *), void *,
- 					  unsigned, unsigned);
-+extern void GOMP_parallel_sections (void (*) (void *), void *,
-+				    unsigned, unsigned, unsigned);
- extern void GOMP_sections_end (void);
- extern void GOMP_sections_end_nowait (void);
-+extern bool GOMP_sections_end_cancel (void);
- 
- /* single.c */
- 
-@@ -180,4 +202,15 @@ extern bool GOMP_single_start (void);
- extern void *GOMP_single_copy_start (void);
- extern void GOMP_single_copy_end (void *);
- 
-+/* target.c */
-+
-+extern void GOMP_target (int, void (*) (void *), const void *,
-+			 size_t, void **, size_t *, unsigned char *);
-+extern void GOMP_target_data (int, const void *,
-+			      size_t, void **, size_t *, unsigned char *);
-+extern void GOMP_target_end_data (void);
-+extern void GOMP_target_update (int, const void *,
-+				size_t, void **, size_t *, unsigned char *);
-+extern void GOMP_teams (unsigned int, unsigned int);
-+
- #endif /* LIBGOMP_G_H */
---- libgomp/fortran.c	(revision 210461)
-+++ libgomp/fortran.c	(revision 210462)
-@@ -31,11 +31,6 @@
- 
- #ifdef HAVE_ATTRIBUTE_ALIAS
- /* Use internal aliases if possible.  */
--# define ULP		STR1(__USER_LABEL_PREFIX__)
--# define STR1(x)	STR2(x)
--# define STR2(x)	#x
--# define ialias_redirect(fn) \
--  extern __typeof (fn) fn __asm__ (ULP "gomp_ialias_" #fn) attribute_hidden;
- # ifndef LIBGOMP_GNU_SYMBOL_VERSIONING
- ialias_redirect (omp_init_lock)
- ialias_redirect (omp_init_nest_lock)
-@@ -70,6 +65,14 @@ ialias_redirect (omp_get_ancestor_thread
- ialias_redirect (omp_get_team_size)
- ialias_redirect (omp_get_active_level)
- ialias_redirect (omp_in_final)
-+ialias_redirect (omp_get_cancellation)
-+ialias_redirect (omp_get_proc_bind)
-+ialias_redirect (omp_set_default_device)
-+ialias_redirect (omp_get_default_device)
-+ialias_redirect (omp_get_num_devices)
-+ialias_redirect (omp_get_num_teams)
-+ialias_redirect (omp_get_team_num)
-+ialias_redirect (omp_is_initial_device)
- #endif
- 
- #ifndef LIBGOMP_GNU_SYMBOL_VERSIONING
-@@ -435,3 +438,57 @@ omp_in_final_ (void)
- {
-   return omp_in_final ();
- }
-+
-+int32_t
-+omp_get_cancellation_ (void)
-+{
-+  return omp_get_cancellation ();
-+}
-+
-+int32_t
-+omp_get_proc_bind_ (void)
-+{
-+  return omp_get_proc_bind ();
-+}
-+
-+void
-+omp_set_default_device_ (const int32_t *device_num)
-+{
-+  return omp_set_default_device (*device_num);
-+}
-+
-+void
-+omp_set_default_device_8_ (const int64_t *device_num)
-+{
-+  return omp_set_default_device (TO_INT (*device_num));
-+}
-+
-+int32_t
-+omp_get_default_device_ (void)
-+{
-+  return omp_get_default_device ();
-+}
-+
-+int32_t
-+omp_get_num_devices_ (void)
-+{
-+  return omp_get_num_devices ();
-+}
-+
-+int32_t
-+omp_get_num_teams_ (void)
-+{
-+  return omp_get_num_teams ();
-+}
-+
-+int32_t
-+omp_get_team_num_ (void)
-+{
-+  return omp_get_team_num ();
-+}
-+
-+int32_t
-+omp_is_initial_device_ (void)
-+{
-+  return omp_is_initial_device ();
-+}
---- libgomp/libgomp.map	(revision 210461)
-+++ libgomp/libgomp.map	(revision 210462)
-@@ -113,6 +113,27 @@ OMP_3.1 {
- 	omp_in_final_;
- } OMP_3.0;
- 
-+OMP_4.0 {
-+  global:
-+	omp_get_cancellation;
-+	omp_get_cancellation_;
-+	omp_get_proc_bind;
-+	omp_get_proc_bind_;
-+	omp_set_default_device;
-+	omp_set_default_device_;
-+	omp_set_default_device_8_;
-+	omp_get_default_device;
-+	omp_get_default_device_;
-+	omp_get_num_devices;
-+	omp_get_num_devices_;
-+	omp_get_num_teams;
-+	omp_get_num_teams_;
-+	omp_get_team_num;
-+	omp_get_team_num_;
-+	omp_is_initial_device;
-+	omp_is_initial_device_;
-+} OMP_3.1;
-+
- GOMP_1.0 {
-   global:
- 	GOMP_atomic_end;
-@@ -184,3 +205,25 @@ GOMP_3.0 {
-   global:
- 	GOMP_taskyield;
- } GOMP_2.0;
-+
-+GOMP_4.0 {
-+  global:
-+	GOMP_barrier_cancel;
-+	GOMP_cancel;
-+	GOMP_cancellation_point;
-+	GOMP_loop_end_cancel;
-+	GOMP_parallel_loop_dynamic;
-+	GOMP_parallel_loop_guided;
-+	GOMP_parallel_loop_runtime;
-+	GOMP_parallel_loop_static;
-+	GOMP_parallel_sections;
-+	GOMP_parallel;
-+	GOMP_sections_end_cancel;
-+	GOMP_taskgroup_start;
-+	GOMP_taskgroup_end;
-+	GOMP_target;
-+	GOMP_target_data;
-+	GOMP_target_end_data;
-+	GOMP_target_update;
-+	GOMP_teams;
-+} GOMP_3.0;
---- libgomp/team.c	(revision 210461)
-+++ libgomp/team.c	(revision 210462)
-@@ -53,6 +53,7 @@ struct gomp_thread_start_data
-   struct gomp_team_state ts;
-   struct gomp_task *task;
-   struct gomp_thread_pool *thread_pool;
-+  unsigned int place;
-   bool nested;
- };
- 
-@@ -84,6 +85,7 @@ gomp_thread_start (void *xdata)
-   thr->thread_pool = data->thread_pool;
-   thr->ts = data->ts;
-   thr->task = data->task;
-+  thr->place = data->place;
- 
-   thr->ts.team->ordered_release[thr->ts.team_id] = &thr->release;
- 
-@@ -98,7 +100,7 @@ gomp_thread_start (void *xdata)
-       gomp_barrier_wait (&team->barrier);
- 
-       local_fn (local_data);
--      gomp_team_barrier_wait (&team->barrier);
-+      gomp_team_barrier_wait_final (&team->barrier);
-       gomp_finish_task (task);
-       gomp_barrier_wait_last (&team->barrier);
-     }
-@@ -113,7 +115,7 @@ gomp_thread_start (void *xdata)
- 	  struct gomp_task *task = thr->task;
- 
- 	  local_fn (local_data);
--	  gomp_team_barrier_wait (&team->barrier);
-+	  gomp_team_barrier_wait_final (&team->barrier);
- 	  gomp_finish_task (task);
- 
- 	  gomp_barrier_wait (&pool->threads_dock);
-@@ -126,6 +128,8 @@ gomp_thread_start (void *xdata)
-     }
- 
-   gomp_sem_destroy (&thr->release);
-+  thr->thread_pool = NULL;
-+  thr->task = NULL;
-   return NULL;
- }
- 
-@@ -149,6 +153,7 @@ gomp_new_team (unsigned nthreads)
- #else
-   gomp_mutex_init (&team->work_share_list_free_lock);
- #endif
-+  team->work_shares_to_free = &team->work_shares[0];
-   gomp_init_work_share (&team->work_shares[0], false, nthreads);
-   team->work_shares[0].next_alloc = NULL;
-   team->work_share_list_free = NULL;
-@@ -167,7 +172,10 @@ gomp_new_team (unsigned nthreads)
-   gomp_mutex_init (&team->task_lock);
-   team->task_queue = NULL;
-   team->task_count = 0;
-+  team->task_queued_count = 0;
-   team->task_running_count = 0;
-+  team->work_share_cancelled = 0;
-+  team->team_cancelled = 0;
- 
-   return team;
- }
-@@ -199,16 +207,19 @@ static struct gomp_thread_pool *gomp_new
- static void
- gomp_free_pool_helper (void *thread_pool)
- {
-+  struct gomp_thread *thr = gomp_thread ();
-   struct gomp_thread_pool *pool
-     = (struct gomp_thread_pool *) thread_pool;
-   gomp_barrier_wait_last (&pool->threads_dock);
--  gomp_sem_destroy (&gomp_thread ()->release);
-+  gomp_sem_destroy (&thr->release);
-+  thr->thread_pool = NULL;
-+  thr->task = NULL;
-   pthread_exit (NULL);
- }
- 
- /* Free a thread pool and release its threads. */
- 
--static void
-+void
- gomp_free_thread (void *arg __attribute__((unused)))
- {
-   struct gomp_thread *thr = gomp_thread ();
-@@ -236,9 +247,9 @@ gomp_free_thread (void *arg __attribute_
- 	  __sync_fetch_and_add (&gomp_managed_threads,
- 				1L - pool->threads_used);
- #else
--	  gomp_mutex_lock (&gomp_remaining_threads_lock);
-+	  gomp_mutex_lock (&gomp_managed_threads_lock);
- 	  gomp_managed_threads -= pool->threads_used - 1L;
--	  gomp_mutex_unlock (&gomp_remaining_threads_lock);
-+	  gomp_mutex_unlock (&gomp_managed_threads_lock);
- #endif
- 	}
-       free (pool->threads);
-@@ -259,7 +270,7 @@ gomp_free_thread (void *arg __attribute_
- 
- void
- gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
--		 struct gomp_team *team)
-+		 unsigned flags, struct gomp_team *team)
- {
-   struct gomp_thread_start_data *start_data;
-   struct gomp_thread *thr, *nthr;
-@@ -270,17 +281,24 @@ gomp_team_start (void (*fn) (void *), vo
-   unsigned i, n, old_threads_used = 0;
-   pthread_attr_t thread_attr, *attr;
-   unsigned long nthreads_var;
-+  char bind, bind_var;
-+  unsigned int s = 0, rest = 0, p = 0, k = 0;
-+  unsigned int affinity_count = 0;
-+  struct gomp_thread **affinity_thr = NULL;
- 
-   thr = gomp_thread ();
-   nested = thr->ts.team != NULL;
-   if (__builtin_expect (thr->thread_pool == NULL, 0))
-     {
-       thr->thread_pool = gomp_new_thread_pool ();
-+      thr->thread_pool->threads_busy = nthreads;
-       pthread_setspecific (gomp_thread_destructor, thr);
-     }
-   pool = thr->thread_pool;
-   task = thr->task;
-   icv = task ? &task->icv : &gomp_global_icv;
-+  if (__builtin_expect (gomp_places_list != NULL, 0) && thr->place == 0)
-+    gomp_init_affinity ();
- 
-   /* Always save the previous state, even if this isn't a nested team.
-      In particular, we should save any work share state from an outer
-@@ -303,14 +321,90 @@ gomp_team_start (void (*fn) (void *), vo
-   if (__builtin_expect (gomp_nthreads_var_list != NULL, 0)
-       && thr->ts.level < gomp_nthreads_var_list_len)
-     nthreads_var = gomp_nthreads_var_list[thr->ts.level];
-+  bind_var = icv->bind_var;
-+  if (bind_var != omp_proc_bind_false && (flags & 7) != omp_proc_bind_false)
-+    bind_var = flags & 7;
-+  bind = bind_var;
-+  if (__builtin_expect (gomp_bind_var_list != NULL, 0)
-+      && thr->ts.level < gomp_bind_var_list_len)
-+    bind_var = gomp_bind_var_list[thr->ts.level];
-   gomp_init_task (thr->task, task, icv);
-   team->implicit_task[0].icv.nthreads_var = nthreads_var;
-+  team->implicit_task[0].icv.bind_var = bind_var;
- 
-   if (nthreads == 1)
-     return;
- 
-   i = 1;
- 
-+  if (__builtin_expect (gomp_places_list != NULL, 0))
-+    {
-+      /* Depending on chosen proc_bind model, set subpartition
-+	 for the master thread and initialize helper variables
-+	 P and optionally S, K and/or REST used by later place
-+	 computation for each additional thread.  */
-+      p = thr->place - 1;
-+      switch (bind)
-+	{
-+	case omp_proc_bind_true:
-+	case omp_proc_bind_close:
-+	  if (nthreads > thr->ts.place_partition_len)
-+	    {
-+	      /* T > P.  S threads will be placed in each place,
-+		 and the final REM threads placed one by one
-+		 into the already occupied places.  */
-+	      s = nthreads / thr->ts.place_partition_len;
-+	      rest = nthreads % thr->ts.place_partition_len;
-+	    }
-+	  else
-+	    s = 1;
-+	  k = 1;
-+	  break;
-+	case omp_proc_bind_master:
-+	  /* Each thread will be bound to master's place.  */
-+	  break;
-+	case omp_proc_bind_spread:
-+	  if (nthreads <= thr->ts.place_partition_len)
-+	    {
-+	      /* T <= P.  Each subpartition will have in between s
-+		 and s+1 places (subpartitions starting at or
-+		 after rest will have s places, earlier s+1 places),
-+		 each thread will be bound to the first place in
-+		 its subpartition (except for the master thread
-+		 that can be bound to another place in its
-+		 subpartition).  */
-+	      s = thr->ts.place_partition_len / nthreads;
-+	      rest = thr->ts.place_partition_len % nthreads;
-+	      rest = (s + 1) * rest + thr->ts.place_partition_off;
-+	      if (p < rest)
-+		{
-+		  p -= (p - thr->ts.place_partition_off) % (s + 1);
-+		  thr->ts.place_partition_len = s + 1;
-+		}
-+	      else
-+		{
-+		  p -= (p - rest) % s;
-+		  thr->ts.place_partition_len = s;
-+		}
-+	      thr->ts.place_partition_off = p;
-+	    }
-+	  else
-+	    {
-+	      /* T > P.  Each subpartition will have just a single
-+		 place and we'll place between s and s+1
-+		 threads into each subpartition.  */
-+	      s = nthreads / thr->ts.place_partition_len;
-+	      rest = nthreads % thr->ts.place_partition_len;
-+	      thr->ts.place_partition_off = p;
-+	      thr->ts.place_partition_len = 1;
-+	      k = 1;
-+	    }
-+	  break;
-+	}
-+    }
-+  else
-+    bind = omp_proc_bind_false;
-+
-   /* We only allow the reuse of idle threads for non-nested PARALLEL
-      regions.  This appears to be implied by the semantics of
-      threadprivate variables, but perhaps that's reading too much into
-@@ -341,47 +435,244 @@ gomp_team_start (void (*fn) (void *), vo
- 	 team will exit.  */
-       pool->threads_used = nthreads;
- 
-+      /* If necessary, expand the size of the gomp_threads array.  It is
-+	 expected that changes in the number of threads are rare, thus we
-+	 make no effort to expand gomp_threads_size geometrically.  */
-+      if (nthreads >= pool->threads_size)
-+	{
-+	  pool->threads_size = nthreads + 1;
-+	  pool->threads
-+	    = gomp_realloc (pool->threads,
-+			    pool->threads_size
-+			    * sizeof (struct gomp_thread_data *));
-+	}
-+
-       /* Release existing idle threads.  */
-       for (; i < n; ++i)
- 	{
--	  nthr = pool->threads[i];
-+	  unsigned int place_partition_off = thr->ts.place_partition_off;
-+	  unsigned int place_partition_len = thr->ts.place_partition_len;
-+	  unsigned int place = 0;
-+	  if (__builtin_expect (gomp_places_list != NULL, 0))
-+	    {
-+	      switch (bind)
-+		{
-+		case omp_proc_bind_true:
-+		case omp_proc_bind_close:
-+		  if (k == s)
-+		    {
-+		      ++p;
-+		      if (p == (team->prev_ts.place_partition_off
-+				+ team->prev_ts.place_partition_len))
-+			p = team->prev_ts.place_partition_off;
-+		      k = 1;
-+		      if (i == nthreads - rest)
-+			s = 1;
-+		    }
-+		  else
-+		    ++k;
-+		  break;
-+		case omp_proc_bind_master:
-+		  break;
-+		case omp_proc_bind_spread:
-+		  if (k == 0)
-+		    {
-+		      /* T <= P.  */
-+		      if (p < rest)
-+			p += s + 1;
-+		      else
-+			p += s;
-+		      if (p == (team->prev_ts.place_partition_off
-+				+ team->prev_ts.place_partition_len))
-+			p = team->prev_ts.place_partition_off;
-+		      place_partition_off = p;
-+		      if (p < rest)
-+			place_partition_len = s + 1;
-+		      else
-+			place_partition_len = s;
-+		    }
-+		  else
-+		    {
-+		      /* T > P.  */
-+		      if (k == s)
-+			{
-+			  ++p;
-+			  if (p == (team->prev_ts.place_partition_off
-+				    + team->prev_ts.place_partition_len))
-+			    p = team->prev_ts.place_partition_off;
-+			  k = 1;
-+			  if (i == nthreads - rest)
-+			    s = 1;
-+			}
-+		      else
-+			++k;
-+		      place_partition_off = p;
-+		      place_partition_len = 1;
-+		    }
-+		  break;
-+		}
-+	      if (affinity_thr != NULL
-+		  || (bind != omp_proc_bind_true
-+		      && pool->threads[i]->place != p + 1)
-+		  || pool->threads[i]->place <= place_partition_off
-+		  || pool->threads[i]->place > (place_partition_off
-+						+ place_partition_len))
-+		{
-+		  unsigned int l;
-+		  if (affinity_thr == NULL)
-+		    {
-+		      unsigned int j;
-+
-+		      if (team->prev_ts.place_partition_len > 64)
-+			affinity_thr
-+			  = gomp_malloc (team->prev_ts.place_partition_len
-+					 * sizeof (struct gomp_thread *));
-+		      else
-+			affinity_thr
-+			  = gomp_alloca (team->prev_ts.place_partition_len
-+					 * sizeof (struct gomp_thread *));
-+		      memset (affinity_thr, '\0',
-+			      team->prev_ts.place_partition_len
-+			      * sizeof (struct gomp_thread *));
-+		      for (j = i; j < old_threads_used; j++)
-+			{
-+			  if (pool->threads[j]->place
-+			      > team->prev_ts.place_partition_off
-+			      && (pool->threads[j]->place
-+				  <= (team->prev_ts.place_partition_off
-+				      + team->prev_ts.place_partition_len)))
-+			    {
-+			      l = pool->threads[j]->place - 1
-+				  - team->prev_ts.place_partition_off;
-+			      pool->threads[j]->data = affinity_thr[l];
-+			      affinity_thr[l] = pool->threads[j];
-+			    }
-+			  pool->threads[j] = NULL;
-+			}
-+		      if (nthreads > old_threads_used)
-+			memset (&pool->threads[old_threads_used],
-+				'\0', ((nthreads - old_threads_used)
-+				       * sizeof (struct gomp_thread *)));
-+		      n = nthreads;
-+		      affinity_count = old_threads_used - i;
-+		    }
-+		  if (affinity_count == 0)
-+		    break;
-+		  l = p;
-+		  if (affinity_thr[l - team->prev_ts.place_partition_off]
-+		      == NULL)
-+		    {
-+		      if (bind != omp_proc_bind_true)
-+			continue;
-+		      for (l = place_partition_off;
-+			   l < place_partition_off + place_partition_len;
-+			   l++)
-+			if (affinity_thr[l - team->prev_ts.place_partition_off]
-+			    != NULL)
-+			  break;
-+		      if (l == place_partition_off + place_partition_len)
-+			continue;
-+		    }
-+		  nthr = affinity_thr[l - team->prev_ts.place_partition_off];
-+		  affinity_thr[l - team->prev_ts.place_partition_off]
-+		    = (struct gomp_thread *) nthr->data;
-+		  affinity_count--;
-+		  pool->threads[i] = nthr;
-+		}
-+	      else
-+		nthr = pool->threads[i];
-+	      place = p + 1;
-+	    }
-+	  else
-+	    nthr = pool->threads[i];
- 	  nthr->ts.team = team;
- 	  nthr->ts.work_share = &team->work_shares[0];
- 	  nthr->ts.last_work_share = NULL;
- 	  nthr->ts.team_id = i;
- 	  nthr->ts.level = team->prev_ts.level + 1;
- 	  nthr->ts.active_level = thr->ts.active_level;
-+	  nthr->ts.place_partition_off = place_partition_off;
-+	  nthr->ts.place_partition_len = place_partition_len;
- #ifdef HAVE_SYNC_BUILTINS
- 	  nthr->ts.single_count = 0;
- #endif
- 	  nthr->ts.static_trip = 0;
- 	  nthr->task = &team->implicit_task[i];
-+	  nthr->place = place;
- 	  gomp_init_task (nthr->task, task, icv);
- 	  team->implicit_task[i].icv.nthreads_var = nthreads_var;
-+	  team->implicit_task[i].icv.bind_var = bind_var;
- 	  nthr->fn = fn;
- 	  nthr->data = data;
- 	  team->ordered_release[i] = &nthr->release;
- 	}
- 
-+      if (__builtin_expect (affinity_thr != NULL, 0))
-+	{
-+	  /* If AFFINITY_THR is non-NULL just because we had to
-+	     permute some threads in the pool, but we've managed
-+	     to find exactly as many old threads as we'd find
-+	     without affinity, we don't need to handle this
-+	     specially anymore.  */
-+	  if (nthreads <= old_threads_used
-+	      ? (affinity_count == old_threads_used - nthreads)
-+	      : (i == old_threads_used))
-+	    {
-+	      if (team->prev_ts.place_partition_len > 64)
-+		free (affinity_thr);
-+	      affinity_thr = NULL;
-+	      affinity_count = 0;
-+	    }
-+	  else
-+	    {
-+	      i = 1;
-+	      /* We are going to compute the places/subpartitions
-+		 again from the beginning.  So, we need to reinitialize
-+		 vars modified by the switch (bind) above inside
-+		 of the loop, to the state they had after the initial
-+		 switch (bind).  */
-+	      switch (bind)
-+		{
-+		case omp_proc_bind_true:
-+		case omp_proc_bind_close:
-+		  if (nthreads > thr->ts.place_partition_len)
-+		    /* T > P.  S has been changed, so needs
-+		       to be recomputed.  */
-+		    s = nthreads / thr->ts.place_partition_len;
-+		  k = 1;
-+		  p = thr->place - 1;
-+		  break;
-+		case omp_proc_bind_master:
-+		  /* No vars have been changed.  */
-+		  break;
-+		case omp_proc_bind_spread:
-+		  p = thr->ts.place_partition_off;
-+		  if (k != 0)
-+		    {
-+		      /* T > P.  */
-+		      s = nthreads / team->prev_ts.place_partition_len;
-+		      k = 1;
-+		    }
-+		  break;
-+		}
-+
-+	      /* Increase the barrier threshold to make sure all new
-+		 threads and all the threads we're going to let die
-+		 arrive before the team is released.  */
-+	      if (affinity_count)
-+		gomp_barrier_reinit (&pool->threads_dock,
-+				     nthreads + affinity_count);
-+	    }
-+	}
-+
-       if (i == nthreads)
- 	goto do_release;
- 
--      /* If necessary, expand the size of the gomp_threads array.  It is
--	 expected that changes in the number of threads are rare, thus we
--	 make no effort to expand gomp_threads_size geometrically.  */
--      if (nthreads >= pool->threads_size)
--	{
--	  pool->threads_size = nthreads + 1;
--	  pool->threads
--	    = gomp_realloc (pool->threads,
--			    pool->threads_size
--			    * sizeof (struct gomp_thread_data *));
--	}
-     }
- 
--  if (__builtin_expect (nthreads > old_threads_used, 0))
-+  if (__builtin_expect (nthreads + affinity_count > old_threads_used, 0))
-     {
--      long diff = (long) nthreads - (long) old_threads_used;
-+      long diff = (long) (nthreads + affinity_count) - (long) old_threads_used;
- 
-       if (old_threads_used == 0)
- 	--diff;
-@@ -389,14 +680,14 @@ gomp_team_start (void (*fn) (void *), vo
- #ifdef HAVE_SYNC_BUILTINS
-       __sync_fetch_and_add (&gomp_managed_threads, diff);
- #else
--      gomp_mutex_lock (&gomp_remaining_threads_lock);
-+      gomp_mutex_lock (&gomp_managed_threads_lock);
-       gomp_managed_threads += diff;
--      gomp_mutex_unlock (&gomp_remaining_threads_lock);
-+      gomp_mutex_unlock (&gomp_managed_threads_lock);
- #endif
-     }
- 
-   attr = &gomp_thread_attr;
--  if (__builtin_expect (gomp_cpu_affinity != NULL, 0))
-+  if (__builtin_expect (gomp_places_list != NULL, 0))
-     {
-       size_t stacksize;
-       pthread_attr_init (&thread_attr);
-@@ -410,11 +701,78 @@ gomp_team_start (void (*fn) (void *), vo
- 			    * (nthreads-i));
- 
-   /* Launch new threads.  */
--  for (; i < nthreads; ++i, ++start_data)
-+  for (; i < nthreads; ++i)
-     {
-       pthread_t pt;
-       int err;
- 
-+      start_data->ts.place_partition_off = thr->ts.place_partition_off;
-+      start_data->ts.place_partition_len = thr->ts.place_partition_len;
-+      start_data->place = 0;
-+      if (__builtin_expect (gomp_places_list != NULL, 0))
-+	{
-+	  switch (bind)
-+	    {
-+	    case omp_proc_bind_true:
-+	    case omp_proc_bind_close:
-+	      if (k == s)
-+		{
-+		  ++p;
-+		  if (p == (team->prev_ts.place_partition_off
-+			    + team->prev_ts.place_partition_len))
-+		    p = team->prev_ts.place_partition_off;
-+		  k = 1;
-+		  if (i == nthreads - rest)
-+		    s = 1;
-+		}
-+	      else
-+		++k;
-+	      break;
-+	    case omp_proc_bind_master:
-+	      break;
-+	    case omp_proc_bind_spread:
-+	      if (k == 0)
-+		{
-+		  /* T <= P.  */
-+		  if (p < rest)
-+		    p += s + 1;
-+		  else
-+		    p += s;
-+		  if (p == (team->prev_ts.place_partition_off
-+			    + team->prev_ts.place_partition_len))
-+		    p = team->prev_ts.place_partition_off;
-+		  start_data->ts.place_partition_off = p;
-+		  if (p < rest)
-+		    start_data->ts.place_partition_len = s + 1;
-+		  else
-+		    start_data->ts.place_partition_len = s;
-+		}
-+	      else
-+		{
-+		  /* T > P.  */
-+		  if (k == s)
-+		    {
-+		      ++p;
-+		      if (p == (team->prev_ts.place_partition_off
-+				+ team->prev_ts.place_partition_len))
-+			p = team->prev_ts.place_partition_off;
-+		      k = 1;
-+		      if (i == nthreads - rest)
-+			s = 1;
-+		    }
-+		  else
-+		    ++k;
-+		  start_data->ts.place_partition_off = p;
-+		  start_data->ts.place_partition_len = 1;
-+		}
-+	      break;
-+	    }
-+	  start_data->place = p + 1;
-+	  if (affinity_thr != NULL && pool->threads[i] != NULL)
-+	    continue;
-+	  gomp_init_thread_affinity (attr, p);
-+	}
-+
-       start_data->fn = fn;
-       start_data->fn_data = data;
-       start_data->ts.team = team;
-@@ -430,18 +788,16 @@ gomp_team_start (void (*fn) (void *), vo
-       start_data->task = &team->implicit_task[i];
-       gomp_init_task (start_data->task, task, icv);
-       team->implicit_task[i].icv.nthreads_var = nthreads_var;
-+      team->implicit_task[i].icv.bind_var = bind_var;
-       start_data->thread_pool = pool;
-       start_data->nested = nested;
- 
--      if (gomp_cpu_affinity != NULL)
--	gomp_init_thread_affinity (attr);
--
--      err = pthread_create (&pt, attr, gomp_thread_start, start_data);
-+      err = pthread_create (&pt, attr, gomp_thread_start, start_data++);
-       if (err != 0)
- 	gomp_fatal ("Thread creation failed: %s", strerror (err));
-     }
- 
--  if (__builtin_expect (gomp_cpu_affinity != NULL, 0))
-+  if (__builtin_expect (gomp_places_list != NULL, 0))
-     pthread_attr_destroy (&thread_attr);
- 
-  do_release:
-@@ -450,21 +806,32 @@ gomp_team_start (void (*fn) (void *), vo
-   /* Decrease the barrier threshold to match the number of threads
-      that should arrive back at the end of this team.  The extra
-      threads should be exiting.  Note that we arrange for this test
--     to never be true for nested teams.  */
--  if (__builtin_expect (nthreads < old_threads_used, 0))
-+     to never be true for nested teams.  If AFFINITY_COUNT is non-zero,
-+     the barrier as well as gomp_managed_threads was temporarily
-+     set to NTHREADS + AFFINITY_COUNT.  For NTHREADS < OLD_THREADS_COUNT,
-+     AFFINITY_COUNT if non-zero will be always at least
-+     OLD_THREADS_COUNT - NTHREADS.  */
-+  if (__builtin_expect (nthreads < old_threads_used, 0)
-+      || __builtin_expect (affinity_count, 0))
-     {
-       long diff = (long) nthreads - (long) old_threads_used;
- 
-+      if (affinity_count)
-+	diff = -affinity_count;
-+
-       gomp_barrier_reinit (&pool->threads_dock, nthreads);
- 
- #ifdef HAVE_SYNC_BUILTINS
-       __sync_fetch_and_add (&gomp_managed_threads, diff);
- #else
--      gomp_mutex_lock (&gomp_remaining_threads_lock);
-+      gomp_mutex_lock (&gomp_managed_threads_lock);
-       gomp_managed_threads += diff;
--      gomp_mutex_unlock (&gomp_remaining_threads_lock);
-+      gomp_mutex_unlock (&gomp_managed_threads_lock);
- #endif
-     }
-+  if (__builtin_expect (affinity_thr != NULL, 0)
-+      && team->prev_ts.place_partition_len > 64)
-+    free (affinity_thr);
- }
- 
- 
-@@ -477,9 +844,26 @@ gomp_team_end (void)
-   struct gomp_thread *thr = gomp_thread ();
-   struct gomp_team *team = thr->ts.team;
- 
--  /* This barrier handles all pending explicit threads.  */
--  gomp_team_barrier_wait (&team->barrier);
--  gomp_fini_work_share (thr->ts.work_share);
-+  /* This barrier handles all pending explicit threads.
-+     As #pragma omp cancel parallel might get awaited count in
-+     team->barrier in a inconsistent state, we need to use a different
-+     counter here.  */
-+  gomp_team_barrier_wait_final (&team->barrier);
-+  if (__builtin_expect (team->team_cancelled, 0))
-+    {
-+      struct gomp_work_share *ws = team->work_shares_to_free;
-+      do
-+	{
-+	  struct gomp_work_share *next_ws = gomp_ptrlock_get (&ws->next_ws);
-+	  if (next_ws == NULL)
-+	    gomp_ptrlock_set (&ws->next_ws, ws);
-+	  gomp_fini_work_share (ws);
-+	  ws = next_ws;
-+	}
-+      while (ws != NULL);
-+    }
-+  else
-+    gomp_fini_work_share (thr->ts.work_share);
- 
-   gomp_end_task ();
-   thr->ts = team->prev_ts;
-@@ -489,9 +873,9 @@ gomp_team_end (void)
- #ifdef HAVE_SYNC_BUILTINS
-       __sync_fetch_and_add (&gomp_managed_threads, 1L - team->nthreads);
- #else
--      gomp_mutex_lock (&gomp_remaining_threads_lock);
-+      gomp_mutex_lock (&gomp_managed_threads_lock);
-       gomp_managed_threads -= team->nthreads - 1L;
--      gomp_mutex_unlock (&gomp_remaining_threads_lock);
-+      gomp_mutex_unlock (&gomp_managed_threads_lock);
- #endif
-       /* This barrier has gomp_barrier_wait_last counterparts
- 	 and ensures the team can be safely destroyed.  */
-@@ -532,8 +916,6 @@ gomp_team_end (void)
- static void __attribute__((constructor))
- initialize_team (void)
- {
--  struct gomp_thread *thr;
--
- #ifndef HAVE_TLS
-   static struct gomp_thread initial_thread_tls_data;
- 
-@@ -543,13 +925,6 @@ initialize_team (void)
- 
-   if (pthread_key_create (&gomp_thread_destructor, gomp_free_thread) != 0)
-     gomp_fatal ("could not create thread pool destructor.");
--
--#ifdef HAVE_TLS
--  thr = &gomp_tls_data;
--#else
--  thr = &initial_thread_tls_data;
--#endif
--  gomp_sem_init (&thr->release, 0);
- }
- 
- static void __attribute__((destructor))
---- libgomp/sections.c	(revision 210461)
-+++ libgomp/sections.c	(revision 210462)
-@@ -139,11 +139,27 @@ GOMP_parallel_sections_start (void (*fn)
-   num_threads = gomp_resolve_num_threads (num_threads, count);
-   team = gomp_new_team (num_threads);
-   gomp_sections_init (&team->work_shares[0], count);
--  gomp_team_start (fn, data, num_threads, team);
-+  gomp_team_start (fn, data, num_threads, 0, team);
-+}
-+
-+ialias_redirect (GOMP_parallel_end)
-+
-+void
-+GOMP_parallel_sections (void (*fn) (void *), void *data,
-+			unsigned num_threads, unsigned count, unsigned flags)
-+{
-+  struct gomp_team *team;
-+
-+  num_threads = gomp_resolve_num_threads (num_threads, count);
-+  team = gomp_new_team (num_threads);
-+  gomp_sections_init (&team->work_shares[0], count);
-+  gomp_team_start (fn, data, num_threads, flags, team);
-+  fn (data);
-+  GOMP_parallel_end ();
- }
- 
- /* The GOMP_section_end* routines are called after the thread is told
--   that all sections are complete.  This first version synchronizes
-+   that all sections are complete.  The first two versions synchronize
-    all threads; the nowait version does not.  */
- 
- void
-@@ -152,6 +168,12 @@ GOMP_sections_end (void)
-   gomp_work_share_end ();
- }
- 
-+bool
-+GOMP_sections_end_cancel (void)
-+{
-+  return gomp_work_share_end_cancel ();
-+}
-+
- void
- GOMP_sections_end_nowait (void)
- {
---- libgomp/env.c	(revision 210461)
-+++ libgomp/env.c	(revision 210462)
-@@ -29,6 +29,10 @@
- #include "libgomp_f.h"
- #include <ctype.h>
- #include <stdlib.h>
-+#include <stdio.h>
-+#ifdef HAVE_INTTYPES_H
-+# include <inttypes.h>	/* For PRIu64.  */
-+#endif
- #ifdef STRING_WITH_STRINGS
- # include <string.h>
- # include <strings.h>
-@@ -50,23 +54,28 @@
- 
- struct gomp_task_icv gomp_global_icv = {
-   .nthreads_var = 1,
-+  .thread_limit_var = UINT_MAX,
-   .run_sched_var = GFS_DYNAMIC,
-   .run_sched_modifier = 1,
-+  .default_device_var = 0,
-   .dyn_var = false,
--  .nest_var = false
-+  .nest_var = false,
-+  .bind_var = omp_proc_bind_false,
-+  .target_data = NULL
- };
- 
--unsigned short *gomp_cpu_affinity;
--size_t gomp_cpu_affinity_len;
- unsigned long gomp_max_active_levels_var = INT_MAX;
--unsigned long gomp_thread_limit_var = ULONG_MAX;
--unsigned long gomp_remaining_threads_count;
-+bool gomp_cancel_var = false;
- #ifndef HAVE_SYNC_BUILTINS
--gomp_mutex_t gomp_remaining_threads_lock;
-+gomp_mutex_t gomp_managed_threads_lock;
- #endif
- unsigned long gomp_available_cpus = 1, gomp_managed_threads = 1;
- unsigned long long gomp_spin_count_var, gomp_throttled_spin_count_var;
- unsigned long *gomp_nthreads_var_list, gomp_nthreads_var_list_len;
-+char *gomp_bind_var_list;
-+unsigned long gomp_bind_var_list_len;
-+void **gomp_places_list;
-+unsigned long gomp_places_list_len;
- 
- /* Parse the OMP_SCHEDULE environment variable.  */
- 
-@@ -184,6 +193,24 @@ parse_unsigned_long (const char *name, u
-   return false;
- }
- 
-+/* Parse a positive int environment variable.  Return true if one was
-+   present and it was successfully parsed.  */
-+
-+static bool
-+parse_int (const char *name, int *pvalue, bool allow_zero)
-+{
-+  unsigned long value;
-+  if (!parse_unsigned_long (name, &value, allow_zero))
-+    return false;
-+  if (value > INT_MAX)
-+    {
-+      gomp_error ("Invalid value for environment variable %s", name);
-+      return false;
-+    }
-+  *pvalue = (int) value;
-+  return true;
-+}
-+
- /* Parse an unsigned long list environment variable.  Return true if one was
-    present and it was successfully parsed.  */
- 
-@@ -273,6 +300,416 @@ parse_unsigned_long_list (const char *na
-   return false;
- }
- 
-+/* Parse environment variable set to a boolean or list of omp_proc_bind_t
-+   enum values.  Return true if one was present and it was successfully
-+   parsed.  */
-+
-+static bool
-+parse_bind_var (const char *name, char *p1stvalue,
-+		char **pvalues, unsigned long *pnvalues)
-+{
-+  char *env;
-+  char value = omp_proc_bind_false, *values = NULL;
-+  int i;
-+  static struct proc_bind_kinds
-+  {
-+    const char name[7];
-+    const char len;
-+    omp_proc_bind_t kind;
-+  } kinds[] =
-+  {
-+    { "false", 5, omp_proc_bind_false },
-+    { "true", 4, omp_proc_bind_true },
-+    { "master", 6, omp_proc_bind_master },
-+    { "close", 5, omp_proc_bind_close },
-+    { "spread", 6, omp_proc_bind_spread }
-+  };
-+
-+  env = getenv (name);
-+  if (env == NULL)
-+    return false;
-+
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  if (*env == '\0')
-+    goto invalid;
-+
-+  for (i = 0; i < 5; i++)
-+    if (strncasecmp (env, kinds[i].name, kinds[i].len) == 0)
-+      {
-+	value = kinds[i].kind;
-+	env += kinds[i].len;
-+	break;
-+      }
-+  if (i == 5)
-+    goto invalid;
-+
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  if (*env != '\0')
-+    {
-+      if (*env == ',')
-+	{
-+	  unsigned long nvalues = 0, nalloced = 0;
-+
-+	  if (value == omp_proc_bind_false
-+	      || value == omp_proc_bind_true)
-+	    goto invalid;
-+
-+	  do
-+	    {
-+	      env++;
-+	      if (nvalues == nalloced)
-+		{
-+		  char *n;
-+		  nalloced = nalloced ? nalloced * 2 : 16;
-+		  n = realloc (values, nalloced);
-+		  if (n == NULL)
-+		    {
-+		      free (values);
-+		      gomp_error ("Out of memory while trying to parse"
-+				  " environment variable %s", name);
-+		      return false;
-+		    }
-+		  values = n;
-+		  if (nvalues == 0)
-+		    values[nvalues++] = value;
-+		}
-+
-+	      while (isspace ((unsigned char) *env))
-+		++env;
-+	      if (*env == '\0')
-+		goto invalid;
-+
-+	      for (i = 2; i < 5; i++)
-+		if (strncasecmp (env, kinds[i].name, kinds[i].len) == 0)
-+		  {
-+		    value = kinds[i].kind;
-+		    env += kinds[i].len;
-+		    break;
-+		  }
-+	      if (i == 5)
-+		goto invalid;
-+
-+	      values[nvalues++] = value;
-+	      while (isspace ((unsigned char) *env))
-+		++env;
-+	      if (*env == '\0')
-+		break;
-+	      if (*env != ',')
-+		goto invalid;
-+	    }
-+	  while (1);
-+	  *p1stvalue = values[0];
-+	  *pvalues = values;
-+	  *pnvalues = nvalues;
-+	  return true;
-+	}
-+      goto invalid;
-+    }
-+
-+  *p1stvalue = value;
-+  return true;
-+
-+ invalid:
-+  free (values);
-+  gomp_error ("Invalid value for environment variable %s", name);
-+  return false;
-+}
-+
-+static bool
-+parse_one_place (char **envp, bool *negatep, unsigned long *lenp,
-+		 long *stridep)
-+{
-+  char *env = *envp, *start;
-+  void *p = gomp_places_list ? gomp_places_list[gomp_places_list_len] : NULL;
-+  unsigned long len = 1;
-+  long stride = 1;
-+  int pass;
-+  bool any_negate = false;
-+  *negatep = false;
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  if (*env == '!')
-+    {
-+      *negatep = true;
-+      ++env;
-+      while (isspace ((unsigned char) *env))
-+	++env;
-+    }
-+  if (*env != '{')
-+    return false;
-+  ++env;
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  start = env;
-+  for (pass = 0; pass < (any_negate ? 2 : 1); pass++)
-+    {
-+      env = start;
-+      do
-+	{
-+	  unsigned long this_num, this_len = 1;
-+	  long this_stride = 1;
-+	  bool this_negate = (*env == '!');
-+	  if (this_negate)
-+	    {
-+	      if (gomp_places_list)
-+		any_negate = true;
-+	      ++env;
-+	      while (isspace ((unsigned char) *env))
-+		++env;
-+	    }
-+
-+	  errno = 0;
-+	  this_num = strtoul (env, &env, 10);
-+	  if (errno)
-+	    return false;
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
-+	  if (*env == ':')
-+	    {
-+	      ++env;
-+	      while (isspace ((unsigned char) *env))
-+		++env;
-+	      errno = 0;
-+	      this_len = strtoul (env, &env, 10);
-+	      if (errno || this_len == 0)
-+		return false;
-+	      while (isspace ((unsigned char) *env))
-+		++env;
-+	      if (*env == ':')
-+		{
-+		  ++env;
-+		  while (isspace ((unsigned char) *env))
-+		    ++env;
-+		  errno = 0;
-+		  this_stride = strtol (env, &env, 10);
-+		  if (errno)
-+		    return false;
-+		  while (isspace ((unsigned char) *env))
-+		    ++env;
-+		}
-+	    }
-+	  if (this_negate && this_len != 1)
-+	    return false;
-+	  if (gomp_places_list && pass == this_negate)
-+	    {
-+	      if (this_negate)
-+		{
-+		  if (!gomp_affinity_remove_cpu (p, this_num))
-+		    return false;
-+		}
-+	      else if (!gomp_affinity_add_cpus (p, this_num, this_len,
-+						this_stride, false))
-+		return false;
-+	    }
-+	  if (*env == '}')
-+	    break;
-+	  if (*env != ',')
-+	    return false;
-+	  ++env;
-+	}
-+      while (1);
-+    }
-+
-+  ++env;
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  if (*env == ':')
-+    {
-+      ++env;
-+      while (isspace ((unsigned char) *env))
-+	++env;
-+      errno = 0;
-+      len = strtoul (env, &env, 10);
-+      if (errno || len == 0 || len >= 65536)
-+	return false;
-+      while (isspace ((unsigned char) *env))
-+	++env;
-+      if (*env == ':')
-+	{
-+	  ++env;
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
-+	  errno = 0;
-+	  stride = strtol (env, &env, 10);
-+	  if (errno)
-+	    return false;
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
-+	}
-+    }
-+  if (*negatep && len != 1)
-+    return false;
-+  *envp = env;
-+  *lenp = len;
-+  *stridep = stride;
-+  return true;
-+}
-+
-+static bool
-+parse_places_var (const char *name, bool ignore)
-+{
-+  char *env = getenv (name), *end;
-+  bool any_negate = false;
-+  int level = 0;
-+  unsigned long count = 0;
-+  if (env == NULL)
-+    return false;
-+
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  if (*env == '\0')
-+    goto invalid;
-+
-+  if (strncasecmp (env, "threads", 7) == 0)
-+    {
-+      env += 7;
-+      level = 1;
-+    }
-+  else if (strncasecmp (env, "cores", 5) == 0)
-+    {
-+      env += 5;
-+      level = 2;
-+    }
-+  else if (strncasecmp (env, "sockets", 7) == 0)
-+    {
-+      env += 7;
-+      level = 3;
-+    }
-+  if (level)
-+    {
-+      count = ULONG_MAX;
-+      while (isspace ((unsigned char) *env))
-+	++env;
-+      if (*env != '\0')
-+	{
-+	  if (*env++ != '(')
-+	    goto invalid;
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
-+
-+	  errno = 0;
-+	  count = strtoul (env, &end, 10);
-+	  if (errno)
-+	    goto invalid;
-+	  env = end;
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
-+	  if (*env != ')')
-+	    goto invalid;
-+	  ++env;
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
-+	  if (*env != '\0')
-+	    goto invalid;
-+	}
-+
-+      if (ignore)
-+	return false;
-+
-+      return gomp_affinity_init_level (level, count, false);
-+    }
-+
-+  count = 0;
-+  end = env;
-+  do
-+    {
-+      bool negate;
-+      unsigned long len;
-+      long stride;
-+      if (!parse_one_place (&end, &negate, &len, &stride))
-+	goto invalid;
-+      if (negate)
-+	{
-+	  if (!any_negate)
-+	    count++;
-+	  any_negate = true;
-+	}
-+      else
-+	count += len;
-+      if (count > 65536)
-+	goto invalid;
-+      if (*end == '\0')
-+	break;
-+      if (*end != ',')
-+	goto invalid;
-+      end++;
-+    }
-+  while (1);
-+
-+  if (ignore)
-+    return false;
-+
-+  gomp_places_list_len = 0;
-+  gomp_places_list = gomp_affinity_alloc (count, false);
-+  if (gomp_places_list == NULL)
-+    return false;
-+
-+  do
-+    {
-+      bool negate;
-+      unsigned long len;
-+      long stride;
-+      gomp_affinity_init_place (gomp_places_list[gomp_places_list_len]);
-+      if (!parse_one_place (&env, &negate, &len, &stride))
-+	goto invalid;
-+      if (negate)
-+	{
-+	  void *p;
-+	  for (count = 0; count < gomp_places_list_len; count++)
-+	    if (gomp_affinity_same_place
-+			(gomp_places_list[count],
-+			 gomp_places_list[gomp_places_list_len]))
-+	      break;
-+	  if (count == gomp_places_list_len)
-+	    {
-+	      gomp_error ("Trying to remove a non-existing place from list "
-+			  "of places");
-+	      goto invalid;
-+	    }
-+	  p = gomp_places_list[count];
-+	  memmove (&gomp_places_list[count],
-+		   &gomp_places_list[count + 1],
-+		   (gomp_places_list_len - count - 1) * sizeof (void *));
-+	  --gomp_places_list_len;
-+	  gomp_places_list[gomp_places_list_len] = p;
-+	}
-+      else if (len == 1)
-+	++gomp_places_list_len;
-+      else
-+	{
-+	  for (count = 0; count < len - 1; count++)
-+	    if (!gomp_affinity_copy_place
-+			(gomp_places_list[gomp_places_list_len + count + 1],
-+			 gomp_places_list[gomp_places_list_len + count],
-+			 stride))
-+	      goto invalid;
-+	  gomp_places_list_len += len;
-+	}
-+      if (*env == '\0')
-+	break;
-+      env++;
-+    }
-+  while (1);
-+
-+  if (gomp_places_list_len == 0)
-+    {
-+      gomp_error ("All places have been removed");
-+      goto invalid;
-+    }
-+  if (!gomp_affinity_finalize_place_list (false))
-+    goto invalid;
-+  return true;
-+
-+ invalid:
-+  free (gomp_places_list);
-+  gomp_places_list = NULL;
-+  gomp_places_list_len = 0;
-+  gomp_error ("Invalid value for environment variable %s", name);
-+  return false;
-+}
-+
- /* Parse the OMP_STACKSIZE environment varible.  Return true if one was
-    present and it was successfully parsed.  */
- 
-@@ -478,86 +915,95 @@ parse_wait_policy (void)
-    present and it was successfully parsed.  */
- 
- static bool
--parse_affinity (void)
-+parse_affinity (bool ignore)
- {
--  char *env, *end;
-+  char *env, *end, *start;
-+  int pass;
-   unsigned long cpu_beg, cpu_end, cpu_stride;
--  unsigned short *cpus = NULL;
--  size_t allocated = 0, used = 0, needed;
-+  size_t count = 0, needed;
- 
-   env = getenv ("GOMP_CPU_AFFINITY");
-   if (env == NULL)
-     return false;
- 
--  do
-+  start = env;
-+  for (pass = 0; pass < 2; pass++)
-     {
--      while (*env == ' ' || *env == '\t')
--	env++;
--
--      cpu_beg = strtoul (env, &end, 0);
--      cpu_end = cpu_beg;
--      cpu_stride = 1;
--      if (env == end || cpu_beg >= 65536)
--	goto invalid;
-+      env = start;
-+      if (pass == 1)
-+	{
-+	  if (ignore)
-+	    return false;
- 
--      env = end;
--      if (*env == '-')
-+	  gomp_places_list_len = 0;
-+	  gomp_places_list = gomp_affinity_alloc (count, true);
-+	  if (gomp_places_list == NULL)
-+	    return false;
-+	}
-+      do
- 	{
--	  cpu_end = strtoul (++env, &end, 0);
--	  if (env == end || cpu_end >= 65536 || cpu_end < cpu_beg)
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
-+
-+	  errno = 0;
-+	  cpu_beg = strtoul (env, &end, 0);
-+	  if (errno || cpu_beg >= 65536)
- 	    goto invalid;
-+	  cpu_end = cpu_beg;
-+	  cpu_stride = 1;
- 
- 	  env = end;
--	  if (*env == ':')
-+	  if (*env == '-')
- 	    {
--	      cpu_stride = strtoul (++env, &end, 0);
--	      if (env == end || cpu_stride == 0 || cpu_stride >= 65536)
-+	      errno = 0;
-+	      cpu_end = strtoul (++env, &end, 0);
-+	      if (errno || cpu_end >= 65536 || cpu_end < cpu_beg)
- 		goto invalid;
- 
- 	      env = end;
--	    }
--	}
-+	      if (*env == ':')
-+		{
-+		  errno = 0;
-+		  cpu_stride = strtoul (++env, &end, 0);
-+		  if (errno || cpu_stride == 0 || cpu_stride >= 65536)
-+		    goto invalid;
- 
--      needed = (cpu_end - cpu_beg) / cpu_stride + 1;
--      if (used + needed >= allocated)
--	{
--	  unsigned short *new_cpus;
-+		  env = end;
-+		}
-+	    }
- 
--	  if (allocated < 64)
--	    allocated = 64;
--	  if (allocated > needed)
--	    allocated <<= 1;
-+	  needed = (cpu_end - cpu_beg) / cpu_stride + 1;
-+	  if (pass == 0)
-+	    count += needed;
- 	  else
--	    allocated += 2 * needed;
--	  new_cpus = realloc (cpus, allocated * sizeof (unsigned short));
--	  if (new_cpus == NULL)
- 	    {
--	      free (cpus);
--	      gomp_error ("not enough memory to store GOMP_CPU_AFFINITY list");
--	      return false;
-+	      while (needed--)
-+		{
-+		  void *p = gomp_places_list[gomp_places_list_len];
-+		  gomp_affinity_init_place (p);
-+		  if (gomp_affinity_add_cpus (p, cpu_beg, 1, 0, true))
-+		    ++gomp_places_list_len;
-+		  cpu_beg += cpu_stride;
-+		}
- 	    }
- 
--	  cpus = new_cpus;
--	}
-+	  while (isspace ((unsigned char) *env))
-+	    ++env;
- 
--      while (needed--)
--	{
--	  cpus[used++] = cpu_beg;
--	  cpu_beg += cpu_stride;
-+	  if (*env == ',')
-+	    env++;
-+	  else if (*env == '\0')
-+	    break;
- 	}
--
--      while (*env == ' ' || *env == '\t')
--	env++;
--
--      if (*env == ',')
--	env++;
--      else if (*env == '\0')
--	break;
-+      while (1);
-     }
--  while (1);
- 
--  gomp_cpu_affinity = cpus;
--  gomp_cpu_affinity_len = used;
-+  if (gomp_places_list_len == 0)
-+    {
-+      free (gomp_places_list);
-+      gomp_places_list = NULL;
-+      return false;
-+    }
-   return true;
- 
-  invalid:
-@@ -565,12 +1011,160 @@ parse_affinity (void)
-   return false;
- }
- 
-+
-+static void
-+handle_omp_display_env (unsigned long stacksize, int wait_policy)
-+{
-+  const char *env;
-+  bool display = false;
-+  bool verbose = false;
-+  int i;
-+
-+  env = getenv ("OMP_DISPLAY_ENV");
-+  if (env == NULL)
-+    return;
-+
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  if (strncasecmp (env, "true", 4) == 0)
-+    {
-+      display = true;
-+      env += 4;
-+    }
-+  else if (strncasecmp (env, "false", 5) == 0)
-+    {
-+      display = false;
-+      env += 5;
-+    }
-+  else if (strncasecmp (env, "verbose", 7) == 0)
-+    {
-+      display = true;
-+      verbose = true;
-+      env += 7;
-+    }
-+  else
-+    env = "X";
-+  while (isspace ((unsigned char) *env))
-+    ++env;
-+  if (*env != '\0')
-+    gomp_error ("Invalid value for environment variable OMP_DISPLAY_ENV");
-+
-+  if (!display)
-+    return;
-+
-+  fputs ("\nOPENMP DISPLAY ENVIRONMENT BEGIN\n", stderr);
-+
-+  fputs ("  _OPENMP = '201307'\n", stderr);
-+  fprintf (stderr, "  OMP_DYNAMIC = '%s'\n",
-+	   gomp_global_icv.dyn_var ? "TRUE" : "FALSE");
-+  fprintf (stderr, "  OMP_NESTED = '%s'\n",
-+	   gomp_global_icv.nest_var ? "TRUE" : "FALSE");
-+
-+  fprintf (stderr, "  OMP_NUM_THREADS = '%lu", gomp_global_icv.nthreads_var);
-+  for (i = 1; i < gomp_nthreads_var_list_len; i++)
-+    fprintf (stderr, ",%lu", gomp_nthreads_var_list[i]);
-+  fputs ("'\n", stderr);
-+
-+  fprintf (stderr, "  OMP_SCHEDULE = '");
-+  switch (gomp_global_icv.run_sched_var)
-+    {
-+    case GFS_RUNTIME:
-+      fputs ("RUNTIME", stderr);
-+      break;
-+    case GFS_STATIC:
-+      fputs ("STATIC", stderr);
-+      break;
-+    case GFS_DYNAMIC:
-+      fputs ("DYNAMIC", stderr);
-+      break;
-+    case GFS_GUIDED:
-+      fputs ("GUIDED", stderr);
-+      break;
-+    case GFS_AUTO:
-+      fputs ("AUTO", stderr);
-+      break;
-+    }
-+  fputs ("'\n", stderr);
-+
-+  fputs ("  OMP_PROC_BIND = '", stderr);
-+  switch (gomp_global_icv.bind_var)
-+    {
-+    case omp_proc_bind_false:
-+      fputs ("FALSE", stderr);
-+      break;
-+    case omp_proc_bind_true:
-+      fputs ("TRUE", stderr);
-+      break;
-+    case omp_proc_bind_master:
-+      fputs ("MASTER", stderr);
-+      break;
-+    case omp_proc_bind_close:
-+      fputs ("CLOSE", stderr);
-+      break;
-+    case omp_proc_bind_spread:
-+      fputs ("SPREAD", stderr);
-+      break;
-+    }
-+  for (i = 1; i < gomp_bind_var_list_len; i++)
-+    switch (gomp_bind_var_list[i])
-+      {
-+      case omp_proc_bind_master:
-+	fputs (",MASTER", stderr);
-+	break;
-+      case omp_proc_bind_close:
-+	fputs (",CLOSE", stderr);
-+	break;
-+      case omp_proc_bind_spread:
-+	fputs (",SPREAD", stderr);
-+	break;
-+      }
-+  fputs ("'\n", stderr);
-+  fputs ("  OMP_PLACES = '", stderr);
-+  for (i = 0; i < gomp_places_list_len; i++)
-+    {
-+      fputs ("{", stderr);
-+      gomp_affinity_print_place (gomp_places_list[i]);
-+      fputs (i + 1 == gomp_places_list_len ? "}" : "},", stderr);
-+    }
-+  fputs ("'\n", stderr);
-+
-+  fprintf (stderr, "  OMP_STACKSIZE = '%lu'\n", stacksize);
-+
-+  /* GOMP's default value is actually neither active nor passive.  */
-+  fprintf (stderr, "  OMP_WAIT_POLICY = '%s'\n",
-+	   wait_policy > 0 ? "ACTIVE" : "PASSIVE");
-+  fprintf (stderr, "  OMP_THREAD_LIMIT = '%u'\n",
-+	   gomp_global_icv.thread_limit_var);
-+  fprintf (stderr, "  OMP_MAX_ACTIVE_LEVELS = '%lu'\n",
-+	   gomp_max_active_levels_var);
-+
-+  fprintf (stderr, "  OMP_CANCELLATION = '%s'\n",
-+	   gomp_cancel_var ? "TRUE" : "FALSE");
-+  fprintf (stderr, "  OMP_DEFAULT_DEVICE = '%d'\n",
-+	   gomp_global_icv.default_device_var);
-+
-+  if (verbose)
-+    {
-+      fputs ("  GOMP_CPU_AFFINITY = ''\n", stderr);
-+      fprintf (stderr, "  GOMP_STACKSIZE = '%lu'\n", stacksize);
-+#ifdef HAVE_INTTYPES_H
-+      fprintf (stderr, "  GOMP_SPINCOUNT = '%"PRIu64"'\n",
-+	       (uint64_t) gomp_spin_count_var);
-+#else
-+      fprintf (stderr, "  GOMP_SPINCOUNT = '%lu'\n",
-+	       (unsigned long) gomp_spin_count_var);
-+#endif
-+    }
-+
-+  fputs ("OPENMP DISPLAY ENVIRONMENT END\n", stderr);
-+}
-+
-+
- static void __attribute__((constructor))
- initialize_env (void)
- {
--  unsigned long stacksize;
-+  unsigned long thread_limit_var, stacksize;
-   int wait_policy;
--  bool bind_var = false;
- 
-   /* Do a compile time check that mkomp_h.pl did good job.  */
-   omp_check_defines ();
-@@ -578,14 +1172,17 @@ initialize_env (void)
-   parse_schedule ();
-   parse_boolean ("OMP_DYNAMIC", &gomp_global_icv.dyn_var);
-   parse_boolean ("OMP_NESTED", &gomp_global_icv.nest_var);
--  parse_boolean ("OMP_PROC_BIND", &bind_var);
-+  parse_boolean ("OMP_CANCELLATION", &gomp_cancel_var);
-+  parse_int ("OMP_DEFAULT_DEVICE", &gomp_global_icv.default_device_var, true);
-   parse_unsigned_long ("OMP_MAX_ACTIVE_LEVELS", &gomp_max_active_levels_var,
- 		       true);
--  parse_unsigned_long ("OMP_THREAD_LIMIT", &gomp_thread_limit_var, false);
--  if (gomp_thread_limit_var != ULONG_MAX)
--    gomp_remaining_threads_count = gomp_thread_limit_var - 1;
-+  if (parse_unsigned_long ("OMP_THREAD_LIMIT", &thread_limit_var, false))
-+    {
-+      gomp_global_icv.thread_limit_var
-+	= thread_limit_var > INT_MAX ? UINT_MAX : thread_limit_var;
-+    }
- #ifndef HAVE_SYNC_BUILTINS
--  gomp_mutex_init (&gomp_remaining_threads_lock);
-+  gomp_mutex_init (&gomp_managed_threads_lock);
- #endif
-   gomp_init_num_threads ();
-   gomp_available_cpus = gomp_global_icv.nthreads_var;
-@@ -594,7 +1191,34 @@ initialize_env (void)
- 				 &gomp_nthreads_var_list,
- 				 &gomp_nthreads_var_list_len))
-     gomp_global_icv.nthreads_var = gomp_available_cpus;
--  if (parse_affinity () || bind_var)
-+  bool ignore = false;
-+  if (parse_bind_var ("OMP_PROC_BIND",
-+		      &gomp_global_icv.bind_var,
-+		      &gomp_bind_var_list,
-+		      &gomp_bind_var_list_len)
-+      && gomp_global_icv.bind_var == omp_proc_bind_false)
-+    ignore = true;
-+  /* Make sure OMP_PLACES and GOMP_CPU_AFFINITY env vars are always
-+     parsed if present in the environment.  If OMP_PROC_BIND was set
-+     explictly to false, don't populate places list though.  If places
-+     list was successfully set from OMP_PLACES, only parse but don't process
-+     GOMP_CPU_AFFINITY.  If OMP_PROC_BIND was not set in the environment,
-+     default to OMP_PROC_BIND=true if OMP_PLACES or GOMP_CPU_AFFINITY
-+     was successfully parsed into a places list, otherwise to
-+     OMP_PROC_BIND=false.  */
-+  if (parse_places_var ("OMP_PLACES", ignore))
-+    {
-+      if (gomp_global_icv.bind_var == omp_proc_bind_false)
-+	gomp_global_icv.bind_var = true;
-+      ignore = true;
-+    }
-+  if (parse_affinity (ignore))
-+    {
-+      if (gomp_global_icv.bind_var == omp_proc_bind_false)
-+	gomp_global_icv.bind_var = true;
-+      ignore = true;
-+    }
-+  if (gomp_global_icv.bind_var != omp_proc_bind_false)
-     gomp_init_affinity ();
-   wait_policy = parse_wait_policy ();
-   if (!parse_spincount ("GOMP_SPINCOUNT", &gomp_spin_count_var))
-@@ -645,6 +1269,8 @@ initialize_env (void)
-       if (err != 0)
- 	gomp_error ("Stack size change failed: %s", strerror (err));
-     }
-+
-+  handle_omp_display_env (stacksize, wait_policy);
- }
- 
- 
-@@ -728,7 +1354,8 @@ omp_get_max_threads (void)
- int
- omp_get_thread_limit (void)
- {
--  return gomp_thread_limit_var > INT_MAX ? INT_MAX : gomp_thread_limit_var;
-+  struct gomp_task_icv *icv = gomp_icv (false);
-+  return icv->thread_limit_var > INT_MAX ? INT_MAX : icv->thread_limit_var;
- }
- 
- void
-@@ -744,6 +1371,60 @@ omp_get_max_active_levels (void)
-   return gomp_max_active_levels_var;
- }
- 
-+int
-+omp_get_cancellation (void)
-+{
-+  return gomp_cancel_var;
-+}
-+
-+omp_proc_bind_t
-+omp_get_proc_bind (void)
-+{
-+  struct gomp_task_icv *icv = gomp_icv (false);
-+  return icv->bind_var;
-+}
-+
-+void
-+omp_set_default_device (int device_num)
-+{
-+  struct gomp_task_icv *icv = gomp_icv (true);
-+  icv->default_device_var = device_num >= 0 ? device_num : 0;
-+}
-+
-+int
-+omp_get_default_device (void)
-+{
-+  struct gomp_task_icv *icv = gomp_icv (false);
-+  return icv->default_device_var;
-+}
-+
-+int
-+omp_get_num_devices (void)
-+{
-+  return gomp_get_num_devices ();
-+}
-+
-+int
-+omp_get_num_teams (void)
-+{
-+  /* Hardcoded to 1 on host, MIC, HSAIL?  Maybe variable on PTX.  */
-+  return 1;
-+}
-+
-+int
-+omp_get_team_num (void)
-+{
-+  /* Hardcoded to 0 on host, MIC, HSAIL?  Maybe variable on PTX.  */
-+  return 0;
-+}
-+
-+int
-+omp_is_initial_device (void)
-+{
-+  /* Hardcoded to 1 on host, should be 0 on MIC, HSAIL, PTX.  */
-+  return 1;
-+}
-+
- ialias (omp_set_dynamic)
- ialias (omp_set_nested)
- ialias (omp_set_num_threads)
-@@ -755,3 +1436,11 @@ ialias (omp_get_max_threads)
- ialias (omp_get_thread_limit)
- ialias (omp_set_max_active_levels)
- ialias (omp_get_max_active_levels)
-+ialias (omp_get_cancellation)
-+ialias (omp_get_proc_bind)
-+ialias (omp_set_default_device)
-+ialias (omp_get_default_device)
-+ialias (omp_get_num_devices)
-+ialias (omp_get_num_teams)
-+ialias (omp_get_team_num)
-+ialias (omp_is_initial_device)
---- libgomp/libgomp.h	(revision 210461)
-+++ libgomp/libgomp.h	(revision 213654)
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2005-2013 Free Software Foundation, Inc.
-+/* Copyright (C) 2005-2014 Free Software Foundation, Inc.
-    Contributed by Richard Henderson <rth@redhat.com>.
- 
-    This file is part of the GNU OpenMP Library (libgomp).
-@@ -39,6 +39,7 @@
- 
- #include <pthread.h>
- #include <stdbool.h>
-+#include <stdlib.h>
- 
- #ifdef HAVE_ATTRIBUTE_VISIBILITY
- # pragma GCC visibility push(hidden)
-@@ -201,6 +202,10 @@ struct gomp_team_state
-   /* Active nesting level.  Only active parallel regions are counted.  */
-   unsigned active_level;
- 
-+  /* Place-partition-var, offset and length into gomp_places_list array.  */
-+  unsigned place_partition_off;
-+  unsigned place_partition_len;
-+
- #ifdef HAVE_SYNC_BUILTINS
-   /* Number of single stmts encountered.  */
-   unsigned long single_count;
-@@ -214,30 +219,40 @@ struct gomp_team_state
-   unsigned long static_trip;
- };
- 
--/* These are the OpenMP 3.0 Internal Control Variables described in
-+struct target_mem_desc;
-+
-+/* These are the OpenMP 4.0 Internal Control Variables described in
-    section 2.3.1.  Those described as having one copy per task are
-    stored within the structure; those described as having one copy
-    for the whole program are (naturally) global variables.  */
--
-+   
- struct gomp_task_icv
- {
-   unsigned long nthreads_var;
-   enum gomp_schedule_type run_sched_var;
-   int run_sched_modifier;
-+  int default_device_var;
-+  unsigned int thread_limit_var;
-   bool dyn_var;
-   bool nest_var;
-+  char bind_var;
-+  /* Internal ICV.  */
-+  struct target_mem_desc *target_data;
- };
- 
- extern struct gomp_task_icv gomp_global_icv;
--extern unsigned long gomp_thread_limit_var;
--extern unsigned long gomp_remaining_threads_count;
- #ifndef HAVE_SYNC_BUILTINS
--extern gomp_mutex_t gomp_remaining_threads_lock;
-+extern gomp_mutex_t gomp_managed_threads_lock;
- #endif
- extern unsigned long gomp_max_active_levels_var;
-+extern bool gomp_cancel_var;
- extern unsigned long long gomp_spin_count_var, gomp_throttled_spin_count_var;
- extern unsigned long gomp_available_cpus, gomp_managed_threads;
- extern unsigned long *gomp_nthreads_var_list, gomp_nthreads_var_list_len;
-+extern char *gomp_bind_var_list;
-+extern unsigned long gomp_bind_var_list_len;
-+extern void **gomp_places_list;
-+extern unsigned long gomp_places_list_len;
- 
- enum gomp_task_kind
- {
-@@ -247,6 +262,39 @@ enum gomp_task_kind
-   GOMP_TASK_TIED
- };
- 
-+struct gomp_task;
-+struct gomp_taskgroup;
-+struct htab;
-+
-+struct gomp_task_depend_entry
-+{
-+  void *addr;
-+  struct gomp_task_depend_entry *next;
-+  struct gomp_task_depend_entry *prev;
-+  struct gomp_task *task;
-+  bool is_in;
-+  bool redundant;
-+  bool redundant_out;
-+};
-+
-+struct gomp_dependers_vec
-+{
-+  size_t n_elem;
-+  size_t allocated;
-+  struct gomp_task *elem[];
-+};
-+
-+/* Used when in GOMP_taskwait or in gomp_task_maybe_wait_for_dependencies.  */
-+
-+struct gomp_taskwait
-+{
-+  bool in_taskwait;
-+  bool in_depend_wait;
-+  size_t n_depend;
-+  struct gomp_task *last_parent_depends_on;
-+  gomp_sem_t taskwait_sem;
-+};
-+
- /* This structure describes a "task" to be run by a thread.  */
- 
- struct gomp_task
-@@ -257,14 +305,33 @@ struct gomp_task
-   struct gomp_task *prev_child;
-   struct gomp_task *next_queue;
-   struct gomp_task *prev_queue;
-+  struct gomp_task *next_taskgroup;
-+  struct gomp_task *prev_taskgroup;
-+  struct gomp_taskgroup *taskgroup;
-+  struct gomp_dependers_vec *dependers;
-+  struct htab *depend_hash;
-+  struct gomp_taskwait *taskwait;
-+  size_t depend_count;
-+  size_t num_dependees;
-   struct gomp_task_icv icv;
-   void (*fn) (void *);
-   void *fn_data;
-   enum gomp_task_kind kind;
--  bool in_taskwait;
-   bool in_tied_task;
-   bool final_task;
--  gomp_sem_t taskwait_sem;
-+  bool copy_ctors_done;
-+  bool parent_depends_on;
-+  struct gomp_task_depend_entry depend[];
-+};
-+
-+struct gomp_taskgroup
-+{
-+  struct gomp_taskgroup *prev;
-+  struct gomp_task *children;
-+  bool in_taskgroup_wait;
-+  bool cancelled;
-+  gomp_sem_t taskgroup_sem;
-+  size_t num_children;
- };
- 
- /* This structure describes a "team" of threads.  These are the threads
-@@ -293,6 +360,12 @@ struct gomp_team
-      of the threads in the team.  */
-   gomp_sem_t **ordered_release;
- 
-+  /* List of work shares on which gomp_fini_work_share hasn't been
-+     called yet.  If the team hasn't been cancelled, this should be
-+     equal to each thr->ts.work_share, but otherwise it can be a possibly
-+     long list of workshares.  */
-+  struct gomp_work_share *work_shares_to_free;
-+
-   /* List of gomp_work_share structs chained through next_free fields.
-      This is populated and taken off only by the first thread in the
-      team encountering a new work sharing construct, in a critical
-@@ -324,8 +397,20 @@ struct gomp_team
- 
-   gomp_mutex_t task_lock;
-   struct gomp_task *task_queue;
--  int task_count;
--  int task_running_count;
-+  /* Number of all GOMP_TASK_{WAITING,TIED} tasks in the team.  */
-+  unsigned int task_count;
-+  /* Number of GOMP_TASK_WAITING tasks currently waiting to be scheduled.  */
-+  unsigned int task_queued_count;
-+  /* Number of GOMP_TASK_{WAITING,TIED} tasks currently running
-+     directly in gomp_barrier_handle_tasks; tasks spawned
-+     from e.g. GOMP_taskwait or GOMP_taskgroup_end don't count, even when
-+     that is called from a task run from gomp_barrier_handle_tasks.
-+     task_running_count should be always <= team->nthreads,
-+     and if current task isn't in_tied_task, then it will be
-+     even < team->nthreads.  */
-+  unsigned int task_running_count;
-+  int work_share_cancelled;
-+  int team_cancelled;
- 
-   /* This array contains structures for implicit tasks.  */
-   struct gomp_task implicit_task[];
-@@ -350,7 +435,11 @@ struct gomp_thread
-   /* This semaphore is used for ordered loops.  */
-   gomp_sem_t release;
- 
--  /* user pthread thread pool */
-+  /* Place this thread is bound to plus one, or zero if not bound
-+     to any place.  */
-+  unsigned int place;
-+
-+  /* User pthread thread pool */
-   struct gomp_thread_pool *thread_pool;
- };
- 
-@@ -363,11 +452,23 @@ struct gomp_thread_pool
-   unsigned threads_size;
-   unsigned threads_used;
-   struct gomp_team *last_team;
-+  /* Number of threads running in this contention group.  */
-+  unsigned long threads_busy;
- 
-   /* This barrier holds and releases threads waiting in threads.  */
-   gomp_barrier_t threads_dock;
- };
- 
-+enum gomp_cancel_kind
-+{
-+  GOMP_CANCEL_PARALLEL = 1,
-+  GOMP_CANCEL_LOOP = 2,
-+  GOMP_CANCEL_FOR = GOMP_CANCEL_LOOP,
-+  GOMP_CANCEL_DO = GOMP_CANCEL_LOOP,
-+  GOMP_CANCEL_SECTIONS = 4,
-+  GOMP_CANCEL_TASKGROUP = 8
-+};
-+
- /* ... and here is that TLS data.  */
- 
- #ifdef HAVE_TLS
-@@ -402,17 +503,22 @@ static inline struct gomp_task_icv *gomp
- /* The attributes to be used during thread creation.  */
- extern pthread_attr_t gomp_thread_attr;
- 
--/* Other variables.  */
--
--extern unsigned short *gomp_cpu_affinity;
--extern size_t gomp_cpu_affinity_len;
--
- /* Function prototypes.  */
- 
- /* affinity.c */
- 
- extern void gomp_init_affinity (void);
--extern void gomp_init_thread_affinity (pthread_attr_t *);
-+extern void gomp_init_thread_affinity (pthread_attr_t *, unsigned int);
-+extern void **gomp_affinity_alloc (unsigned long, bool);
-+extern void gomp_affinity_init_place (void *);
-+extern bool gomp_affinity_add_cpus (void *, unsigned long, unsigned long,
-+				    long, bool);
-+extern bool gomp_affinity_remove_cpu (void *, unsigned long);
-+extern bool gomp_affinity_copy_place (void *, void *, long);
-+extern bool gomp_affinity_same_place (void *, void *);
-+extern bool gomp_affinity_finalize_place_list (bool);
-+extern bool gomp_affinity_init_level (int, unsigned long, bool);
-+extern void gomp_affinity_print_place (void *);
- 
- /* alloc.c */
- 
-@@ -486,15 +592,21 @@ extern void gomp_barrier_handle_tasks (g
- static void inline
- gomp_finish_task (struct gomp_task *task)
- {
--  gomp_sem_destroy (&task->taskwait_sem);
-+  if (__builtin_expect (task->depend_hash != NULL, 0))
-+    free (task->depend_hash);
- }
- 
- /* team.c */
- 
- extern struct gomp_team *gomp_new_team (unsigned);
- extern void gomp_team_start (void (*) (void *), void *, unsigned,
--			     struct gomp_team *);
-+			     unsigned, struct gomp_team *);
- extern void gomp_team_end (void);
-+extern void gomp_free_thread (void *);
-+
-+/* target.c */
-+
-+extern int gomp_get_num_devices (void);
- 
- /* work.c */
- 
-@@ -502,6 +614,7 @@ extern void gomp_init_work_share (struct
- extern void gomp_fini_work_share (struct gomp_work_share *);
- extern bool gomp_work_share_start (bool);
- extern void gomp_work_share_end (void);
-+extern bool gomp_work_share_end_cancel (void);
- extern void gomp_work_share_end_nowait (void);
- 
- static inline void
-@@ -524,6 +637,26 @@ gomp_work_share_init_done (void)
- #define _LIBGOMP_OMP_LOCK_DEFINED 1
- #include "omp.h.in"
- 
-+typedef enum omp_proc_bind_t
-+{
-+  omp_proc_bind_false = 0,
-+  omp_proc_bind_true = 1,
-+  omp_proc_bind_master = 2,
-+  omp_proc_bind_close = 3,
-+  omp_proc_bind_spread = 4
-+} omp_proc_bind_t;
-+
-+extern int omp_get_cancellation (void) __GOMP_NOTHROW;
-+extern omp_proc_bind_t omp_get_proc_bind (void) __GOMP_NOTHROW;
-+
-+extern void omp_set_default_device (int) __GOMP_NOTHROW;
-+extern int omp_get_default_device (void) __GOMP_NOTHROW;
-+extern int omp_get_num_devices (void) __GOMP_NOTHROW;
-+extern int omp_get_num_teams (void) __GOMP_NOTHROW;
-+extern int omp_get_team_num (void) __GOMP_NOTHROW;
-+
-+extern int omp_is_initial_device (void) __GOMP_NOTHROW;
-+
- #if !defined (HAVE_ATTRIBUTE_VISIBILITY) \
-     || !defined (HAVE_ATTRIBUTE_ALIAS) \
-     || !defined (HAVE_AS_SYMVER_DIRECTIVE) \
-@@ -580,11 +713,19 @@ extern int gomp_test_nest_lock_25 (omp_n
- #endif
- 
- #ifdef HAVE_ATTRIBUTE_ALIAS
-+# define ialias_ulp	ialias_str1(__USER_LABEL_PREFIX__)
-+# define ialias_str1(x)	ialias_str2(x)
-+# define ialias_str2(x)	#x
- # define ialias(fn) \
-   extern __typeof (fn) gomp_ialias_##fn \
-     __attribute__ ((alias (#fn))) attribute_hidden;
-+# define ialias_redirect(fn) \
-+  extern __typeof (fn) fn __asm__ (ialias_ulp "gomp_ialias_" #fn) attribute_hidden;
-+# define ialias_call(fn) gomp_ialias_ ## fn
- #else
- # define ialias(fn)
-+# define ialias_redirect(fn)
-+# define ialias_call(fn) fn
- #endif
- 
- #endif /* LIBGOMP_H */
---- libgomp/task.c	(revision 210461)
-+++ libgomp/task.c	(revision 213654)
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2007-2013 Free Software Foundation, Inc.
-+/* Copyright (C) 2007-2014 Free Software Foundation, Inc.
-    Contributed by Richard Henderson <rth@redhat.com>.
- 
-    This file is part of the GNU OpenMP Library (libgomp).
-@@ -29,6 +29,33 @@
- #include <stdlib.h>
- #include <string.h>
- 
-+typedef struct gomp_task_depend_entry *hash_entry_type;
-+
-+static inline void *
-+htab_alloc (size_t size)
-+{
-+  return gomp_malloc (size);
-+}
-+
-+static inline void
-+htab_free (void *ptr)
-+{
-+  free (ptr);
-+}
-+
-+#include "hashtab.h"
-+
-+static inline hashval_t
-+htab_hash (hash_entry_type element)
-+{
-+  return hash_pointer (element->addr);
-+}
-+
-+static inline bool
-+htab_eq (hash_entry_type x, hash_entry_type y)
-+{
-+  return x->addr == y->addr;
-+}
- 
- /* Create a new task data structure.  */
- 
-@@ -39,11 +66,16 @@ gomp_init_task (struct gomp_task *task,
-   task->parent = parent_task;
-   task->icv = *prev_icv;
-   task->kind = GOMP_TASK_IMPLICIT;
--  task->in_taskwait = false;
-+  task->taskwait = NULL;
-   task->in_tied_task = false;
-   task->final_task = false;
-+  task->copy_ctors_done = false;
-+  task->parent_depends_on = false;
-   task->children = NULL;
--  gomp_sem_init (&task->taskwait_sem, 0);
-+  task->taskgroup = NULL;
-+  task->dependers = NULL;
-+  task->depend_hash = NULL;
-+  task->depend_count = 0;
- }
- 
- /* Clean up a task, after completing it.  */
-@@ -72,13 +104,16 @@ gomp_clear_parent (struct gomp_task *chi
-     while (task != children);
- }
- 
-+static void gomp_task_maybe_wait_for_dependencies (void **depend);
-+
- /* Called when encountering an explicit task directive.  If IF_CLAUSE is
-    false, then we must not delay in executing the task.  If UNTIED is true,
-    then the task may be executed by any member of the team.  */
- 
- void
- GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
--	   long arg_size, long arg_align, bool if_clause, unsigned flags)
-+	   long arg_size, long arg_align, bool if_clause, unsigned flags,
-+	   void **depend)
- {
-   struct gomp_thread *thr = gomp_thread ();
-   struct gomp_team *team = thr->ts.team;
-@@ -94,17 +129,35 @@ GOMP_task (void (*fn) (void *), void *da
-     flags &= ~1;
- #endif
- 
-+  /* If parallel or taskgroup has been cancelled, don't start new tasks.  */
-+  if (team
-+      && (gomp_team_barrier_cancelled (&team->barrier)
-+	  || (thr->task->taskgroup && thr->task->taskgroup->cancelled)))
-+    return;
-+
-   if (!if_clause || team == NULL
-       || (thr->task && thr->task->final_task)
-       || team->task_count > 64 * team->nthreads)
-     {
-       struct gomp_task task;
- 
-+      /* If there are depend clauses and earlier deferred sibling tasks
-+	 with depend clauses, check if there isn't a dependency.  If there
-+	 is, we need to wait for them.  There is no need to handle
-+	 depend clauses for non-deferred tasks other than this, because
-+	 the parent task is suspended until the child task finishes and thus
-+	 it can't start further child tasks.  */
-+      if ((flags & 8) && thr->task && thr->task->depend_hash)
-+	gomp_task_maybe_wait_for_dependencies (depend);
-+
-       gomp_init_task (&task, thr->task, gomp_icv (false));
-       task.kind = GOMP_TASK_IFFALSE;
-       task.final_task = (thr->task && thr->task->final_task) || (flags & 2);
-       if (thr->task)
--	task.in_tied_task = thr->task->in_tied_task;
-+	{
-+	  task.in_tied_task = thr->task->in_tied_task;
-+	  task.taskgroup = thr->task->taskgroup;
-+	}
-       thr->task = &task;
-       if (__builtin_expect (cpyfn != NULL, 0))
- 	{
-@@ -137,27 +190,174 @@ GOMP_task (void (*fn) (void *), void *da
-     {
-       struct gomp_task *task;
-       struct gomp_task *parent = thr->task;
-+      struct gomp_taskgroup *taskgroup = parent->taskgroup;
-       char *arg;
-       bool do_wake;
-+      size_t depend_size = 0;
- 
--      task = gomp_malloc (sizeof (*task) + arg_size + arg_align - 1);
--      arg = (char *) (((uintptr_t) (task + 1) + arg_align - 1)
-+      if (flags & 8)
-+	depend_size = ((uintptr_t) depend[0]
-+		       * sizeof (struct gomp_task_depend_entry));
-+      task = gomp_malloc (sizeof (*task) + depend_size
-+			  + arg_size + arg_align - 1);
-+      arg = (char *) (((uintptr_t) (task + 1) + depend_size + arg_align - 1)
- 		      & ~(uintptr_t) (arg_align - 1));
-       gomp_init_task (task, parent, gomp_icv (false));
-       task->kind = GOMP_TASK_IFFALSE;
-       task->in_tied_task = parent->in_tied_task;
-+      task->taskgroup = taskgroup;
-       thr->task = task;
-       if (cpyfn)
--	cpyfn (arg, data);
-+	{
-+	  cpyfn (arg, data);
-+	  task->copy_ctors_done = true;
-+	}
-       else
- 	memcpy (arg, data, arg_size);
-       thr->task = parent;
-       task->kind = GOMP_TASK_WAITING;
-       task->fn = fn;
-       task->fn_data = arg;
--      task->in_tied_task = true;
-       task->final_task = (flags & 2) >> 1;
-       gomp_mutex_lock (&team->task_lock);
-+      /* If parallel or taskgroup has been cancelled, don't start new
-+	 tasks.  */
-+      if (__builtin_expect ((gomp_team_barrier_cancelled (&team->barrier)
-+			     || (taskgroup && taskgroup->cancelled))
-+			    && !task->copy_ctors_done, 0))
-+	{
-+	  gomp_mutex_unlock (&team->task_lock);
-+	  gomp_finish_task (task);
-+	  free (task);
-+	  return;
-+	}
-+      if (taskgroup)
-+	taskgroup->num_children++;
-+      if (depend_size)
-+	{
-+	  size_t ndepend = (uintptr_t) depend[0];
-+	  size_t nout = (uintptr_t) depend[1];
-+	  size_t i;
-+	  hash_entry_type ent;
-+
-+	  task->depend_count = ndepend;
-+	  task->num_dependees = 0;
-+	  if (parent->depend_hash == NULL)
-+	    parent->depend_hash
-+	      = htab_create (2 * ndepend > 12 ? 2 * ndepend : 12);
-+	  for (i = 0; i < ndepend; i++)
-+	    {
-+	      task->depend[i].addr = depend[2 + i];
-+	      task->depend[i].next = NULL;
-+	      task->depend[i].prev = NULL;
-+	      task->depend[i].task = task;
-+	      task->depend[i].is_in = i >= nout;
-+	      task->depend[i].redundant = false;
-+	      task->depend[i].redundant_out = false;
-+
-+	      hash_entry_type *slot
-+		= htab_find_slot (&parent->depend_hash, &task->depend[i],
-+				  INSERT);
-+	      hash_entry_type out = NULL, last = NULL;
-+	      if (*slot)
-+		{
-+		  /* If multiple depends on the same task are the
-+		     same, all but the first one are redundant.
-+		     As inout/out come first, if any of them is
-+		     inout/out, it will win, which is the right
-+		     semantics.  */
-+		  if ((*slot)->task == task)
-+		    {
-+		      task->depend[i].redundant = true;
-+		      continue;
-+		    }
-+		  for (ent = *slot; ent; ent = ent->next)
-+		    {
-+		      if (ent->redundant_out)
-+			break;
-+
-+		      last = ent;
-+
-+		      /* depend(in:...) doesn't depend on earlier
-+			 depend(in:...).  */
-+		      if (i >= nout && ent->is_in)
-+			continue;
-+
-+		      if (!ent->is_in)
-+			out = ent;
-+
-+		      struct gomp_task *tsk = ent->task;
-+		      if (tsk->dependers == NULL)
-+			{
-+			  tsk->dependers
-+			    = gomp_malloc (sizeof (struct gomp_dependers_vec)
-+					   + 6 * sizeof (struct gomp_task *));
-+			  tsk->dependers->n_elem = 1;
-+			  tsk->dependers->allocated = 6;
-+			  tsk->dependers->elem[0] = task;
-+			  task->num_dependees++;
-+			  continue;
-+			}
-+		      /* We already have some other dependency on tsk
-+			 from earlier depend clause.  */
-+		      else if (tsk->dependers->n_elem
-+			       && (tsk->dependers->elem[tsk->dependers->n_elem
-+							- 1]
-+				   == task))
-+			continue;
-+		      else if (tsk->dependers->n_elem
-+			       == tsk->dependers->allocated)
-+			{
-+			  tsk->dependers->allocated
-+			    = tsk->dependers->allocated * 2 + 2;
-+			  tsk->dependers
-+			    = gomp_realloc (tsk->dependers,
-+					    sizeof (struct gomp_dependers_vec)
-+					    + (tsk->dependers->allocated
-+					       * sizeof (struct gomp_task *)));
-+			}
-+		      tsk->dependers->elem[tsk->dependers->n_elem++] = task;
-+		      task->num_dependees++;
-+		    }
-+		  task->depend[i].next = *slot;
-+		  (*slot)->prev = &task->depend[i];
-+		}
-+	      *slot = &task->depend[i];
-+
-+	      /* There is no need to store more than one depend({,in}out:)
-+		 task per address in the hash table chain for the purpose
-+		 of creation of deferred tasks, because each out
-+		 depends on all earlier outs, thus it is enough to record
-+		 just the last depend({,in}out:).  For depend(in:), we need
-+		 to keep all of the previous ones not terminated yet, because
-+		 a later depend({,in}out:) might need to depend on all of
-+		 them.  So, if the new task's clause is depend({,in}out:),
-+		 we know there is at most one other depend({,in}out:) clause
-+		 in the list (out).  For non-deferred tasks we want to see
-+		 all outs, so they are moved to the end of the chain,
-+		 after first redundant_out entry all following entries
-+		 should be redundant_out.  */
-+	      if (!task->depend[i].is_in && out)
-+		{
-+		  if (out != last)
-+		    {
-+		      out->next->prev = out->prev;
-+		      out->prev->next = out->next;
-+		      out->next = last->next;
-+		      out->prev = last;
-+		      last->next = out;
-+		      if (out->next)
-+			out->next->prev = out;
-+		    }
-+		  out->redundant_out = true;
-+		}
-+	    }
-+	  if (task->num_dependees)
-+	    {
-+	      gomp_mutex_unlock (&team->task_lock);
-+	      return;
-+	    }
-+	}
-       if (parent->children)
- 	{
- 	  task->next_child = parent->children;
-@@ -171,6 +371,22 @@ GOMP_task (void (*fn) (void *), void *da
- 	  task->prev_child = task;
- 	}
-       parent->children = task;
-+      if (taskgroup)
-+	{
-+	  if (taskgroup->children)
-+	    {
-+	      task->next_taskgroup = taskgroup->children;
-+	      task->prev_taskgroup = taskgroup->children->prev_taskgroup;
-+	      task->next_taskgroup->prev_taskgroup = task;
-+	      task->prev_taskgroup->next_taskgroup = task;
-+	    }
-+	  else
-+	    {
-+	      task->next_taskgroup = task;
-+	      task->prev_taskgroup = task;
-+	    }
-+	  taskgroup->children = task;
-+	}
-       if (team->task_queue)
- 	{
- 	  task->next_queue = team->task_queue;
-@@ -185,6 +401,7 @@ GOMP_task (void (*fn) (void *), void *da
- 	  team->task_queue = task;
- 	}
-       ++team->task_count;
-+      ++team->task_queued_count;
-       gomp_team_barrier_set_task_pending (&team->barrier);
-       do_wake = team->task_running_count + !parent->in_tied_task
- 		< team->nthreads;
-@@ -194,6 +411,265 @@ GOMP_task (void (*fn) (void *), void *da
-     }
- }
- 
-+static inline bool
-+gomp_task_run_pre (struct gomp_task *child_task, struct gomp_task *parent,
-+		   struct gomp_taskgroup *taskgroup, struct gomp_team *team)
-+{
-+  if (parent)
-+    {
-+      if (parent->children == child_task)
-+	parent->children = child_task->next_child;
-+      if (__builtin_expect (child_task->parent_depends_on, 0)
-+	  && parent->taskwait->last_parent_depends_on == child_task)
-+	{
-+	  if (child_task->prev_child->kind == GOMP_TASK_WAITING
-+	      && child_task->prev_child->parent_depends_on)
-+	    parent->taskwait->last_parent_depends_on = child_task->prev_child;
-+	  else
-+	    parent->taskwait->last_parent_depends_on = NULL;
-+	}
-+    }
-+  if (taskgroup && taskgroup->children == child_task)
-+    taskgroup->children = child_task->next_taskgroup;
-+  child_task->prev_queue->next_queue = child_task->next_queue;
-+  child_task->next_queue->prev_queue = child_task->prev_queue;
-+  if (team->task_queue == child_task)
-+    {
-+      if (child_task->next_queue != child_task)
-+	team->task_queue = child_task->next_queue;
-+      else
-+	team->task_queue = NULL;
-+    }
-+  child_task->kind = GOMP_TASK_TIED;
-+  if (--team->task_queued_count == 0)
-+    gomp_team_barrier_clear_task_pending (&team->barrier);
-+  if ((gomp_team_barrier_cancelled (&team->barrier)
-+       || (taskgroup && taskgroup->cancelled))
-+      && !child_task->copy_ctors_done)
-+    return true;
-+  return false;
-+}
-+
-+static void
-+gomp_task_run_post_handle_depend_hash (struct gomp_task *child_task)
-+{
-+  struct gomp_task *parent = child_task->parent;
-+  size_t i;
-+
-+  for (i = 0; i < child_task->depend_count; i++)
-+    if (!child_task->depend[i].redundant)
-+      {
-+	if (child_task->depend[i].next)
-+	  child_task->depend[i].next->prev = child_task->depend[i].prev;
-+	if (child_task->depend[i].prev)
-+	  child_task->depend[i].prev->next = child_task->depend[i].next;
-+	else
-+	  {
-+	    hash_entry_type *slot
-+	      = htab_find_slot (&parent->depend_hash, &child_task->depend[i],
-+				NO_INSERT);
-+	    if (*slot != &child_task->depend[i])
-+	      abort ();
-+	    if (child_task->depend[i].next)
-+	      *slot = child_task->depend[i].next;
-+	    else
-+	      htab_clear_slot (parent->depend_hash, slot);
-+	  }
-+      }
-+}
-+
-+static size_t
-+gomp_task_run_post_handle_dependers (struct gomp_task *child_task,
-+				     struct gomp_team *team)
-+{
-+  struct gomp_task *parent = child_task->parent;
-+  size_t i, count = child_task->dependers->n_elem, ret = 0;
-+  for (i = 0; i < count; i++)
-+    {
-+      struct gomp_task *task = child_task->dependers->elem[i];
-+      if (--task->num_dependees != 0)
-+	continue;
-+
-+      struct gomp_taskgroup *taskgroup = task->taskgroup;
-+      if (parent)
-+	{
-+	  if (parent->children)
-+	    {
-+	      /* If parent is in gomp_task_maybe_wait_for_dependencies
-+		 and it doesn't need to wait for this task, put it after
-+		 all ready to run tasks it needs to wait for.  */
-+	      if (parent->taskwait && parent->taskwait->last_parent_depends_on
-+		  && !task->parent_depends_on)
-+		{
-+		  struct gomp_task *last_parent_depends_on
-+		    = parent->taskwait->last_parent_depends_on;
-+		  task->next_child = last_parent_depends_on->next_child;
-+		  task->prev_child = last_parent_depends_on;
-+		}
-+	      else
-+		{
-+		  task->next_child = parent->children;
-+		  task->prev_child = parent->children->prev_child;
-+		  parent->children = task;
-+		}
-+	      task->next_child->prev_child = task;
-+	      task->prev_child->next_child = task;
-+	    }
-+	  else
-+	    {
-+	      task->next_child = task;
-+	      task->prev_child = task;
-+	      parent->children = task;
-+	    }
-+	  if (parent->taskwait)
-+	    {
-+	      if (parent->taskwait->in_taskwait)
-+		{
-+		  parent->taskwait->in_taskwait = false;
-+		  gomp_sem_post (&parent->taskwait->taskwait_sem);
-+		}
-+	      else if (parent->taskwait->in_depend_wait)
-+		{
-+		  parent->taskwait->in_depend_wait = false;
-+		  gomp_sem_post (&parent->taskwait->taskwait_sem);
-+		}
-+	      if (parent->taskwait->last_parent_depends_on == NULL
-+		  && task->parent_depends_on)
-+		parent->taskwait->last_parent_depends_on = task;
-+	    }
-+	}
-+      if (taskgroup)
-+	{
-+	  if (taskgroup->children)
-+	    {
-+	      task->next_taskgroup = taskgroup->children;
-+	      task->prev_taskgroup = taskgroup->children->prev_taskgroup;
-+	      task->next_taskgroup->prev_taskgroup = task;
-+	      task->prev_taskgroup->next_taskgroup = task;
-+	    }
-+	  else
-+	    {
-+	      task->next_taskgroup = task;
-+	      task->prev_taskgroup = task;
-+	    }
-+	  taskgroup->children = task;
-+	  if (taskgroup->in_taskgroup_wait)
-+	    {
-+	      taskgroup->in_taskgroup_wait = false;
-+	      gomp_sem_post (&taskgroup->taskgroup_sem);
-+	    }
-+	}
-+      if (team->task_queue)
-+	{
-+	  task->next_queue = team->task_queue;
-+	  task->prev_queue = team->task_queue->prev_queue;
-+	  task->next_queue->prev_queue = task;
-+	  task->prev_queue->next_queue = task;
-+	}
-+      else
-+	{
-+	  task->next_queue = task;
-+	  task->prev_queue = task;
-+	  team->task_queue = task;
-+	}
-+      ++team->task_count;
-+      ++team->task_queued_count;
-+      ++ret;
-+    }
-+  free (child_task->dependers);
-+  child_task->dependers = NULL;
-+  if (ret > 1)
-+    gomp_team_barrier_set_task_pending (&team->barrier);
-+  return ret;
-+}
-+
-+static inline size_t
-+gomp_task_run_post_handle_depend (struct gomp_task *child_task,
-+				  struct gomp_team *team)
-+{
-+  if (child_task->depend_count == 0)
-+    return 0;
-+
-+  /* If parent is gone already, the hash table is freed and nothing
-+     will use the hash table anymore, no need to remove anything from it.  */
-+  if (child_task->parent != NULL)
-+    gomp_task_run_post_handle_depend_hash (child_task);
-+
-+  if (child_task->dependers == NULL)
-+    return 0;
-+
-+  return gomp_task_run_post_handle_dependers (child_task, team);
-+}
-+
-+static inline void
-+gomp_task_run_post_remove_parent (struct gomp_task *child_task)
-+{
-+  struct gomp_task *parent = child_task->parent;
-+  if (parent == NULL)
-+    return;
-+  if (__builtin_expect (child_task->parent_depends_on, 0)
-+      && --parent->taskwait->n_depend == 0
-+      && parent->taskwait->in_depend_wait)
-+    {
-+      parent->taskwait->in_depend_wait = false;
-+      gomp_sem_post (&parent->taskwait->taskwait_sem);
-+    }
-+  child_task->prev_child->next_child = child_task->next_child;
-+  child_task->next_child->prev_child = child_task->prev_child;
-+  if (parent->children != child_task)
-+    return;
-+  if (child_task->next_child != child_task)
-+    parent->children = child_task->next_child;
-+  else
-+    {
-+      /* We access task->children in GOMP_taskwait
-+	 outside of the task lock mutex region, so
-+	 need a release barrier here to ensure memory
-+	 written by child_task->fn above is flushed
-+	 before the NULL is written.  */
-+      __atomic_store_n (&parent->children, NULL, MEMMODEL_RELEASE);
-+      if (parent->taskwait && parent->taskwait->in_taskwait)
-+	{
-+	  parent->taskwait->in_taskwait = false;
-+	  gomp_sem_post (&parent->taskwait->taskwait_sem);
-+	}
-+    }
-+}
-+
-+static inline void
-+gomp_task_run_post_remove_taskgroup (struct gomp_task *child_task)
-+{
-+  struct gomp_taskgroup *taskgroup = child_task->taskgroup;
-+  if (taskgroup == NULL)
-+    return;
-+  child_task->prev_taskgroup->next_taskgroup = child_task->next_taskgroup;
-+  child_task->next_taskgroup->prev_taskgroup = child_task->prev_taskgroup;
-+  if (taskgroup->num_children > 1)
-+    --taskgroup->num_children;
-+  else
-+    {
-+      /* We access taskgroup->num_children in GOMP_taskgroup_end
-+	 outside of the task lock mutex region, so
-+	 need a release barrier here to ensure memory
-+	 written by child_task->fn above is flushed
-+	 before the NULL is written.  */
-+      __atomic_store_n (&taskgroup->num_children, 0, MEMMODEL_RELEASE);
-+    }
-+  if (taskgroup->children != child_task)
-+    return;
-+  if (child_task->next_taskgroup != child_task)
-+    taskgroup->children = child_task->next_taskgroup;
-+  else
-+    {
-+      taskgroup->children = NULL;
-+      if (taskgroup->in_taskgroup_wait)
-+	{
-+	  taskgroup->in_taskgroup_wait = false;
-+	  gomp_sem_post (&taskgroup->taskgroup_sem);
-+	}
-+    }
-+}
-+
- void
- gomp_barrier_handle_tasks (gomp_barrier_state_t state)
- {
-@@ -202,6 +678,7 @@ gomp_barrier_handle_tasks (gomp_barrier_
-   struct gomp_task *task = thr->task;
-   struct gomp_task *child_task = NULL;
-   struct gomp_task *to_free = NULL;
-+  int do_wake = 0;
- 
-   gomp_mutex_lock (&team->task_lock);
-   if (gomp_barrier_last_thread (state))
-@@ -218,26 +695,31 @@ gomp_barrier_handle_tasks (gomp_barrier_
- 
-   while (1)
-     {
-+      bool cancelled = false;
-       if (team->task_queue != NULL)
- 	{
--	  struct gomp_task *parent;
--
- 	  child_task = team->task_queue;
--	  parent = child_task->parent;
--	  if (parent && parent->children == child_task)
--	    parent->children = child_task->next_child;
--	  child_task->prev_queue->next_queue = child_task->next_queue;
--	  child_task->next_queue->prev_queue = child_task->prev_queue;
--	  if (child_task->next_queue != child_task)
--	    team->task_queue = child_task->next_queue;
--	  else
--	    team->task_queue = NULL;
--	  child_task->kind = GOMP_TASK_TIED;
-+	  cancelled = gomp_task_run_pre (child_task, child_task->parent,
-+					 child_task->taskgroup, team);
-+	  if (__builtin_expect (cancelled, 0))
-+	    {
-+	      if (to_free)
-+		{
-+		  gomp_finish_task (to_free);
-+		  free (to_free);
-+		  to_free = NULL;
-+		}
-+	      goto finish_cancelled;
-+	    }
- 	  team->task_running_count++;
--	  if (team->task_count == team->task_running_count)
--	    gomp_team_barrier_clear_task_pending (&team->barrier);
-+	  child_task->in_tied_task = true;
- 	}
-       gomp_mutex_unlock (&team->task_lock);
-+      if (do_wake)
-+	{
-+	  gomp_team_barrier_wake (&team->barrier, do_wake);
-+	  do_wake = 0;
-+	}
-       if (to_free)
- 	{
- 	  gomp_finish_task (to_free);
-@@ -255,33 +737,22 @@ gomp_barrier_handle_tasks (gomp_barrier_
-       gomp_mutex_lock (&team->task_lock);
-       if (child_task)
- 	{
--	  struct gomp_task *parent = child_task->parent;
--	  if (parent)
--	    {
--	      child_task->prev_child->next_child = child_task->next_child;
--	      child_task->next_child->prev_child = child_task->prev_child;
--	      if (parent->children == child_task)
--		{
--		  if (child_task->next_child != child_task)
--		    parent->children = child_task->next_child;
--		  else
--		    {
--		      /* We access task->children in GOMP_taskwait
--			 outside of the task lock mutex region, so
--			 need a release barrier here to ensure memory
--			 written by child_task->fn above is flushed
--			 before the NULL is written.  */
--		      __atomic_store_n (&parent->children, NULL,
--					MEMMODEL_RELEASE);
--		      if (parent->in_taskwait)
--			gomp_sem_post (&parent->taskwait_sem);
--		    }
--		}
--	    }
-+	 finish_cancelled:;
-+	  size_t new_tasks
-+	    = gomp_task_run_post_handle_depend (child_task, team);
-+	  gomp_task_run_post_remove_parent (child_task);
- 	  gomp_clear_parent (child_task->children);
-+	  gomp_task_run_post_remove_taskgroup (child_task);
- 	  to_free = child_task;
- 	  child_task = NULL;
--	  team->task_running_count--;
-+	  if (!cancelled)
-+	    team->task_running_count--;
-+	  if (new_tasks > 1)
-+	    {
-+	      do_wake = team->nthreads - team->task_running_count;
-+	      if (do_wake > new_tasks)
-+		do_wake = new_tasks;
-+	    }
- 	  if (--team->task_count == 0
- 	      && gomp_team_barrier_waiting_for_tasks (&team->barrier))
- 	    {
-@@ -304,9 +775,11 @@ GOMP_taskwait (void)
-   struct gomp_task *task = thr->task;
-   struct gomp_task *child_task = NULL;
-   struct gomp_task *to_free = NULL;
-+  struct gomp_taskwait taskwait;
-+  int do_wake = 0;
- 
-   /* The acquire barrier on load of task->children here synchronizes
--     with the write of a NULL in gomp_barrier_handle_tasks.  It is
-+     with the write of a NULL in gomp_task_run_post_remove_parent.  It is
-      not necessary that we synchronize with other non-NULL writes at
-      this point, but we must ensure that all writes to memory by a
-      child thread task work function are seen before we exit from
-@@ -315,42 +788,60 @@ GOMP_taskwait (void)
-       || __atomic_load_n (&task->children, MEMMODEL_ACQUIRE) == NULL)
-     return;
- 
-+  memset (&taskwait, 0, sizeof (taskwait));
-   gomp_mutex_lock (&team->task_lock);
-   while (1)
-     {
-+      bool cancelled = false;
-       if (task->children == NULL)
- 	{
-+	  bool destroy_taskwait = task->taskwait != NULL;
-+	  task->taskwait = NULL;
- 	  gomp_mutex_unlock (&team->task_lock);
- 	  if (to_free)
- 	    {
- 	      gomp_finish_task (to_free);
- 	      free (to_free);
- 	    }
-+	  if (destroy_taskwait)
-+	    gomp_sem_destroy (&taskwait.taskwait_sem);
- 	  return;
- 	}
-       if (task->children->kind == GOMP_TASK_WAITING)
- 	{
- 	  child_task = task->children;
--	  task->children = child_task->next_child;
--	  child_task->prev_queue->next_queue = child_task->next_queue;
--	  child_task->next_queue->prev_queue = child_task->prev_queue;
--	  if (team->task_queue == child_task)
-+	  cancelled
-+	    = gomp_task_run_pre (child_task, task, child_task->taskgroup,
-+				 team);
-+	  if (__builtin_expect (cancelled, 0))
- 	    {
--	      if (child_task->next_queue != child_task)
--		team->task_queue = child_task->next_queue;
--	      else
--		team->task_queue = NULL;
-+	      if (to_free)
-+		{
-+		  gomp_finish_task (to_free);
-+		  free (to_free);
-+		  to_free = NULL;
-+		}
-+	      goto finish_cancelled;
- 	    }
--	  child_task->kind = GOMP_TASK_TIED;
--	  team->task_running_count++;
--	  if (team->task_count == team->task_running_count)
--	    gomp_team_barrier_clear_task_pending (&team->barrier);
- 	}
-       else
--	/* All tasks we are waiting for are already running
--	   in other threads.  Wait for them.  */
--	task->in_taskwait = true;
-+	{
-+	  /* All tasks we are waiting for are already running
-+	     in other threads.  Wait for them.  */
-+	  if (task->taskwait == NULL)
-+	    {
-+	      taskwait.in_depend_wait = false;
-+	      gomp_sem_init (&taskwait.taskwait_sem, 0);
-+	      task->taskwait = &taskwait;
-+	    }
-+	  taskwait.in_taskwait = true;
-+	}
-       gomp_mutex_unlock (&team->task_lock);
-+      if (do_wake)
-+	{
-+	  gomp_team_barrier_wake (&team->barrier, do_wake);
-+	  do_wake = 0;
-+	}
-       if (to_free)
- 	{
- 	  gomp_finish_task (to_free);
-@@ -364,14 +855,178 @@ GOMP_taskwait (void)
- 	  thr->task = task;
- 	}
-       else
-+	gomp_sem_wait (&taskwait.taskwait_sem);
-+      gomp_mutex_lock (&team->task_lock);
-+      if (child_task)
- 	{
--	  gomp_sem_wait (&task->taskwait_sem);
--	  task->in_taskwait = false;
-+	 finish_cancelled:;
-+	  size_t new_tasks
-+	    = gomp_task_run_post_handle_depend (child_task, team);
-+	  child_task->prev_child->next_child = child_task->next_child;
-+	  child_task->next_child->prev_child = child_task->prev_child;
-+	  if (task->children == child_task)
-+	    {
-+	      if (child_task->next_child != child_task)
-+		task->children = child_task->next_child;
-+	      else
-+		task->children = NULL;
-+	    }
-+	  gomp_clear_parent (child_task->children);
-+	  gomp_task_run_post_remove_taskgroup (child_task);
-+	  to_free = child_task;
-+	  child_task = NULL;
-+	  team->task_count--;
-+	  if (new_tasks > 1)
-+	    {
-+	      do_wake = team->nthreads - team->task_running_count
-+			- !task->in_tied_task;
-+	      if (do_wake > new_tasks)
-+		do_wake = new_tasks;
-+	    }
-+	}
-+    }
-+}
-+
-+/* This is like GOMP_taskwait, but we only wait for tasks that the
-+   upcoming task depends on.  */
-+
-+static void
-+gomp_task_maybe_wait_for_dependencies (void **depend)
-+{
-+  struct gomp_thread *thr = gomp_thread ();
-+  struct gomp_task *task = thr->task;
-+  struct gomp_team *team = thr->ts.team;
-+  struct gomp_task_depend_entry elem, *ent = NULL;
-+  struct gomp_taskwait taskwait;
-+  struct gomp_task *last_parent_depends_on = NULL;
-+  size_t ndepend = (uintptr_t) depend[0];
-+  size_t nout = (uintptr_t) depend[1];
-+  size_t i;
-+  size_t num_awaited = 0;
-+  struct gomp_task *child_task = NULL;
-+  struct gomp_task *to_free = NULL;
-+  int do_wake = 0;
-+
-+  gomp_mutex_lock (&team->task_lock);
-+  for (i = 0; i < ndepend; i++)
-+    {
-+      elem.addr = depend[i + 2];
-+      ent = htab_find (task->depend_hash, &elem);
-+      for (; ent; ent = ent->next)
-+	if (i >= nout && ent->is_in)
-+	  continue;
-+	else
-+	  {
-+	    struct gomp_task *tsk = ent->task;
-+	    if (!tsk->parent_depends_on)
-+	      {
-+		tsk->parent_depends_on = true;
-+		++num_awaited;
-+		if (tsk->num_dependees == 0 && tsk->kind == GOMP_TASK_WAITING)
-+		  {
-+		    /* If a task we need to wait for is not already
-+		       running and is ready to be scheduled, move it
-+		       to front, so that we run it as soon as possible.  */
-+		    if (last_parent_depends_on)
-+		      {
-+			tsk->prev_child->next_child = tsk->next_child;
-+			tsk->next_child->prev_child = tsk->prev_child;
-+			tsk->prev_child = last_parent_depends_on;
-+			tsk->next_child = last_parent_depends_on->next_child;
-+			tsk->prev_child->next_child = tsk;
-+			tsk->next_child->prev_child = tsk;
-+		      }
-+		    else if (tsk != task->children)
-+		      {
-+			tsk->prev_child->next_child = tsk->next_child;
-+			tsk->next_child->prev_child = tsk->prev_child;
-+			tsk->prev_child = task->children;
-+			tsk->next_child = task->children->next_child;
-+			task->children = tsk;
-+			tsk->prev_child->next_child = tsk;
-+			tsk->next_child->prev_child = tsk;
-+		      }
-+		    last_parent_depends_on = tsk;
-+		  }
-+	      }
-+	  }
-+    }
-+  if (num_awaited == 0)
-+    {
-+      gomp_mutex_unlock (&team->task_lock);
-+      return;
-+    }
-+
-+  memset (&taskwait, 0, sizeof (taskwait));
-+  taskwait.n_depend = num_awaited;
-+  taskwait.last_parent_depends_on = last_parent_depends_on;
-+  gomp_sem_init (&taskwait.taskwait_sem, 0);
-+  task->taskwait = &taskwait;
-+
-+  while (1)
-+    {
-+      bool cancelled = false;
-+      if (taskwait.n_depend == 0)
-+	{
-+	  task->taskwait = NULL;
-+	  gomp_mutex_unlock (&team->task_lock);
-+	  if (to_free)
-+	    {
-+	      gomp_finish_task (to_free);
-+	      free (to_free);
-+	    }
-+	  gomp_sem_destroy (&taskwait.taskwait_sem);
- 	  return;
- 	}
-+      if (task->children->kind == GOMP_TASK_WAITING)
-+	{
-+	  child_task = task->children;
-+	  cancelled
-+	    = gomp_task_run_pre (child_task, task, child_task->taskgroup,
-+				 team);
-+	  if (__builtin_expect (cancelled, 0))
-+	    {
-+	      if (to_free)
-+		{
-+		  gomp_finish_task (to_free);
-+		  free (to_free);
-+		  to_free = NULL;
-+		}
-+	      goto finish_cancelled;
-+	    }
-+	}
-+      else
-+	/* All tasks we are waiting for are already running
-+	   in other threads.  Wait for them.  */
-+	taskwait.in_depend_wait = true;
-+      gomp_mutex_unlock (&team->task_lock);
-+      if (do_wake)
-+	{
-+	  gomp_team_barrier_wake (&team->barrier, do_wake);
-+	  do_wake = 0;
-+	}
-+      if (to_free)
-+	{
-+	  gomp_finish_task (to_free);
-+	  free (to_free);
-+	  to_free = NULL;
-+	}
-+      if (child_task)
-+	{
-+	  thr->task = child_task;
-+	  child_task->fn (child_task->fn_data);
-+	  thr->task = task;
-+	}
-+      else
-+	gomp_sem_wait (&taskwait.taskwait_sem);
-       gomp_mutex_lock (&team->task_lock);
-       if (child_task)
- 	{
-+	 finish_cancelled:;
-+	  size_t new_tasks
-+	    = gomp_task_run_post_handle_depend (child_task, team);
-+	  if (child_task->parent_depends_on)
-+	    --taskwait.n_depend;
- 	  child_task->prev_child->next_child = child_task->next_child;
- 	  child_task->next_child->prev_child = child_task->prev_child;
- 	  if (task->children == child_task)
-@@ -382,10 +1037,17 @@ GOMP_taskwait (void)
- 		task->children = NULL;
- 	    }
- 	  gomp_clear_parent (child_task->children);
-+	  gomp_task_run_post_remove_taskgroup (child_task);
- 	  to_free = child_task;
- 	  child_task = NULL;
- 	  team->task_count--;
--	  team->task_running_count--;
-+	  if (new_tasks > 1)
-+	    {
-+	      do_wake = team->nthreads - team->task_running_count
-+			- !task->in_tied_task;
-+	      if (do_wake > new_tasks)
-+		do_wake = new_tasks;
-+	    }
- 	}
-     }
- }
-@@ -398,6 +1060,151 @@ GOMP_taskyield (void)
-   /* Nothing at the moment.  */
- }
- 
-+void
-+GOMP_taskgroup_start (void)
-+{
-+  struct gomp_thread *thr = gomp_thread ();
-+  struct gomp_team *team = thr->ts.team;
-+  struct gomp_task *task = thr->task;
-+  struct gomp_taskgroup *taskgroup;
-+
-+  /* If team is NULL, all tasks are executed as
-+     GOMP_TASK_IFFALSE tasks and thus all children tasks of
-+     taskgroup and their descendant tasks will be finished
-+     by the time GOMP_taskgroup_end is called.  */
-+  if (team == NULL)
-+    return;
-+  taskgroup = gomp_malloc (sizeof (struct gomp_taskgroup));
-+  taskgroup->prev = task->taskgroup;
-+  taskgroup->children = NULL;
-+  taskgroup->in_taskgroup_wait = false;
-+  taskgroup->cancelled = false;
-+  taskgroup->num_children = 0;
-+  gomp_sem_init (&taskgroup->taskgroup_sem, 0);
-+  task->taskgroup = taskgroup;
-+}
-+
-+void
-+GOMP_taskgroup_end (void)
-+{
-+  struct gomp_thread *thr = gomp_thread ();
-+  struct gomp_team *team = thr->ts.team;
-+  struct gomp_task *task = thr->task;
-+  struct gomp_taskgroup *taskgroup;
-+  struct gomp_task *child_task = NULL;
-+  struct gomp_task *to_free = NULL;
-+  int do_wake = 0;
-+
-+  if (team == NULL)
-+    return;
-+  taskgroup = task->taskgroup;
-+
-+  /* The acquire barrier on load of taskgroup->num_children here
-+     synchronizes with the write of 0 in gomp_task_run_post_remove_taskgroup.
-+     It is not necessary that we synchronize with other non-0 writes at
-+     this point, but we must ensure that all writes to memory by a
-+     child thread task work function are seen before we exit from
-+     GOMP_taskgroup_end.  */
-+  if (__atomic_load_n (&taskgroup->num_children, MEMMODEL_ACQUIRE) == 0)
-+    goto finish;
-+
-+  gomp_mutex_lock (&team->task_lock);
-+  while (1)
-+    {
-+      bool cancelled = false;
-+      if (taskgroup->children == NULL)
-+	{
-+	  if (taskgroup->num_children)
-+	    {
-+	      if (task->children == NULL)
-+		goto do_wait;
-+	      child_task = task->children;
-+            }
-+          else
-+	    {
-+	      gomp_mutex_unlock (&team->task_lock);
-+	      if (to_free)
-+		{
-+		  gomp_finish_task (to_free);
-+		  free (to_free);
-+		}
-+	      goto finish;
-+	    }
-+	}
-+      else
-+	child_task = taskgroup->children;
-+      if (child_task->kind == GOMP_TASK_WAITING)
-+	{
-+	  cancelled
-+	    = gomp_task_run_pre (child_task, child_task->parent, taskgroup,
-+				 team);
-+	  if (__builtin_expect (cancelled, 0))
-+	    {
-+	      if (to_free)
-+		{
-+		  gomp_finish_task (to_free);
-+		  free (to_free);
-+		  to_free = NULL;
-+		}
-+	      goto finish_cancelled;
-+	    }
-+	}
-+      else
-+	{
-+	  child_task = NULL;
-+	 do_wait:
-+	  /* All tasks we are waiting for are already running
-+	     in other threads.  Wait for them.  */
-+	  taskgroup->in_taskgroup_wait = true;
-+	}
-+      gomp_mutex_unlock (&team->task_lock);
-+      if (do_wake)
-+	{
-+	  gomp_team_barrier_wake (&team->barrier, do_wake);
-+	  do_wake = 0;
-+	}
-+      if (to_free)
-+	{
-+	  gomp_finish_task (to_free);
-+	  free (to_free);
-+	  to_free = NULL;
-+	}
-+      if (child_task)
-+	{
-+	  thr->task = child_task;
-+	  child_task->fn (child_task->fn_data);
-+	  thr->task = task;
-+	}
-+      else
-+	gomp_sem_wait (&taskgroup->taskgroup_sem);
-+      gomp_mutex_lock (&team->task_lock);
-+      if (child_task)
-+	{
-+	 finish_cancelled:;
-+	  size_t new_tasks
-+	    = gomp_task_run_post_handle_depend (child_task, team);
-+	  gomp_task_run_post_remove_parent (child_task);
-+	  gomp_clear_parent (child_task->children);
-+	  gomp_task_run_post_remove_taskgroup (child_task);
-+	  to_free = child_task;
-+	  child_task = NULL;
-+	  team->task_count--;
-+	  if (new_tasks > 1)
-+	    {
-+	      do_wake = team->nthreads - team->task_running_count
-+			- !task->in_tied_task;
-+	      if (do_wake > new_tasks)
-+		do_wake = new_tasks;
-+	    }
-+	}
-+    }
-+
-+ finish:
-+  task->taskgroup = taskgroup->prev;
-+  gomp_sem_destroy (&taskgroup->taskgroup_sem);
-+  free (taskgroup);
-+}
-+
- int
- omp_in_final (void)
- {
---- libgomp/testsuite/libgomp.fortran/lib3.f	(revision 210461)
-+++ libgomp/testsuite/libgomp.fortran/lib3.f	(revision 210462)
-@@ -66,6 +66,7 @@ C$OMP END PARALLEL
- C$OMP PARALLEL REDUCTION (.OR.:L) IF (.TRUE.)
-       L = .NOT. OMP_IN_PARALLEL ()
- C$OMP END PARALLEL
-+      IF (L) CALL ABORT
- 
-       E = OMP_GET_WTIME ()
-       IF (D .GT. E) CALL ABORT
---- libgomp/testsuite/libgomp.fortran/lib1.f90	(revision 210461)
-+++ libgomp/testsuite/libgomp.fortran/lib1.f90	(revision 210462)
-@@ -66,6 +66,7 @@
- !$omp parallel reduction (.or.:l) if (.true.)
-   l = .not. omp_in_parallel ()
- !$omp end parallel
-+  if (l) call abort
- 
-   e = omp_get_wtime ()
-   if (d .gt. e) call abort
---- libgomp/testsuite/libgomp.fortran/lib2.f	(revision 210461)
-+++ libgomp/testsuite/libgomp.fortran/lib2.f	(revision 210462)
-@@ -66,6 +66,7 @@ C$OMP END PARALLEL
- C$OMP PARALLEL REDUCTION (.OR.:L) IF (.TRUE.)
-       L = .NOT. OMP_IN_PARALLEL ()
- C$OMP END PARALLEL
-+      IF (L) CALL ABORT
- 
-       E = OMP_GET_WTIME ()
-       IF (D .GT. E) CALL ABORT
---- libgomp/testsuite/libgomp.c/atomic-14.c	(revision 210461)
-+++ libgomp/testsuite/libgomp.c/atomic-14.c	(revision 210462)
-@@ -16,7 +16,7 @@ main ()
-   #pragma omp atomic update
-     x = x + 7;
-   #pragma omp atomic
--    x = x + 7 + 6;
-+    x = x + (7 + 6);
-   #pragma omp atomic update
-     x = x + 2 * 3;
-   #pragma omp atomic
-@@ -65,7 +65,7 @@ main ()
-   if (v != -8)
-     abort ();
-   #pragma omp atomic
--    x = x * -4 / 2;
-+    x = x * (-4 / 2);
-   #pragma omp atomic read
-     v = x;
-   if (v != 16)
---- libgomp/testsuite/libgomp.c/lib-1.c	(revision 210461)
-+++ libgomp/testsuite/libgomp.c/lib-1.c	(revision 210462)
-@@ -85,6 +85,8 @@ main (void)
-   l = ! omp_in_parallel ();
- #pragma omp parallel reduction (|:l) if (1)
-   l = ! omp_in_parallel ();
-+  if (l)
-+    abort ();
- 
-   e = omp_get_wtime ();
-   if (d > e)
---- libgomp/loop.c	(revision 210461)
-+++ libgomp/loop.c	(revision 210462)
-@@ -439,14 +439,14 @@ static void
- gomp_parallel_loop_start (void (*fn) (void *), void *data,
- 			  unsigned num_threads, long start, long end,
- 			  long incr, enum gomp_schedule_type sched,
--			  long chunk_size)
-+			  long chunk_size, unsigned int flags)
- {
-   struct gomp_team *team;
- 
-   num_threads = gomp_resolve_num_threads (num_threads, 0);
-   team = gomp_new_team (num_threads);
-   gomp_loop_init (&team->work_shares[0], start, end, incr, sched, chunk_size);
--  gomp_team_start (fn, data, num_threads, team);
-+  gomp_team_start (fn, data, num_threads, flags, team);
- }
- 
- void
-@@ -455,7 +455,7 @@ GOMP_parallel_loop_static_start (void (*
- 				 long incr, long chunk_size)
- {
-   gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
--			    GFS_STATIC, chunk_size);
-+			    GFS_STATIC, chunk_size, 0);
- }
- 
- void
-@@ -464,7 +464,7 @@ GOMP_parallel_loop_dynamic_start (void (
- 				  long incr, long chunk_size)
- {
-   gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
--			    GFS_DYNAMIC, chunk_size);
-+			    GFS_DYNAMIC, chunk_size, 0);
- }
- 
- void
-@@ -473,7 +473,7 @@ GOMP_parallel_loop_guided_start (void (*
- 				 long incr, long chunk_size)
- {
-   gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
--			    GFS_GUIDED, chunk_size);
-+			    GFS_GUIDED, chunk_size, 0);
- }
- 
- void
-@@ -483,11 +483,59 @@ GOMP_parallel_loop_runtime_start (void (
- {
-   struct gomp_task_icv *icv = gomp_icv (false);
-   gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
--			    icv->run_sched_var, icv->run_sched_modifier);
-+			    icv->run_sched_var, icv->run_sched_modifier, 0);
-+}
-+
-+ialias_redirect (GOMP_parallel_end)
-+
-+void
-+GOMP_parallel_loop_static (void (*fn) (void *), void *data,
-+			   unsigned num_threads, long start, long end,
-+			   long incr, long chunk_size, unsigned flags)
-+{
-+  gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
-+			    GFS_STATIC, chunk_size, flags);
-+  fn (data);
-+  GOMP_parallel_end ();
-+}
-+
-+void
-+GOMP_parallel_loop_dynamic (void (*fn) (void *), void *data,
-+			    unsigned num_threads, long start, long end,
-+			    long incr, long chunk_size, unsigned flags)
-+{
-+  gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
-+			    GFS_DYNAMIC, chunk_size, flags);
-+  fn (data);
-+  GOMP_parallel_end ();
-+}
-+
-+void
-+GOMP_parallel_loop_guided (void (*fn) (void *), void *data,
-+			  unsigned num_threads, long start, long end,
-+			  long incr, long chunk_size, unsigned flags)
-+{
-+  gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
-+			    GFS_GUIDED, chunk_size, flags);
-+  fn (data);
-+  GOMP_parallel_end ();
-+}
-+
-+void
-+GOMP_parallel_loop_runtime (void (*fn) (void *), void *data,
-+			    unsigned num_threads, long start, long end,
-+			    long incr, unsigned flags)
-+{
-+  struct gomp_task_icv *icv = gomp_icv (false);
-+  gomp_parallel_loop_start (fn, data, num_threads, start, end, incr,
-+			    icv->run_sched_var, icv->run_sched_modifier,
-+			    flags);
-+  fn (data);
-+  GOMP_parallel_end ();
- }
- 
- /* The GOMP_loop_end* routines are called after the thread is told that
--   all loop iterations are complete.  This first version synchronizes
-+   all loop iterations are complete.  The first two versions synchronize
-    all threads; the nowait version does not.  */
- 
- void
-@@ -496,6 +544,12 @@ GOMP_loop_end (void)
-   gomp_work_share_end ();
- }
- 
-+bool
-+GOMP_loop_end_cancel (void)
-+{
-+  return gomp_work_share_end_cancel ();
-+}
-+
- void
- GOMP_loop_end_nowait (void)
- {
---- libgomp/hashtab.h	(revision 0)
-+++ libgomp/hashtab.h	(revision 210462)
-@@ -0,0 +1,443 @@
-+/* An expandable hash tables datatype.
-+   Copyright (C) 1999-2013
-+   Free Software Foundation, Inc.
-+   Contributed by Vladimir Makarov <vmakarov@cygnus.com>.
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2 of the License, or
-+(at your option) any later version.
-+
-+This program is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+GNU General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with this program; if not, write to the Free Software
-+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
-+
-+/* The hash table code copied from include/hashtab.[hc] and adjusted,
-+   so that the hash table entries are in the flexible array at the end
-+   of the control structure, no callbacks are used and the elements in the
-+   table are of the hash_entry_type type.
-+   Before including this file, define hash_entry_type type and
-+   htab_alloc and htab_free functions.  After including it, define
-+   htab_hash and htab_eq inline functions.   */
-+
-+/* This package implements basic hash table functionality.  It is possible
-+   to search for an entry, create an entry and destroy an entry.
-+
-+   Elements in the table are generic pointers.
-+
-+   The size of the table is not fixed; if the occupancy of the table
-+   grows too high the hash table will be expanded.
-+
-+   The abstract data implementation is based on generalized Algorithm D
-+   from Knuth's book "The art of computer programming".  Hash table is
-+   expanded by creation of new hash table and transferring elements from
-+   the old table to the new table.  */
-+
-+/* The type for a hash code.  */
-+typedef unsigned int hashval_t;
-+
-+static inline hashval_t htab_hash (hash_entry_type);
-+static inline bool htab_eq (hash_entry_type, hash_entry_type);
-+
-+/* This macro defines reserved value for empty table entry.  */
-+
-+#define HTAB_EMPTY_ENTRY    ((hash_entry_type) 0)
-+
-+/* This macro defines reserved value for table entry which contained
-+   a deleted element. */
-+
-+#define HTAB_DELETED_ENTRY  ((hash_entry_type) 1)
-+
-+/* Hash tables are of the following type.  The structure
-+   (implementation) of this type is not needed for using the hash
-+   tables.  All work with hash table should be executed only through
-+   functions mentioned below.  The size of this structure is subject to
-+   change.  */
-+
-+struct htab {
-+  /* Current size (in entries) of the hash table.  */
-+  size_t size;
-+
-+  /* Current number of elements including also deleted elements.  */
-+  size_t n_elements;
-+
-+  /* Current number of deleted elements in the table.  */
-+  size_t n_deleted;
-+
-+  /* Current size (in entries) of the hash table, as an index into the
-+     table of primes.  */
-+  unsigned int size_prime_index;
-+
-+  /* Table itself.  */
-+  hash_entry_type entries[];
-+};
-+
-+typedef struct htab *htab_t;
-+
-+/* An enum saying whether we insert into the hash table or not.  */
-+enum insert_option {NO_INSERT, INSERT};
-+
-+/* Table of primes and multiplicative inverses.
-+
-+   Note that these are not minimally reduced inverses.  Unlike when generating
-+   code to divide by a constant, we want to be able to use the same algorithm
-+   all the time.  All of these inverses (are implied to) have bit 32 set.
-+
-+   For the record, the function that computed the table is in
-+   libiberty/hashtab.c.  */
-+
-+struct prime_ent
-+{
-+  hashval_t prime;
-+  hashval_t inv;
-+  hashval_t inv_m2;	/* inverse of prime-2 */
-+  hashval_t shift;
-+};
-+
-+static struct prime_ent const prime_tab[] = {
-+  {          7, 0x24924925, 0x9999999b, 2 },
-+  {         13, 0x3b13b13c, 0x745d1747, 3 },
-+  {         31, 0x08421085, 0x1a7b9612, 4 },
-+  {         61, 0x0c9714fc, 0x15b1e5f8, 5 },
-+  {        127, 0x02040811, 0x0624dd30, 6 },
-+  {        251, 0x05197f7e, 0x073260a5, 7 },
-+  {        509, 0x01824366, 0x02864fc8, 8 },
-+  {       1021, 0x00c0906d, 0x014191f7, 9 },
-+  {       2039, 0x0121456f, 0x0161e69e, 10 },
-+  {       4093, 0x00300902, 0x00501908, 11 },
-+  {       8191, 0x00080041, 0x00180241, 12 },
-+  {      16381, 0x000c0091, 0x00140191, 13 },
-+  {      32749, 0x002605a5, 0x002a06e6, 14 },
-+  {      65521, 0x000f00e2, 0x00110122, 15 },
-+  {     131071, 0x00008001, 0x00018003, 16 },
-+  {     262139, 0x00014002, 0x0001c004, 17 },
-+  {     524287, 0x00002001, 0x00006001, 18 },
-+  {    1048573, 0x00003001, 0x00005001, 19 },
-+  {    2097143, 0x00004801, 0x00005801, 20 },
-+  {    4194301, 0x00000c01, 0x00001401, 21 },
-+  {    8388593, 0x00001e01, 0x00002201, 22 },
-+  {   16777213, 0x00000301, 0x00000501, 23 },
-+  {   33554393, 0x00001381, 0x00001481, 24 },
-+  {   67108859, 0x00000141, 0x000001c1, 25 },
-+  {  134217689, 0x000004e1, 0x00000521, 26 },
-+  {  268435399, 0x00000391, 0x000003b1, 27 },
-+  {  536870909, 0x00000019, 0x00000029, 28 },
-+  { 1073741789, 0x0000008d, 0x00000095, 29 },
-+  { 2147483647, 0x00000003, 0x00000007, 30 },
-+  /* Avoid "decimal constant so large it is unsigned" for 4294967291.  */
-+  { 0xfffffffb, 0x00000006, 0x00000008, 31 }
-+};
-+
-+/* The following function returns an index into the above table of the
-+   nearest prime number which is greater than N, and near a power of two. */
-+
-+static unsigned int
-+higher_prime_index (unsigned long n)
-+{
-+  unsigned int low = 0;
-+  unsigned int high = sizeof(prime_tab) / sizeof(prime_tab[0]);
-+
-+  while (low != high)
-+    {
-+      unsigned int mid = low + (high - low) / 2;
-+      if (n > prime_tab[mid].prime)
-+	low = mid + 1;
-+      else
-+	high = mid;
-+    }
-+
-+  /* If we've run out of primes, abort.  */
-+  if (n > prime_tab[low].prime)
-+    abort ();
-+
-+  return low;
-+}
-+
-+/* Return the current size of given hash table.  */
-+
-+static inline size_t
-+htab_size (htab_t htab)
-+{
-+  return htab->size;
-+}
-+
-+/* Return the current number of elements in given hash table. */
-+
-+static inline size_t
-+htab_elements (htab_t htab)
-+{
-+  return htab->n_elements - htab->n_deleted;
-+}
-+
-+/* Return X % Y.  */
-+
-+static inline hashval_t
-+htab_mod_1 (hashval_t x, hashval_t y, hashval_t inv, int shift)
-+{
-+  /* The multiplicative inverses computed above are for 32-bit types, and
-+     requires that we be able to compute a highpart multiply.  */
-+  if (sizeof (hashval_t) * __CHAR_BIT__ <= 32)
-+    {
-+      hashval_t t1, t2, t3, t4, q, r;
-+
-+      t1 = ((unsigned long long)x * inv) >> 32;
-+      t2 = x - t1;
-+      t3 = t2 >> 1;
-+      t4 = t1 + t3;
-+      q  = t4 >> shift;
-+      r  = x - (q * y);
-+
-+      return r;
-+    }
-+
-+  /* Otherwise just use the native division routines.  */
-+  return x % y;
-+}
-+
-+/* Compute the primary hash for HASH given HTAB's current size.  */
-+
-+static inline hashval_t
-+htab_mod (hashval_t hash, htab_t htab)
-+{
-+  const struct prime_ent *p = &prime_tab[htab->size_prime_index];
-+  return htab_mod_1 (hash, p->prime, p->inv, p->shift);
-+}
-+
-+/* Compute the secondary hash for HASH given HTAB's current size.  */
-+
-+static inline hashval_t
-+htab_mod_m2 (hashval_t hash, htab_t htab)
-+{
-+  const struct prime_ent *p = &prime_tab[htab->size_prime_index];
-+  return 1 + htab_mod_1 (hash, p->prime - 2, p->inv_m2, p->shift);
-+}
-+
-+/* Create hash table of size SIZE.  */
-+
-+static htab_t
-+htab_create (size_t size)
-+{
-+  htab_t result;
-+  unsigned int size_prime_index;
-+
-+  size_prime_index = higher_prime_index (size);
-+  size = prime_tab[size_prime_index].prime;
-+
-+  result = (htab_t) htab_alloc (sizeof (struct htab)
-+				+ size * sizeof (hash_entry_type));
-+  result->size = size;
-+  result->n_elements = 0;
-+  result->n_deleted = 0;
-+  result->size_prime_index = size_prime_index;
-+  memset (result->entries, 0, size * sizeof (hash_entry_type));
-+  return result;
-+}
-+
-+/* Similar to htab_find_slot, but without several unwanted side effects:
-+    - Does not call htab_eq when it finds an existing entry.
-+    - Does not change the count of elements in the hash table.
-+   This function also assumes there are no deleted entries in the table.
-+   HASH is the hash value for the element to be inserted.  */
-+
-+static hash_entry_type *
-+find_empty_slot_for_expand (htab_t htab, hashval_t hash)
-+{
-+  hashval_t index = htab_mod (hash, htab);
-+  size_t size = htab_size (htab);
-+  hash_entry_type *slot = htab->entries + index;
-+  hashval_t hash2;
-+
-+  if (*slot == HTAB_EMPTY_ENTRY)
-+    return slot;
-+  else if (*slot == HTAB_DELETED_ENTRY)
-+    abort ();
-+
-+  hash2 = htab_mod_m2 (hash, htab);
-+  for (;;)
-+    {
-+      index += hash2;
-+      if (index >= size)
-+	index -= size;
-+
-+      slot = htab->entries + index;
-+      if (*slot == HTAB_EMPTY_ENTRY)
-+	return slot;
-+      else if (*slot == HTAB_DELETED_ENTRY)
-+	abort ();
-+    }
-+}
-+
-+/* The following function changes size of memory allocated for the
-+   entries and repeatedly inserts the table elements.  The occupancy
-+   of the table after the call will be about 50%.  Naturally the hash
-+   table must already exist.  Remember also that the place of the
-+   table entries is changed.  */
-+
-+static htab_t
-+htab_expand (htab_t htab)
-+{
-+  htab_t nhtab;
-+  hash_entry_type *olimit;
-+  hash_entry_type *p;
-+  size_t osize, elts;
-+
-+  osize = htab->size;
-+  olimit = htab->entries + osize;
-+  elts = htab_elements (htab);
-+
-+  /* Resize only when table after removal of unused elements is either
-+     too full or too empty.  */
-+  if (elts * 2 > osize || (elts * 8 < osize && osize > 32))
-+    nhtab = htab_create (elts * 2);
-+  else
-+    nhtab = htab_create (osize - 1);
-+  nhtab->n_elements = htab->n_elements - htab->n_deleted;
-+
-+  p = htab->entries;
-+  do
-+    {
-+      hash_entry_type x = *p;
-+
-+      if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
-+	*find_empty_slot_for_expand (nhtab, htab_hash (x)) = x;
-+
-+      p++;
-+    }
-+  while (p < olimit);
-+
-+  htab_free (htab);
-+  return nhtab;
-+}
-+
-+/* This function searches for a hash table entry equal to the given
-+   element.  It cannot be used to insert or delete an element.  */
-+
-+static hash_entry_type
-+htab_find (htab_t htab, const hash_entry_type element)
-+{
-+  hashval_t index, hash2, hash = htab_hash (element);
-+  size_t size;
-+  hash_entry_type entry;
-+
-+  size = htab_size (htab);
-+  index = htab_mod (hash, htab);
-+
-+  entry = htab->entries[index];
-+  if (entry == HTAB_EMPTY_ENTRY
-+      || (entry != HTAB_DELETED_ENTRY && htab_eq (entry, element)))
-+    return entry;
-+
-+  hash2 = htab_mod_m2 (hash, htab);
-+  for (;;)
-+    {
-+      index += hash2;
-+      if (index >= size)
-+	index -= size;
-+
-+      entry = htab->entries[index];
-+      if (entry == HTAB_EMPTY_ENTRY
-+	  || (entry != HTAB_DELETED_ENTRY && htab_eq (entry, element)))
-+	return entry;
-+    }
-+}
-+
-+/* This function searches for a hash table slot containing an entry
-+   equal to the given element.  To delete an entry, call this with
-+   insert=NO_INSERT, then call htab_clear_slot on the slot returned
-+   (possibly after doing some checks).  To insert an entry, call this
-+   with insert=INSERT, then write the value you want into the returned
-+   slot.  */
-+
-+static hash_entry_type *
-+htab_find_slot (htab_t *htabp, const hash_entry_type element,
-+		enum insert_option insert)
-+{
-+  hash_entry_type *first_deleted_slot;
-+  hashval_t index, hash2, hash = htab_hash (element);
-+  size_t size;
-+  hash_entry_type entry;
-+  htab_t htab = *htabp;
-+
-+  size = htab_size (htab);
-+  if (insert == INSERT && size * 3 <= htab->n_elements * 4)
-+    {
-+      htab = *htabp = htab_expand (htab);
-+      size = htab_size (htab);
-+    }
-+
-+  index = htab_mod (hash, htab);
-+
-+  first_deleted_slot = NULL;
-+
-+  entry = htab->entries[index];
-+  if (entry == HTAB_EMPTY_ENTRY)
-+    goto empty_entry;
-+  else if (entry == HTAB_DELETED_ENTRY)
-+    first_deleted_slot = &htab->entries[index];
-+  else if (htab_eq (entry, element))
-+    return &htab->entries[index];
-+
-+  hash2 = htab_mod_m2 (hash, htab);
-+  for (;;)
-+    {
-+      index += hash2;
-+      if (index >= size)
-+	index -= size;
-+
-+      entry = htab->entries[index];
-+      if (entry == HTAB_EMPTY_ENTRY)
-+	goto empty_entry;
-+      else if (entry == HTAB_DELETED_ENTRY)
-+	{
-+	  if (!first_deleted_slot)
-+	    first_deleted_slot = &htab->entries[index];
-+	}
-+      else if (htab_eq (entry, element))
-+	return &htab->entries[index];
-+    }
-+
-+ empty_entry:
-+  if (insert == NO_INSERT)
-+    return NULL;
-+
-+  if (first_deleted_slot)
-+    {
-+      htab->n_deleted--;
-+      *first_deleted_slot = HTAB_EMPTY_ENTRY;
-+      return first_deleted_slot;
-+    }
-+
-+  htab->n_elements++;
-+  return &htab->entries[index];
-+}
-+
-+/* This function clears a specified slot in a hash table.  It is
-+   useful when you've already done the lookup and don't want to do it
-+   again.  */
-+
-+static inline void
-+htab_clear_slot (htab_t htab, hash_entry_type *slot)
-+{
-+  if (slot < htab->entries || slot >= htab->entries + htab_size (htab)
-+      || *slot == HTAB_EMPTY_ENTRY || *slot == HTAB_DELETED_ENTRY)
-+    abort ();
-+
-+  *slot = HTAB_DELETED_ENTRY;
-+  htab->n_deleted++;
-+}
-+
-+/* Returns a hash code for pointer P. Simplified version of evahash */
-+
-+static inline hashval_t
-+hash_pointer (const void *p)
-+{
-+  uintptr_t v = (uintptr_t) p;
-+  if (sizeof (v) > sizeof (hashval_t))
-+    v ^= v >> (sizeof (uintptr_t) / 2 * __CHAR_BIT__);
-+  return v;
-+}
---- libgomp/work.c	(revision 210461)
-+++ libgomp/work.c	(revision 210462)
-@@ -221,7 +221,10 @@ gomp_work_share_end (void)
-   if (gomp_barrier_last_thread (bstate))
-     {
-       if (__builtin_expect (thr->ts.last_work_share != NULL, 1))
--	free_work_share (team, thr->ts.last_work_share);
-+	{
-+	  team->work_shares_to_free = thr->ts.work_share;
-+	  free_work_share (team, thr->ts.last_work_share);
-+	}
-     }
- 
-   gomp_team_barrier_wait_end (&team->barrier, bstate);
-@@ -229,6 +232,32 @@ gomp_work_share_end (void)
- }
- 
- /* The current thread is done with its current work sharing construct.
-+   This version implies a cancellable barrier at the end of the work-share.  */
-+
-+bool
-+gomp_work_share_end_cancel (void)
-+{
-+  struct gomp_thread *thr = gomp_thread ();
-+  struct gomp_team *team = thr->ts.team;
-+  gomp_barrier_state_t bstate;
-+
-+  /* Cancellable work sharing constructs cannot be orphaned.  */
-+  bstate = gomp_barrier_wait_cancel_start (&team->barrier);
-+
-+  if (gomp_barrier_last_thread (bstate))
-+    {
-+      if (__builtin_expect (thr->ts.last_work_share != NULL, 1))
-+	{
-+	  team->work_shares_to_free = thr->ts.work_share;
-+	  free_work_share (team, thr->ts.last_work_share);
-+	}
-+    }
-+  thr->ts.last_work_share = NULL;
-+
-+  return gomp_team_barrier_wait_cancel_end (&team->barrier, bstate);
-+}
-+
-+/* The current thread is done with its current work sharing construct.
-    This version does NOT imply a barrier at the end of the work-share.  */
- 
- void
-@@ -259,6 +288,9 @@ gomp_work_share_end_nowait (void)
- #endif
- 
-   if (completed == team->nthreads)
--    free_work_share (team, thr->ts.last_work_share);
-+    {
-+      team->work_shares_to_free = thr->ts.work_share;
-+      free_work_share (team, thr->ts.last_work_share);
-+    }
-   thr->ts.last_work_share = NULL;
- }
---- libgomp/config/linux/proc.c	(revision 210461)
-+++ libgomp/config/linux/proc.c	(revision 210462)
-@@ -30,6 +30,7 @@
- #endif
- #include "libgomp.h"
- #include "proc.h"
-+#include <errno.h>
- #include <stdlib.h>
- #include <unistd.h>
- #ifdef HAVE_GETLOADAVG
-@@ -39,19 +40,28 @@
- #endif
- 
- #ifdef HAVE_PTHREAD_AFFINITY_NP
-+unsigned long gomp_cpuset_size;
-+static unsigned long gomp_get_cpuset_size;
-+cpu_set_t *gomp_cpusetp;
-+
- unsigned long
--gomp_cpuset_popcount (cpu_set_t *cpusetp)
-+gomp_cpuset_popcount (unsigned long cpusetsize, cpu_set_t *cpusetp)
- {
--#ifdef CPU_COUNT
--  /* glibc 2.6 and above provide a macro for this.  */
--  return CPU_COUNT (cpusetp);
-+#ifdef CPU_COUNT_S
-+  /* glibc 2.7 and above provide a macro for this.  */
-+  return CPU_COUNT_S (cpusetsize, cpusetp);
- #else
-+#ifdef CPU_COUNT
-+  if (cpusetsize == sizeof (cpu_set_t))
-+    /* glibc 2.6 and above provide a macro for this.  */
-+    return CPU_COUNT (cpusetp);
-+#endif
-   size_t i;
-   unsigned long ret = 0;
--  extern int check[sizeof (cpusetp->__bits[0]) == sizeof (unsigned long int)];
-+  extern int check[sizeof (cpusetp->__bits[0]) == sizeof (unsigned long int)
-+		   ? 1 : -1] __attribute__((unused));
- 
--  (void) check;
--  for (i = 0; i < sizeof (*cpusetp) / sizeof (cpusetp->__bits[0]); i++)
-+  for (i = 0; i < cpusetsize / sizeof (cpusetp->__bits[0]); i++)
-     {
-       unsigned long int mask = cpusetp->__bits[i];
-       if (mask == 0)
-@@ -70,16 +80,63 @@ void
- gomp_init_num_threads (void)
- {
- #ifdef HAVE_PTHREAD_AFFINITY_NP
--  cpu_set_t cpuset;
-+#if defined (_SC_NPROCESSORS_CONF) && defined (CPU_ALLOC_SIZE)
-+  gomp_cpuset_size = sysconf (_SC_NPROCESSORS_CONF);
-+  gomp_cpuset_size = CPU_ALLOC_SIZE (gomp_cpuset_size);
-+#else
-+  gomp_cpuset_size = sizeof (cpu_set_t);
-+#endif
- 
--  if (pthread_getaffinity_np (pthread_self (), sizeof (cpuset), &cpuset) == 0)
-+  gomp_cpusetp = (cpu_set_t *) gomp_malloc (gomp_cpuset_size);
-+  do
-     {
--      /* Count only the CPUs this process can use.  */
--      gomp_global_icv.nthreads_var = gomp_cpuset_popcount (&cpuset);
--      if (gomp_global_icv.nthreads_var == 0)
--	gomp_global_icv.nthreads_var = 1;
--      return;
-+      int ret = pthread_getaffinity_np (pthread_self (), gomp_cpuset_size,
-+					gomp_cpusetp);
-+      if (ret == 0)
-+	{
-+	  /* Count only the CPUs this process can use.  */
-+	  gomp_global_icv.nthreads_var
-+	    = gomp_cpuset_popcount (gomp_cpuset_size, gomp_cpusetp);
-+	  if (gomp_global_icv.nthreads_var == 0)
-+	    break;
-+	  gomp_get_cpuset_size = gomp_cpuset_size;
-+#ifdef CPU_ALLOC_SIZE
-+	  unsigned long i;
-+	  for (i = gomp_cpuset_size * 8; i; i--)
-+	    if (CPU_ISSET_S (i - 1, gomp_cpuset_size, gomp_cpusetp))
-+	      break;
-+	  gomp_cpuset_size = CPU_ALLOC_SIZE (i);
-+#endif
-+	  return;
-+	}
-+      if (ret != EINVAL)
-+	break;
-+#ifdef CPU_ALLOC_SIZE
-+      if (gomp_cpuset_size < sizeof (cpu_set_t))
-+	gomp_cpuset_size = sizeof (cpu_set_t);
-+      else
-+	gomp_cpuset_size = gomp_cpuset_size * 2;
-+      if (gomp_cpuset_size < 8 * sizeof (cpu_set_t))
-+	gomp_cpusetp
-+	  = (cpu_set_t *) gomp_realloc (gomp_cpusetp, gomp_cpuset_size);
-+      else
-+	{
-+	  /* Avoid gomp_fatal if too large memory allocation would be
-+	     requested, e.g. kernel returning EINVAL all the time.  */
-+	  void *p = realloc (gomp_cpusetp, gomp_cpuset_size);
-+	  if (p == NULL)
-+	    break;
-+	  gomp_cpusetp = (cpu_set_t *) p;
-+	}
-+#else
-+      break;
-+#endif
-     }
-+  while (1);
-+  gomp_cpuset_size = 0;
-+  gomp_global_icv.nthreads_var = 1;
-+  free (gomp_cpusetp);
-+  gomp_cpusetp = NULL;
- #endif
- #ifdef _SC_NPROCESSORS_ONLN
-   gomp_global_icv.nthreads_var = sysconf (_SC_NPROCESSORS_ONLN);
-@@ -90,15 +147,14 @@ static int
- get_num_procs (void)
- {
- #ifdef HAVE_PTHREAD_AFFINITY_NP
--  cpu_set_t cpuset;
--
--  if (gomp_cpu_affinity == NULL)
-+  if (gomp_places_list == NULL)
-     {
-       /* Count only the CPUs this process can use.  */
--      if (pthread_getaffinity_np (pthread_self (), sizeof (cpuset),
--				  &cpuset) == 0)
-+      if (gomp_cpusetp
-+	  && pthread_getaffinity_np (pthread_self (), gomp_get_cpuset_size,
-+				     gomp_cpusetp) == 0)
- 	{
--	  int ret = gomp_cpuset_popcount (&cpuset);
-+	  int ret = gomp_cpuset_popcount (gomp_get_cpuset_size, gomp_cpusetp);
- 	  return ret != 0 ? ret : 1;
- 	}
-     }
---- libgomp/config/linux/bar.c	(revision 210461)
-+++ libgomp/config/linux/bar.c	(revision 210462)
-@@ -33,11 +33,11 @@
- void
- gomp_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state)
- {
--  if (__builtin_expect ((state & 1) != 0, 0))
-+  if (__builtin_expect (state & BAR_WAS_LAST, 0))
-     {
-       /* Next time we'll be awaiting TOTAL threads again.  */
-       bar->awaited = bar->total;
--      __atomic_store_n (&bar->generation, bar->generation + 4,
-+      __atomic_store_n (&bar->generation, bar->generation + BAR_INCR,
- 			MEMMODEL_RELEASE);
-       futex_wake ((int *) &bar->generation, INT_MAX);
-     }
-@@ -66,7 +66,7 @@ void
- gomp_barrier_wait_last (gomp_barrier_t *bar)
- {
-   gomp_barrier_state_t state = gomp_barrier_wait_start (bar);
--  if (state & 1)
-+  if (state & BAR_WAS_LAST)
-     gomp_barrier_wait_end (bar, state);
- }
- 
-@@ -81,40 +81,43 @@ gomp_team_barrier_wait_end (gomp_barrier
- {
-   unsigned int generation, gen;
- 
--  if (__builtin_expect ((state & 1) != 0, 0))
-+  if (__builtin_expect (state & BAR_WAS_LAST, 0))
-     {
-       /* Next time we'll be awaiting TOTAL threads again.  */
-       struct gomp_thread *thr = gomp_thread ();
-       struct gomp_team *team = thr->ts.team;
- 
-       bar->awaited = bar->total;
-+      team->work_share_cancelled = 0;
-       if (__builtin_expect (team->task_count, 0))
- 	{
- 	  gomp_barrier_handle_tasks (state);
--	  state &= ~1;
-+	  state &= ~BAR_WAS_LAST;
- 	}
-       else
- 	{
--	  __atomic_store_n (&bar->generation, state + 3, MEMMODEL_RELEASE);
-+	  state &= ~BAR_CANCELLED;
-+	  state += BAR_INCR - BAR_WAS_LAST;
-+	  __atomic_store_n (&bar->generation, state, MEMMODEL_RELEASE);
- 	  futex_wake ((int *) &bar->generation, INT_MAX);
- 	  return;
- 	}
-     }
- 
-   generation = state;
-+  state &= ~BAR_CANCELLED;
-   do
-     {
-       do_wait ((int *) &bar->generation, generation);
-       gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
--      if (__builtin_expect (gen & 1, 0))
-+      if (__builtin_expect (gen & BAR_TASK_PENDING, 0))
- 	{
- 	  gomp_barrier_handle_tasks (state);
- 	  gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
- 	}
--      if ((gen & 2) != 0)
--	generation |= 2;
-+      generation |= gen & BAR_WAITING_FOR_TASK;
-     }
--  while (gen != state + 4);
-+  while (gen != state + BAR_INCR);
- }
- 
- void
-@@ -122,3 +125,86 @@ gomp_team_barrier_wait (gomp_barrier_t *
- {
-   gomp_team_barrier_wait_end (bar, gomp_barrier_wait_start (bar));
- }
-+
-+void
-+gomp_team_barrier_wait_final (gomp_barrier_t *bar)
-+{
-+  gomp_barrier_state_t state = gomp_barrier_wait_final_start (bar);
-+  if (__builtin_expect (state & BAR_WAS_LAST, 0))
-+    bar->awaited_final = bar->total;
-+  gomp_team_barrier_wait_end (bar, state);
-+}
-+
-+bool
-+gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
-+				   gomp_barrier_state_t state)
-+{
-+  unsigned int generation, gen;
-+
-+  if (__builtin_expect (state & BAR_WAS_LAST, 0))
-+    {
-+      /* Next time we'll be awaiting TOTAL threads again.  */
-+      /* BAR_CANCELLED should never be set in state here, because
-+	 cancellation means that at least one of the threads has been
-+	 cancelled, thus on a cancellable barrier we should never see
-+	 all threads to arrive.  */
-+      struct gomp_thread *thr = gomp_thread ();
-+      struct gomp_team *team = thr->ts.team;
-+
-+      bar->awaited = bar->total;
-+      team->work_share_cancelled = 0;
-+      if (__builtin_expect (team->task_count, 0))
-+	{
-+	  gomp_barrier_handle_tasks (state);
-+	  state &= ~BAR_WAS_LAST;
-+	}
-+      else
-+	{
-+	  state += BAR_INCR - BAR_WAS_LAST;
-+	  __atomic_store_n (&bar->generation, state, MEMMODEL_RELEASE);
-+	  futex_wake ((int *) &bar->generation, INT_MAX);
-+	  return false;
-+	}
-+    }
-+
-+  if (__builtin_expect (state & BAR_CANCELLED, 0))
-+    return true;
-+
-+  generation = state;
-+  do
-+    {
-+      do_wait ((int *) &bar->generation, generation);
-+      gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+      if (__builtin_expect (gen & BAR_CANCELLED, 0))
-+	return true;
-+      if (__builtin_expect (gen & BAR_TASK_PENDING, 0))
-+	{
-+	  gomp_barrier_handle_tasks (state);
-+	  gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+	}
-+      generation |= gen & BAR_WAITING_FOR_TASK;
-+    }
-+  while (gen != state + BAR_INCR);
-+
-+  return false;
-+}
-+
-+bool
-+gomp_team_barrier_wait_cancel (gomp_barrier_t *bar)
-+{
-+  return gomp_team_barrier_wait_cancel_end (bar, gomp_barrier_wait_start (bar));
-+}
-+
-+void
-+gomp_team_barrier_cancel (struct gomp_team *team)
-+{
-+  gomp_mutex_lock (&team->task_lock);
-+  if (team->barrier.generation & BAR_CANCELLED)
-+    {
-+      gomp_mutex_unlock (&team->task_lock);
-+      return;
-+    }
-+  team->barrier.generation |= BAR_CANCELLED;
-+  gomp_mutex_unlock (&team->task_lock);
-+  futex_wake ((int *) &team->barrier.generation, INT_MAX);
-+}
---- libgomp/config/linux/proc.h	(revision 210461)
-+++ libgomp/config/linux/proc.h	(revision 210462)
-@@ -28,7 +28,10 @@
- #include <sched.h>
- 
- #ifdef HAVE_PTHREAD_AFFINITY_NP
--extern unsigned long gomp_cpuset_popcount (cpu_set_t *);
-+extern unsigned long gomp_cpuset_size attribute_hidden;
-+extern cpu_set_t *gomp_cpusetp attribute_hidden;
-+extern unsigned long gomp_cpuset_popcount (unsigned long, cpu_set_t *)
-+     attribute_hidden;
- #endif
- 
- #endif /* GOMP_PROC_H */
---- libgomp/config/linux/affinity.c	(revision 210461)
-+++ libgomp/config/linux/affinity.c	(revision 210462)
-@@ -29,90 +29,327 @@
- #endif
- #include "libgomp.h"
- #include "proc.h"
-+#include <errno.h>
- #include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
- #include <unistd.h>
- 
- #ifdef HAVE_PTHREAD_AFFINITY_NP
- 
--static unsigned int affinity_counter;
-+#ifndef CPU_ALLOC_SIZE
-+#define CPU_ISSET_S(idx, size, set) CPU_ISSET(idx, set)
-+#define CPU_ZERO_S(size, set) CPU_ZERO(set)
-+#define CPU_SET_S(idx, size, set) CPU_SET(idx, set)
-+#define CPU_CLR_S(idx, size, set) CPU_CLR(idx, set)
-+#endif
- 
- void
- gomp_init_affinity (void)
- {
--  cpu_set_t cpuset, cpusetnew;
--  size_t idx, widx;
--  unsigned long cpus = 0;
--
--  if (pthread_getaffinity_np (pthread_self (), sizeof (cpuset), &cpuset))
--    {
--      gomp_error ("could not get CPU affinity set");
--      free (gomp_cpu_affinity);
--      gomp_cpu_affinity = NULL;
--      gomp_cpu_affinity_len = 0;
--      return;
--    }
--
--  CPU_ZERO (&cpusetnew);
--  if (gomp_cpu_affinity_len == 0)
--    {
--      unsigned long count = gomp_cpuset_popcount (&cpuset);
--      if (count >= 65536)
--	count = 65536;
--      gomp_cpu_affinity = malloc (count * sizeof (unsigned short));
--      if (gomp_cpu_affinity == NULL)
-+  if (gomp_places_list == NULL)
-+    {
-+      if (!gomp_affinity_init_level (1, ULONG_MAX, true))
-+	return;
-+    }
-+
-+  struct gomp_thread *thr = gomp_thread ();
-+  pthread_setaffinity_np (pthread_self (), gomp_cpuset_size,
-+			  (cpu_set_t *) gomp_places_list[0]);
-+  thr->place = 1;
-+  thr->ts.place_partition_off = 0;
-+  thr->ts.place_partition_len = gomp_places_list_len;
-+}
-+
-+void
-+gomp_init_thread_affinity (pthread_attr_t *attr, unsigned int place)
-+{
-+  pthread_attr_setaffinity_np (attr, gomp_cpuset_size,
-+			       (cpu_set_t *) gomp_places_list[place]);
-+}
-+
-+void **
-+gomp_affinity_alloc (unsigned long count, bool quiet)
-+{
-+  unsigned long i;
-+  void **ret;
-+  char *p;
-+
-+  if (gomp_cpusetp == NULL)
-+    {
-+      if (!quiet)
-+	gomp_error ("Could not get CPU affinity set");
-+      return NULL;
-+    }
-+
-+  ret = malloc (count * sizeof (void *) + count * gomp_cpuset_size);
-+  if (ret == NULL)
-+    {
-+      if (!quiet)
-+	gomp_error ("Out of memory trying to allocate places list");
-+      return NULL;
-+    }
-+
-+  p = (char *) (ret + count);
-+  for (i = 0; i < count; i++, p += gomp_cpuset_size)
-+    ret[i] = p;
-+  return ret;
-+}
-+
-+void
-+gomp_affinity_init_place (void *p)
-+{
-+  cpu_set_t *cpusetp = (cpu_set_t *) p;
-+  CPU_ZERO_S (gomp_cpuset_size, cpusetp);
-+}
-+
-+bool
-+gomp_affinity_add_cpus (void *p, unsigned long num,
-+			unsigned long len, long stride, bool quiet)
-+{
-+  cpu_set_t *cpusetp = (cpu_set_t *) p;
-+  unsigned long max = 8 * gomp_cpuset_size;
-+  for (;;)
-+    {
-+      if (num >= max)
- 	{
--	  gomp_error ("not enough memory to store CPU affinity list");
--	  return;
-+	  if (!quiet)
-+	    gomp_error ("Logical CPU number %lu out of range", num);
-+	  return false;
- 	}
--      for (widx = idx = 0; widx < count && idx < 65536; idx++)
--	if (CPU_ISSET (idx, &cpuset))
-+      CPU_SET_S (num, gomp_cpuset_size, cpusetp);
-+      if (--len == 0)
-+	return true;
-+      if ((stride < 0 && num + stride > num)
-+	  || (stride > 0 && num + stride < num))
-+	{
-+	  if (!quiet)
-+	    gomp_error ("Logical CPU number %lu+%ld out of range",
-+			num, stride);
-+	  return false;
-+	}
-+      num += stride;
-+    }
-+}
-+
-+bool
-+gomp_affinity_remove_cpu (void *p, unsigned long num)
-+{
-+  cpu_set_t *cpusetp = (cpu_set_t *) p;
-+  if (num >= 8 * gomp_cpuset_size)
-+    {
-+      gomp_error ("Logical CPU number %lu out of range", num);
-+      return false;
-+    }
-+  if (!CPU_ISSET_S (num, gomp_cpuset_size, cpusetp))
-+    {
-+      gomp_error ("Logical CPU %lu to be removed is not in the set", num);
-+      return false;
-+    }
-+  CPU_CLR_S (num, gomp_cpuset_size, cpusetp);
-+  return true;
-+}
-+
-+bool
-+gomp_affinity_copy_place (void *p, void *q, long stride)
-+{
-+  unsigned long i, max = 8 * gomp_cpuset_size;
-+  cpu_set_t *destp = (cpu_set_t *) p;
-+  cpu_set_t *srcp = (cpu_set_t *) q;
-+
-+  CPU_ZERO_S (gomp_cpuset_size, destp);
-+  for (i = 0; i < max; i++)
-+    if (CPU_ISSET_S (i, gomp_cpuset_size, srcp))
-+      {
-+	if ((stride < 0 && i + stride > i)
-+	    || (stride > 0 && (i + stride < i || i + stride >= max)))
-+	  {
-+	    gomp_error ("Logical CPU number %lu+%ld out of range", i, stride);
-+	    return false;
-+	  }
-+	CPU_SET_S (i + stride, gomp_cpuset_size, destp);
-+      }
-+  return true;
-+}
-+
-+bool
-+gomp_affinity_same_place (void *p, void *q)
-+{
-+#ifdef CPU_EQUAL_S
-+  return CPU_EQUAL_S (gomp_cpuset_size, (cpu_set_t *) p, (cpu_set_t *) q);
-+#else
-+  return memcmp (p, q, gomp_cpuset_size) == 0;
-+#endif
-+}
-+
-+bool
-+gomp_affinity_finalize_place_list (bool quiet)
-+{
-+  unsigned long i, j;
-+
-+  for (i = 0, j = 0; i < gomp_places_list_len; i++)
-+    {
-+      cpu_set_t *cpusetp = (cpu_set_t *) gomp_places_list[i];
-+      bool nonempty = false;
-+#ifdef CPU_AND_S
-+      CPU_AND_S (gomp_cpuset_size, cpusetp, cpusetp, gomp_cpusetp);
-+      nonempty = gomp_cpuset_popcount (gomp_cpuset_size, cpusetp) != 0;
-+#else
-+      unsigned long k, max = gomp_cpuset_size / sizeof (cpusetp->__bits[0]);
-+      for (k = 0; k < max; k++)
-+	if ((cpusetp->__bits[k] &= gomp_cpusetp->__bits[k]) != 0)
-+	  nonempty = true;
-+#endif
-+      if (nonempty)
-+	gomp_places_list[j++] = gomp_places_list[i];
-+    }
-+
-+  if (j == 0)
-+    {
-+      if (!quiet)
-+	gomp_error ("None of the places contain usable logical CPUs");
-+      return false;
-+    }
-+  else if (j < gomp_places_list_len)
-+    {
-+      if (!quiet)
-+	gomp_error ("Number of places reduced from %ld to %ld because some "
-+		    "places didn't contain any usable logical CPUs",
-+		    gomp_places_list_len, j);
-+      gomp_places_list_len = j;
-+    }
-+  return true;
-+}
-+
-+bool
-+gomp_affinity_init_level (int level, unsigned long count, bool quiet)
-+{
-+  unsigned long i, max = 8 * gomp_cpuset_size;
-+
-+  if (gomp_cpusetp)
-+    {
-+      unsigned long maxcount
-+	= gomp_cpuset_popcount (gomp_cpuset_size, gomp_cpusetp);
-+      if (count > maxcount)
-+	count = maxcount;
-+    }
-+  gomp_places_list = gomp_affinity_alloc (count, quiet);
-+  gomp_places_list_len = 0;
-+  if (gomp_places_list == NULL)
-+    return false;
-+  /* SMT (threads).  */
-+  if (level == 1)
-+    {
-+      for (i = 0; i < max && gomp_places_list_len < count; i++)
-+	if (CPU_ISSET_S (i, gomp_cpuset_size, gomp_cpusetp))
- 	  {
--	    cpus++;
--	    gomp_cpu_affinity[widx++] = idx;
-+	    gomp_affinity_init_place (gomp_places_list[gomp_places_list_len]);
-+	    gomp_affinity_add_cpus (gomp_places_list[gomp_places_list_len],
-+				    i, 1, 0, true);
-+	    ++gomp_places_list_len;
- 	  }
-+      return true;
-     }
-   else
--    for (widx = idx = 0; idx < gomp_cpu_affinity_len; idx++)
--      if (gomp_cpu_affinity[idx] < CPU_SETSIZE
--	  && CPU_ISSET (gomp_cpu_affinity[idx], &cpuset))
-+    {
-+      char name[sizeof ("/sys/devices/system/cpu/cpu/topology/"
-+			"thread_siblings_list") + 3 * sizeof (unsigned long)];
-+      size_t prefix_len = sizeof ("/sys/devices/system/cpu/cpu") - 1;
-+      cpu_set_t *copy = gomp_alloca (gomp_cpuset_size);
-+      FILE *f;
-+      char *line = NULL;
-+      size_t linelen = 0;
-+
-+      memcpy (name, "/sys/devices/system/cpu/cpu", prefix_len);
-+      memcpy (copy, gomp_cpusetp, gomp_cpuset_size);
-+      for (i = 0; i < max && gomp_places_list_len < count; i++)
-+	if (CPU_ISSET_S (i, gomp_cpuset_size, copy))
-+	  {
-+	    sprintf (name + prefix_len, "%lu/topology/%s_siblings_list",
-+		     i, level == 2 ? "thread" : "core");
-+	    f = fopen (name, "r");
-+	    if (f != NULL)
-+	      {
-+		if (getline (&line, &linelen, f) > 0)
-+		  {
-+		    char *p = line;
-+		    bool seen_i = false;
-+		    void *pl = gomp_places_list[gomp_places_list_len];
-+		    gomp_affinity_init_place (pl);
-+		    while (*p && *p != '\n')
-+		      {
-+			unsigned long first, last;
-+			errno = 0;
-+			first = strtoul (p, &p, 10);
-+			if (errno)
-+			  break;
-+			last = first;
-+			if (*p == '-')
-+			  {
-+			    errno = 0;
-+			    last = strtoul (p + 1, &p, 10);
-+			    if (errno || last < first)
-+			      break;
-+			  }
-+			for (; first <= last; first++)
-+			  if (CPU_ISSET_S (first, gomp_cpuset_size, copy)
-+			      && gomp_affinity_add_cpus (pl, first, 1, 0,
-+							 true))
-+			    {
-+			      CPU_CLR_S (first, gomp_cpuset_size, copy);
-+			      if (first == i)
-+				seen_i = true;
-+			    }
-+			if (*p == ',')
-+			  ++p;
-+		      }
-+		    if (seen_i)
-+		      gomp_places_list_len++;
-+		  }
-+		fclose (f);
-+	      }
-+	  }
-+      if (gomp_places_list_len == 0)
- 	{
--	  if (! CPU_ISSET (gomp_cpu_affinity[idx], &cpusetnew))
--	    {
--	      cpus++;
--	      CPU_SET (gomp_cpu_affinity[idx], &cpusetnew);
--	    }
--	  gomp_cpu_affinity[widx++] = gomp_cpu_affinity[idx];
-+	  if (!quiet)
-+	    gomp_error ("Error reading %s topology",
-+			level == 2 ? "core" : "socket");
-+	  free (gomp_places_list);
-+	  gomp_places_list = NULL;
-+	  return false;
- 	}
--
--  if (widx == 0)
--    {
--      gomp_error ("no CPUs left for affinity setting");
--      free (gomp_cpu_affinity);
--      gomp_cpu_affinity = NULL;
--      gomp_cpu_affinity_len = 0;
--      return;
--    }
--
--  gomp_cpu_affinity_len = widx;
--  if (cpus < gomp_available_cpus)
--    gomp_available_cpus = cpus;
--  CPU_ZERO (&cpuset);
--  CPU_SET (gomp_cpu_affinity[0], &cpuset);
--  pthread_setaffinity_np (pthread_self (), sizeof (cpuset), &cpuset);
--  affinity_counter = 1;
-+      return true;
-+    }
-+  return false;
- }
- 
- void
--gomp_init_thread_affinity (pthread_attr_t *attr)
-+gomp_affinity_print_place (void *p)
- {
--  unsigned int cpu;
--  cpu_set_t cpuset;
-+  unsigned long i, max = 8 * gomp_cpuset_size, len;
-+  cpu_set_t *cpusetp = (cpu_set_t *) p;
-+  bool notfirst = false;
- 
--  cpu = __atomic_fetch_add (&affinity_counter, 1, MEMMODEL_RELAXED);
--  cpu %= gomp_cpu_affinity_len;
--  CPU_ZERO (&cpuset);
--  CPU_SET (gomp_cpu_affinity[cpu], &cpuset);
--  pthread_attr_setaffinity_np (attr, sizeof (cpu_set_t), &cpuset);
-+  for (i = 0, len = 0; i < max; i++)
-+    if (CPU_ISSET_S (i, gomp_cpuset_size, cpusetp))
-+      {
-+	if (len == 0)
-+	  {
-+	    if (notfirst)
-+	      fputc (',', stderr);
-+	    notfirst = true;
-+	    fprintf (stderr, "%lu", i);
-+	  }
-+	++len;
-+      }
-+    else
-+      {
-+	if (len > 1)
-+	  fprintf (stderr, ":%lu", len);
-+	len = 0;
-+      }
-+  if (len > 1)
-+    fprintf (stderr, ":%lu", len);
- }
- 
- #else
---- libgomp/config/linux/bar.h	(revision 210461)
-+++ libgomp/config/linux/bar.h	(revision 210462)
-@@ -38,13 +38,25 @@ typedef struct
-   unsigned total __attribute__((aligned (64)));
-   unsigned generation;
-   unsigned awaited __attribute__((aligned (64)));
-+  unsigned awaited_final;
- } gomp_barrier_t;
-+
- typedef unsigned int gomp_barrier_state_t;
- 
-+/* The generation field contains a counter in the high bits, with a few
-+   low bits dedicated to flags.  Note that TASK_PENDING and WAS_LAST can
-+   share space because WAS_LAST is never stored back to generation.  */
-+#define BAR_TASK_PENDING	1
-+#define BAR_WAS_LAST		1
-+#define BAR_WAITING_FOR_TASK	2
-+#define BAR_CANCELLED		4
-+#define BAR_INCR		8
-+
- static inline void gomp_barrier_init (gomp_barrier_t *bar, unsigned count)
- {
-   bar->total = count;
-   bar->awaited = count;
-+  bar->awaited_final = count;
-   bar->generation = 0;
- }
- 
-@@ -62,27 +74,55 @@ extern void gomp_barrier_wait (gomp_barr
- extern void gomp_barrier_wait_last (gomp_barrier_t *);
- extern void gomp_barrier_wait_end (gomp_barrier_t *, gomp_barrier_state_t);
- extern void gomp_team_barrier_wait (gomp_barrier_t *);
-+extern void gomp_team_barrier_wait_final (gomp_barrier_t *);
- extern void gomp_team_barrier_wait_end (gomp_barrier_t *,
- 					gomp_barrier_state_t);
-+extern bool gomp_team_barrier_wait_cancel (gomp_barrier_t *);
-+extern bool gomp_team_barrier_wait_cancel_end (gomp_barrier_t *,
-+					       gomp_barrier_state_t);
- extern void gomp_team_barrier_wake (gomp_barrier_t *, int);
-+struct gomp_team;
-+extern void gomp_team_barrier_cancel (struct gomp_team *);
- 
- static inline gomp_barrier_state_t
- gomp_barrier_wait_start (gomp_barrier_t *bar)
- {
--  unsigned int ret = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE) & ~3;
-+  unsigned int ret = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+  ret &= -BAR_INCR | BAR_CANCELLED;
-   /* A memory barrier is needed before exiting from the various forms
-      of gomp_barrier_wait, to satisfy OpenMP API version 3.1 section
-      2.8.6 flush Construct, which says there is an implicit flush during
-      a barrier region.  This is a convenient place to add the barrier,
-      so we use MEMMODEL_ACQ_REL here rather than MEMMODEL_ACQUIRE.  */
--  ret += __atomic_add_fetch (&bar->awaited, -1, MEMMODEL_ACQ_REL) == 0;
-+  if (__atomic_add_fetch (&bar->awaited, -1, MEMMODEL_ACQ_REL) == 0)
-+    ret |= BAR_WAS_LAST;
-+  return ret;
-+}
-+
-+static inline gomp_barrier_state_t
-+gomp_barrier_wait_cancel_start (gomp_barrier_t *bar)
-+{
-+  return gomp_barrier_wait_start (bar);
-+}
-+
-+/* This is like gomp_barrier_wait_start, except it decrements
-+   bar->awaited_final rather than bar->awaited and should be used
-+   for the gomp_team_end barrier only.  */
-+static inline gomp_barrier_state_t
-+gomp_barrier_wait_final_start (gomp_barrier_t *bar)
-+{
-+  unsigned int ret = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+  ret &= -BAR_INCR | BAR_CANCELLED;
-+  /* See above gomp_barrier_wait_start comment.  */
-+  if (__atomic_add_fetch (&bar->awaited_final, -1, MEMMODEL_ACQ_REL) == 0)
-+    ret |= BAR_WAS_LAST;
-   return ret;
- }
- 
- static inline bool
- gomp_barrier_last_thread (gomp_barrier_state_t state)
- {
--  return state & 1;
-+  return state & BAR_WAS_LAST;
- }
- 
- /* All the inlines below must be called with team->task_lock
-@@ -91,31 +131,37 @@ gomp_barrier_last_thread (gomp_barrier_s
- static inline void
- gomp_team_barrier_set_task_pending (gomp_barrier_t *bar)
- {
--  bar->generation |= 1;
-+  bar->generation |= BAR_TASK_PENDING;
- }
- 
- static inline void
- gomp_team_barrier_clear_task_pending (gomp_barrier_t *bar)
- {
--  bar->generation &= ~1;
-+  bar->generation &= ~BAR_TASK_PENDING;
- }
- 
- static inline void
- gomp_team_barrier_set_waiting_for_tasks (gomp_barrier_t *bar)
- {
--  bar->generation |= 2;
-+  bar->generation |= BAR_WAITING_FOR_TASK;
- }
- 
- static inline bool
- gomp_team_barrier_waiting_for_tasks (gomp_barrier_t *bar)
- {
--  return (bar->generation & 2) != 0;
-+  return (bar->generation & BAR_WAITING_FOR_TASK) != 0;
-+}
-+
-+static inline bool
-+gomp_team_barrier_cancelled (gomp_barrier_t *bar)
-+{
-+  return __builtin_expect ((bar->generation & BAR_CANCELLED) != 0, 0);
- }
- 
- static inline void
- gomp_team_barrier_done (gomp_barrier_t *bar, gomp_barrier_state_t state)
- {
--  bar->generation = (state & ~3) + 4;
-+  bar->generation = (state & -BAR_INCR) + BAR_INCR;
- }
- 
- #endif /* GOMP_BARRIER_H */
---- libgomp/config/posix/bar.c	(revision 210461)
-+++ libgomp/config/posix/bar.c	(revision 210462)
-@@ -42,6 +42,7 @@ gomp_barrier_init (gomp_barrier_t *bar,
-   bar->total = count;
-   bar->arrived = 0;
-   bar->generation = 0;
-+  bar->cancellable = false;
- }
- 
- void
-@@ -72,7 +73,7 @@ gomp_barrier_wait_end (gomp_barrier_t *b
- {
-   unsigned int n;
- 
--  if (state & 1)
-+  if (state & BAR_WAS_LAST)
-     {
-       n = --bar->arrived;
-       if (n > 0)
-@@ -113,12 +114,14 @@ gomp_team_barrier_wait_end (gomp_barrier
- {
-   unsigned int n;
- 
--  if (state & 1)
-+  state &= ~BAR_CANCELLED;
-+  if (state & BAR_WAS_LAST)
-     {
-       n = --bar->arrived;
-       struct gomp_thread *thr = gomp_thread ();
-       struct gomp_team *team = thr->ts.team;
- 
-+      team->work_share_cancelled = 0;
-       if (team->task_count)
- 	{
- 	  gomp_barrier_handle_tasks (state);
-@@ -128,7 +131,7 @@ gomp_team_barrier_wait_end (gomp_barrier
- 	  return;
- 	}
- 
--      bar->generation = state + 3;
-+      bar->generation = state + BAR_INCR - BAR_WAS_LAST;
-       if (n > 0)
- 	{
- 	  do
-@@ -141,13 +144,18 @@ gomp_team_barrier_wait_end (gomp_barrier
-   else
-     {
-       gomp_mutex_unlock (&bar->mutex1);
-+      int gen;
-       do
- 	{
- 	  gomp_sem_wait (&bar->sem1);
--	  if (bar->generation & 1)
--	    gomp_barrier_handle_tasks (state);
-+	  gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+	  if (gen & BAR_TASK_PENDING)
-+	    {
-+	      gomp_barrier_handle_tasks (state);
-+	      gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+	    }
- 	}
--      while (bar->generation != state + 4);
-+      while (gen != state + BAR_INCR);
- 
- #ifdef HAVE_SYNC_BUILTINS
-       n = __sync_add_and_fetch (&bar->arrived, -1);
-@@ -162,6 +170,81 @@ gomp_team_barrier_wait_end (gomp_barrier
-     }
- }
- 
-+bool
-+gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar,
-+				   gomp_barrier_state_t state)
-+{
-+  unsigned int n;
-+
-+  if (state & BAR_WAS_LAST)
-+    {
-+      bar->cancellable = false;
-+      n = --bar->arrived;
-+      struct gomp_thread *thr = gomp_thread ();
-+      struct gomp_team *team = thr->ts.team;
-+
-+      team->work_share_cancelled = 0;
-+      if (team->task_count)
-+	{
-+	  gomp_barrier_handle_tasks (state);
-+	  if (n > 0)
-+	    gomp_sem_wait (&bar->sem2);
-+	  gomp_mutex_unlock (&bar->mutex1);
-+	  return false;
-+	}
-+
-+      bar->generation = state + BAR_INCR - BAR_WAS_LAST;
-+      if (n > 0)
-+	{
-+	  do
-+	    gomp_sem_post (&bar->sem1);
-+	  while (--n != 0);
-+	  gomp_sem_wait (&bar->sem2);
-+	}
-+      gomp_mutex_unlock (&bar->mutex1);
-+    }
-+  else
-+    {
-+      if (state & BAR_CANCELLED)
-+	{
-+	  gomp_mutex_unlock (&bar->mutex1);
-+	  return true;
-+	}
-+      bar->cancellable = true;
-+      gomp_mutex_unlock (&bar->mutex1);
-+      int gen;
-+      do
-+	{
-+	  gomp_sem_wait (&bar->sem1);
-+	  gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+	  if (gen & BAR_CANCELLED)
-+	    break;
-+	  if (gen & BAR_TASK_PENDING)
-+	    {
-+	      gomp_barrier_handle_tasks (state);
-+	      gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE);
-+	      if (gen & BAR_CANCELLED)
-+		break;
-+	    }
-+	}
-+      while (gen != state + BAR_INCR);
-+
-+#ifdef HAVE_SYNC_BUILTINS
-+      n = __sync_add_and_fetch (&bar->arrived, -1);
-+#else
-+      gomp_mutex_lock (&bar->mutex2);
-+      n = --bar->arrived;
-+      gomp_mutex_unlock (&bar->mutex2);
-+#endif
-+
-+      if (n == 0)
-+	gomp_sem_post (&bar->sem2);
-+      if (gen & BAR_CANCELLED)
-+	return true;
-+    }
-+  return false;
-+}
-+
- void
- gomp_team_barrier_wait (gomp_barrier_t *barrier)
- {
-@@ -176,3 +259,40 @@ gomp_team_barrier_wake (gomp_barrier_t *
-   while (count-- > 0)
-     gomp_sem_post (&bar->sem1);
- }
-+
-+bool
-+gomp_team_barrier_wait_cancel (gomp_barrier_t *bar)
-+{
-+  gomp_barrier_state_t state = gomp_barrier_wait_cancel_start (bar);
-+  return gomp_team_barrier_wait_cancel_end (bar, state);
-+}
-+
-+void
-+gomp_team_barrier_cancel (struct gomp_team *team)
-+{
-+  if (team->barrier.generation & BAR_CANCELLED)
-+    return;
-+  gomp_mutex_lock (&team->barrier.mutex1);
-+  gomp_mutex_lock (&team->task_lock);
-+  if (team->barrier.generation & BAR_CANCELLED)
-+    {
-+      gomp_mutex_unlock (&team->task_lock);
-+      gomp_mutex_unlock (&team->barrier.mutex1);
-+      return;
-+    }
-+  team->barrier.generation |= BAR_CANCELLED;
-+  gomp_mutex_unlock (&team->task_lock);
-+  if (team->barrier.cancellable)
-+    {
-+      int n = team->barrier.arrived;
-+      if (n > 0)
-+	{
-+	  do
-+	    gomp_sem_post (&team->barrier.sem1);
-+	  while (--n != 0);
-+	  gomp_sem_wait (&team->barrier.sem2);
-+	}
-+      team->barrier.cancellable = false;
-+    }
-+  gomp_mutex_unlock (&team->barrier.mutex1);
-+}
---- libgomp/config/posix/affinity.c	(revision 210461)
-+++ libgomp/config/posix/affinity.c	(revision 210462)
-@@ -32,7 +32,84 @@ gomp_init_affinity (void)
- }
- 
- void
--gomp_init_thread_affinity (pthread_attr_t *attr)
-+gomp_init_thread_affinity (pthread_attr_t *attr, unsigned int place)
- {
-   (void) attr;
-+  (void) place;
-+}
-+
-+void **
-+gomp_affinity_alloc (unsigned long count, bool quiet)
-+{
-+  (void) count;
-+  if (!quiet)
-+    gomp_error ("Affinity not supported on this configuration");
-+  return NULL;
-+}
-+
-+void
-+gomp_affinity_init_place (void *p)
-+{
-+  (void) p;
-+}
-+
-+bool
-+gomp_affinity_add_cpus (void *p, unsigned long num,
-+			unsigned long len, long stride, bool quiet)
-+{
-+  (void) p;
-+  (void) num;
-+  (void) len;
-+  (void) stride;
-+  (void) quiet;
-+  return false;
-+}
-+
-+bool
-+gomp_affinity_remove_cpu (void *p, unsigned long num)
-+{
-+  (void) p;
-+  (void) num;
-+  return false;
-+}
-+
-+bool
-+gomp_affinity_copy_place (void *p, void *q, long stride)
-+{
-+  (void) p;
-+  (void) q;
-+  (void) stride;
-+  return false;
-+}
-+
-+bool
-+gomp_affinity_same_place (void *p, void *q)
-+{
-+  (void) p;
-+  (void) q;
-+  return false;
-+}
-+
-+bool
-+gomp_affinity_finalize_place_list (bool quiet)
-+{
-+  (void) quiet;
-+  return false;
-+}
-+
-+bool
-+gomp_affinity_init_level (int level, unsigned long count, bool quiet)
-+{
-+  (void) level;
-+  (void) count;
-+  (void) quiet;
-+  if (!quiet)
-+    gomp_error ("Affinity not supported on this configuration");
-+  return NULL;
-+}
-+
-+void
-+gomp_affinity_print_place (void *p)
-+{
-+  (void) p;
- }
---- libgomp/config/posix/bar.h	(revision 210461)
-+++ libgomp/config/posix/bar.h	(revision 210462)
-@@ -43,9 +43,20 @@ typedef struct
-   unsigned total;
-   unsigned arrived;
-   unsigned generation;
-+  bool cancellable;
- } gomp_barrier_t;
-+
- typedef unsigned int gomp_barrier_state_t;
- 
-+/* The generation field contains a counter in the high bits, with a few
-+   low bits dedicated to flags.  Note that TASK_PENDING and WAS_LAST can
-+   share space because WAS_LAST is never stored back to generation.  */
-+#define BAR_TASK_PENDING	1
-+#define BAR_WAS_LAST		1
-+#define BAR_WAITING_FOR_TASK	2
-+#define BAR_CANCELLED		4
-+#define BAR_INCR		8
-+
- extern void gomp_barrier_init (gomp_barrier_t *, unsigned);
- extern void gomp_barrier_reinit (gomp_barrier_t *, unsigned);
- extern void gomp_barrier_destroy (gomp_barrier_t *);
-@@ -55,22 +66,47 @@ extern void gomp_barrier_wait_end (gomp_
- extern void gomp_team_barrier_wait (gomp_barrier_t *);
- extern void gomp_team_barrier_wait_end (gomp_barrier_t *,
- 					gomp_barrier_state_t);
-+extern bool gomp_team_barrier_wait_cancel (gomp_barrier_t *);
-+extern bool gomp_team_barrier_wait_cancel_end (gomp_barrier_t *,
-+					       gomp_barrier_state_t);
- extern void gomp_team_barrier_wake (gomp_barrier_t *, int);
-+struct gomp_team;
-+extern void gomp_team_barrier_cancel (struct gomp_team *);
- 
- static inline gomp_barrier_state_t
- gomp_barrier_wait_start (gomp_barrier_t *bar)
- {
-   unsigned int ret;
-   gomp_mutex_lock (&bar->mutex1);
--  ret = bar->generation & ~3;
--  ret += ++bar->arrived == bar->total;
-+  ret = bar->generation & (-BAR_INCR | BAR_CANCELLED);
-+  if (++bar->arrived == bar->total)
-+    ret |= BAR_WAS_LAST;
-+  return ret;
-+}
-+
-+static inline gomp_barrier_state_t
-+gomp_barrier_wait_cancel_start (gomp_barrier_t *bar)
-+{
-+  unsigned int ret;
-+  gomp_mutex_lock (&bar->mutex1);
-+  ret = bar->generation & (-BAR_INCR | BAR_CANCELLED);
-+  if (ret & BAR_CANCELLED)
-+    return ret;
-+  if (++bar->arrived == bar->total)
-+    ret |= BAR_WAS_LAST;
-   return ret;
- }
- 
-+static inline void
-+gomp_team_barrier_wait_final (gomp_barrier_t *bar)
-+{
-+  gomp_team_barrier_wait (bar);
-+}
-+
- static inline bool
- gomp_barrier_last_thread (gomp_barrier_state_t state)
- {
--  return state & 1;
-+  return state & BAR_WAS_LAST;
- }
- 
- static inline void
-@@ -85,31 +121,37 @@ gomp_barrier_wait_last (gomp_barrier_t *
- static inline void
- gomp_team_barrier_set_task_pending (gomp_barrier_t *bar)
- {
--  bar->generation |= 1;
-+  bar->generation |= BAR_TASK_PENDING;
- }
- 
- static inline void
- gomp_team_barrier_clear_task_pending (gomp_barrier_t *bar)
- {
--  bar->generation &= ~1;
-+  bar->generation &= ~BAR_TASK_PENDING;
- }
- 
- static inline void
- gomp_team_barrier_set_waiting_for_tasks (gomp_barrier_t *bar)
- {
--  bar->generation |= 2;
-+  bar->generation |= BAR_WAITING_FOR_TASK;
- }
- 
- static inline bool
- gomp_team_barrier_waiting_for_tasks (gomp_barrier_t *bar)
- {
--  return (bar->generation & 2) != 0;
-+  return (bar->generation & BAR_WAITING_FOR_TASK) != 0;
-+}
-+
-+static inline bool
-+gomp_team_barrier_cancelled (gomp_barrier_t *bar)
-+{
-+  return __builtin_expect ((bar->generation & BAR_CANCELLED) != 0, 0);
- }
- 
- static inline void
- gomp_team_barrier_done (gomp_barrier_t *bar, gomp_barrier_state_t state)
- {
--  bar->generation = (state & ~3) + 4;
-+  bar->generation = (state & -BAR_INCR) + BAR_INCR;
- }
- 
- #endif /* GOMP_BARRIER_H */
---- libgomp/barrier.c	(revision 210461)
-+++ libgomp/barrier.c	(revision 210462)
-@@ -39,3 +39,15 @@ GOMP_barrier (void)
- 
-   gomp_team_barrier_wait (&team->barrier);
- }
-+
-+bool
-+GOMP_barrier_cancel (void)
-+{
-+  struct gomp_thread *thr = gomp_thread ();
-+  struct gomp_team *team = thr->ts.team;
-+
-+  /* The compiler transforms to barrier_cancel when it sees that the
-+     barrier is within a construct that can cancel.  Thus we should
-+     never have an orphaned cancellable barrier.  */
-+  return gomp_team_barrier_wait_cancel (&team->barrier);
-+}
---- libgomp/target.c	(revision 0)
-+++ libgomp/target.c	(revision 210462)
-@@ -0,0 +1,96 @@
-+/* Copyright (C) 2013 Free Software Foundation, Inc.
-+   Contributed by Jakub Jelinek <jakub@redhat.com>.
-+
-+   This file is part of the GNU OpenMP Library (libgomp).
-+
-+   Libgomp 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.
-+
-+   Libgomp 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/>.  */
-+
-+/* This file handles the maintainence of threads in response to team
-+   creation and termination.  */
-+
-+#include "libgomp.h"
-+#include <limits.h>
-+#include <stdbool.h>
-+#include <stdlib.h>
-+#include <string.h>
-+
-+attribute_hidden int
-+gomp_get_num_devices (void)
-+{
-+  return 0;
-+}
-+
-+/* Called when encountering a target directive.  If DEVICE
-+   is -1, it means use device-var ICV.  If it is -2 (or any other value
-+   larger than last available hw device, use host fallback.
-+   FN is address of host code, OPENMP_TARGET contains value of the
-+   __OPENMP_TARGET__ symbol in the shared library or binary that invokes
-+   GOMP_target.  HOSTADDRS, SIZES and KINDS are arrays
-+   with MAPNUM entries, with addresses of the host objects,
-+   sizes of the host objects (resp. for pointer kind pointer bias
-+   and assumed sizeof (void *) size) and kinds.  */
-+
-+void
-+GOMP_target (int device, void (*fn) (void *), const void *openmp_target,
-+	     size_t mapnum, void **hostaddrs, size_t *sizes,
-+	     unsigned char *kinds)
-+{
-+  /* Host fallback.  */
-+  struct gomp_thread old_thr, *thr = gomp_thread ();
-+  old_thr = *thr;
-+  memset (thr, '\0', sizeof (*thr));
-+  if (gomp_places_list)
-+    {
-+      thr->place = old_thr.place;
-+      thr->ts.place_partition_len = gomp_places_list_len;
-+    }
-+  fn (hostaddrs);
-+  gomp_free_thread (thr);
-+  *thr = old_thr;
-+}
-+
-+void
-+GOMP_target_data (int device, const void *openmp_target, size_t mapnum,
-+		  void **hostaddrs, size_t *sizes, unsigned char *kinds)
-+{
-+}
-+
-+void
-+GOMP_target_end_data (void)
-+{
-+}
-+
-+void
-+GOMP_target_update (int device, const void *openmp_target, size_t mapnum,
-+		    void **hostaddrs, size_t *sizes, unsigned char *kinds)
-+{
-+}
-+
-+void
-+GOMP_teams (unsigned int num_teams, unsigned int thread_limit)
-+{
-+  if (thread_limit)
-+    {
-+      struct gomp_task_icv *icv = gomp_icv (true);
-+      icv->thread_limit_var
-+	= thread_limit > INT_MAX ? UINT_MAX : thread_limit;
-+    }
-+  (void) num_teams;
-+}
---- libgomp/parallel.c	(revision 210461)
-+++ libgomp/parallel.c	(revision 210462)
-@@ -37,18 +37,19 @@
- unsigned
- gomp_resolve_num_threads (unsigned specified, unsigned count)
- {
--  struct gomp_thread *thread = gomp_thread();
-+  struct gomp_thread *thr = gomp_thread ();
-   struct gomp_task_icv *icv;
-   unsigned threads_requested, max_num_threads, num_threads;
--  unsigned long remaining;
-+  unsigned long busy;
-+  struct gomp_thread_pool *pool;
- 
-   icv = gomp_icv (false);
- 
-   if (specified == 1)
-     return 1;
--  else if (thread->ts.active_level >= 1 && !icv->nest_var)
-+  else if (thr->ts.active_level >= 1 && !icv->nest_var)
-     return 1;
--  else if (thread->ts.active_level >= gomp_max_active_levels_var)
-+  else if (thr->ts.active_level >= gomp_max_active_levels_var)
-     return 1;
- 
-   /* If NUM_THREADS not specified, use nthreads_var.  */
-@@ -72,30 +73,46 @@ gomp_resolve_num_threads (unsigned speci
- 	max_num_threads = count;
-     }
- 
--  /* ULONG_MAX stands for infinity.  */
--  if (__builtin_expect (gomp_thread_limit_var == ULONG_MAX, 1)
-+  /* UINT_MAX stands for infinity.  */
-+  if (__builtin_expect (icv->thread_limit_var == UINT_MAX, 1)
-       || max_num_threads == 1)
-     return max_num_threads;
- 
-+  /* The threads_busy counter lives in thread_pool, if there
-+     isn't a thread_pool yet, there must be just one thread
-+     in the contention group.  If thr->team is NULL, this isn't
-+     nested parallel, so there is just one thread in the
-+     contention group as well, no need to handle it atomically.  */
-+  pool = thr->thread_pool;
-+  if (thr->ts.team == NULL)
-+    {
-+      num_threads = max_num_threads;
-+      if (num_threads > icv->thread_limit_var)
-+	num_threads = icv->thread_limit_var;
-+      if (pool)
-+	pool->threads_busy = num_threads;
-+      return num_threads;
-+    }
-+
- #ifdef HAVE_SYNC_BUILTINS
-   do
-     {
--      remaining = gomp_remaining_threads_count;
-+      busy = pool->threads_busy;
-       num_threads = max_num_threads;
--      if (num_threads > remaining)
--	num_threads = remaining + 1;
-+      if (icv->thread_limit_var - busy + 1 < num_threads)
-+	num_threads = icv->thread_limit_var - busy + 1;
-     }
--  while (__sync_val_compare_and_swap (&gomp_remaining_threads_count,
--				      remaining, remaining - num_threads + 1)
--	 != remaining);
-+  while (__sync_val_compare_and_swap (&pool->threads_busy,
-+				      busy, busy + num_threads - 1)
-+	 != busy);
- #else
--  gomp_mutex_lock (&gomp_remaining_threads_lock);
-+  gomp_mutex_lock (&gomp_managed_threads_lock);
-   num_threads = max_num_threads;
--  remaining = gomp_remaining_threads_count;
--  if (num_threads > remaining)
--    num_threads = remaining + 1;
--  gomp_remaining_threads_count -= num_threads - 1;
--  gomp_mutex_unlock (&gomp_remaining_threads_lock);
-+  busy = pool->threads_busy;
-+  if (icv->thread_limit_var - busy + 1 < num_threads)
-+    num_threads = icv->thread_limit_var - busy + 1;
-+  pool->threads_busy += num_threads - 1;
-+  gomp_mutex_unlock (&gomp_managed_threads_lock);
- #endif
- 
-   return num_threads;
-@@ -105,13 +122,14 @@ void
- GOMP_parallel_start (void (*fn) (void *), void *data, unsigned num_threads)
- {
-   num_threads = gomp_resolve_num_threads (num_threads, 0);
--  gomp_team_start (fn, data, num_threads, gomp_new_team (num_threads));
-+  gomp_team_start (fn, data, num_threads, 0, gomp_new_team (num_threads));
- }
- 
- void
- GOMP_parallel_end (void)
- {
--  if (__builtin_expect (gomp_thread_limit_var != ULONG_MAX, 0))
-+  struct gomp_task_icv *icv = gomp_icv (false);
-+  if (__builtin_expect (icv->thread_limit_var != UINT_MAX, 0))
-     {
-       struct gomp_thread *thr = gomp_thread ();
-       struct gomp_team *team = thr->ts.team;
-@@ -119,20 +137,98 @@ GOMP_parallel_end (void)
-       gomp_team_end ();
-       if (nthreads > 1)
- 	{
-+	  /* If not nested, there is just one thread in the
-+	     contention group left, no need for atomicity.  */
-+	  if (thr->ts.team == NULL)
-+	    thr->thread_pool->threads_busy = 1;
-+	  else
-+	    {
- #ifdef HAVE_SYNC_BUILTINS
--	  __sync_fetch_and_add (&gomp_remaining_threads_count,
--				nthreads - 1);
-+	      __sync_fetch_and_add (&thr->thread_pool->threads_busy,
-+				    1UL - nthreads);
- #else
--	  gomp_mutex_lock (&gomp_remaining_threads_lock);
--	  gomp_remaining_threads_count += nthreads - 1;
--	  gomp_mutex_unlock (&gomp_remaining_threads_lock);
-+	      gomp_mutex_lock (&gomp_managed_threads_lock);
-+	      thr->thread_pool->threads_busy -= nthreads - 1;
-+	      gomp_mutex_unlock (&gomp_managed_threads_lock);
- #endif
-+	    }
- 	}
-     }
-   else
-     gomp_team_end ();
- }
-+ialias (GOMP_parallel_end)
-+
-+void
-+GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags)
-+{
-+  num_threads = gomp_resolve_num_threads (num_threads, 0);
-+  gomp_team_start (fn, data, num_threads, flags, gomp_new_team (num_threads));
-+  fn (data);
-+  ialias_call (GOMP_parallel_end) ();
-+}
-+
-+bool
-+GOMP_cancellation_point (int which)
-+{
-+  if (!gomp_cancel_var)
-+    return false;
- 
-+  struct gomp_thread *thr = gomp_thread ();
-+  struct gomp_team *team = thr->ts.team;
-+  if (which & (GOMP_CANCEL_LOOP | GOMP_CANCEL_SECTIONS))
-+    {
-+      if (team == NULL)
-+	return false;
-+      return team->work_share_cancelled != 0;
-+    }
-+  else if (which & GOMP_CANCEL_TASKGROUP)
-+    {
-+      if (thr->task->taskgroup && thr->task->taskgroup->cancelled)
-+	return true;
-+      /* FALLTHRU into the GOMP_CANCEL_PARALLEL case,
-+	 as #pragma omp cancel parallel also cancels all explicit
-+	 tasks.  */
-+    }
-+  if (team)
-+    return gomp_team_barrier_cancelled (&team->barrier);
-+  return false;
-+}
-+ialias (GOMP_cancellation_point)
-+
-+bool
-+GOMP_cancel (int which, bool do_cancel)
-+{
-+  if (!gomp_cancel_var)
-+    return false;
-+
-+  if (!do_cancel)
-+    return ialias_call (GOMP_cancellation_point) (which);
-+
-+  struct gomp_thread *thr = gomp_thread ();
-+  struct gomp_team *team = thr->ts.team;
-+  if (which & (GOMP_CANCEL_LOOP | GOMP_CANCEL_SECTIONS))
-+    {
-+      /* In orphaned worksharing region, all we want to cancel
-+	 is current thread.  */
-+      if (team != NULL)
-+	team->work_share_cancelled = 1;
-+      return true;
-+    }
-+  else if (which & GOMP_CANCEL_TASKGROUP)
-+    {
-+      if (thr->task->taskgroup && !thr->task->taskgroup->cancelled)
-+	{
-+	  gomp_mutex_lock (&team->task_lock);
-+	  thr->task->taskgroup->cancelled = true;
-+	  gomp_mutex_unlock (&team->task_lock);
-+	}
-+      return true;
-+    }
-+  team->team_cancelled = 1;
-+  gomp_team_barrier_cancel (team);
-+  return true;
-+}
- 
- /* The public OpenMP API for thread and team related inquiries.  */
- 
diff --git a/SOURCES/gcc48-test-compat-Wno-abi.patch b/SOURCES/gcc48-test-compat-Wno-abi.patch
new file mode 100644
index 0000000..cc2b74c
--- /dev/null
+++ b/SOURCES/gcc48-test-compat-Wno-abi.patch
@@ -0,0 +1,23 @@
+2014-09-26  Jakub Jelinek  <jakub@redhat.com>
+
+	* g++.dg/compat/struct-layout-1_generate.c: Add -Wno-abi
+	to default options.
+
+--- gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c	(revision 215636)
++++ gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c	(revision 215637)
+@@ -1,5 +1,5 @@
+ /* Structure layout test generator.
+-   Copyright (C) 2004, 2005, 2007, 2008, 2009, 2011, 2012
++   Copyright (C) 2004-2014
+    Free Software Foundation, Inc.
+    Contributed by Jakub Jelinek <jakub@redhat.com>.
+ 
+@@ -44,7 +44,7 @@ along with GCC; see the file COPYING3.
+ #endif
+ 
+ const char *dg_options[] = {
+-"/* { dg-options \"%s-I%s\" } */\n",
++"/* { dg-options \"%s-I%s -Wno-abi\" } */\n",
+ "/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n",
+ "/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n",
+ "/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* i?86-*-mingw32* x86_64-*-mingw32* i?86-*-cygwin* } } */\n",
diff --git a/SOURCES/isl-0.11.1-ppc64le-config.patch b/SOURCES/isl-0.11.1-ppc64le-config.patch
new file mode 100644
index 0000000..b718df2
--- /dev/null
+++ b/SOURCES/isl-0.11.1-ppc64le-config.patch
@@ -0,0 +1,708 @@
+--- isl-0.11.1/configure.jj	2012-12-10 11:58:02.000000000 +0100
++++ isl-0.11.1/configure	2014-04-10 20:45:59.676625289 +0200
+@@ -7991,7 +7991,7 @@ ia64-*-hpux*)
+   rm -rf conftest*
+   ;;
+ 
+-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
++x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+   # Find out which ABI we are using.
+   echo 'int i;' > conftest.$ac_ext
+@@ -8009,7 +8009,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_i386"
+ 	    ;;
+-	  ppc64-*linux*|powerpc64-*linux*)
++	  powerpc64le-*linux*)
++	    LD="${LD-ld} -m elf32lppclinux"
++	    ;;
++	  powerpc64-*linux*)
+ 	    LD="${LD-ld} -m elf32ppclinux"
+ 	    ;;
+ 	  s390x-*linux*)
+@@ -8028,7 +8031,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_x86_64"
+ 	    ;;
+-	  ppc*-*linux*|powerpc*-*linux*)
++	  powerpcle-*linux*)
++	    LD="${LD-ld} -m elf64lppc"
++	    ;;
++	  powerpc-*linux*)
+ 	    LD="${LD-ld} -m elf64ppc"
+ 	    ;;
+ 	  s390*-*linux*|s390*-*tpf*)
+--- isl-0.11.1/config.sub.jj	2014-04-10 20:44:52.000000000 +0200
++++ isl-0.11.1/config.sub	2014-04-10 10:38:39.203978206 +0200
+@@ -1,24 +1,18 @@
+ #! /bin/sh
+ # Configuration validation subroutine script.
+-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+-#   2011, 2012 Free Software Foundation, Inc.
+-
+-timestamp='2012-04-18'
+-
+-# This file is (in principle) common to ALL GNU software.
+-# The presence of a machine in this file suggests that SOME GNU software
+-# can handle that machine.  It does not imply ALL GNU software can.
+-#
+-# This file is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++#   Copyright 1992-2013 Free Software Foundation, Inc.
++
++timestamp='2013-10-01'
++
++# This file is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-# GNU General Public License for more details.
++# This program is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++# General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, see <http://www.gnu.org/licenses/>.
+@@ -26,11 +20,12 @@ timestamp='2012-04-18'
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
++# the same distribution terms that you use for the rest of that
++# program.  This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+ 
+ 
+-# Please send patches to <config-patches@gnu.org>.  Submit a context
+-# diff and a properly formatted GNU ChangeLog entry.
++# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+ #
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+@@ -73,9 +68,7 @@ Report bugs and patches to <config-patch
+ version="\
+ GNU config.sub ($timestamp)
+ 
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+-Free Software Foundation, Inc.
++Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -123,7 +116,7 @@ esac
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
++  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+   knetbsd*-gnu* | netbsd*-gnu* | \
+   kopensolaris*-gnu* | \
+   storm-chaos* | os2-emx* | rtmk-nova*)
+@@ -156,7 +149,7 @@ case $os in
+ 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+-	-apple | -axis | -knuth | -cray | -microblaze)
++	-apple | -axis | -knuth | -cray | -microblaze*)
+ 		os=
+ 		basic_machine=$1
+ 		;;
+@@ -259,10 +252,12 @@ case $basic_machine in
+ 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ 	| am33_2.0 \
+-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+-        | be32 | be64 \
++	| arc | arceb \
++	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
++	| avr | avr32 \
++	| be32 | be64 \
+ 	| bfin \
+-	| c4x | clipper \
++	| c4x | c8051 | clipper \
+ 	| d10v | d30v | dlx | dsp16xx \
+ 	| epiphany \
+ 	| fido | fr30 | frv \
+@@ -270,10 +265,11 @@ case $basic_machine in
+ 	| hexagon \
+ 	| i370 | i860 | i960 | ia64 \
+ 	| ip2k | iq2000 \
++	| k1om \
+ 	| le32 | le64 \
+ 	| lm32 \
+ 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+-	| maxq | mb | microblaze | mcore | mep | metag \
++	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ 	| mips | mipsbe | mipseb | mipsel | mipsle \
+ 	| mips16 \
+ 	| mips64 | mips64el \
+@@ -291,16 +287,17 @@ case $basic_machine in
+ 	| mipsisa64r2 | mipsisa64r2el \
+ 	| mipsisa64sb1 | mipsisa64sb1el \
+ 	| mipsisa64sr71k | mipsisa64sr71kel \
++	| mipsr5900 | mipsr5900el \
+ 	| mipstx39 | mipstx39el \
+ 	| mn10200 | mn10300 \
+ 	| moxie \
+ 	| mt \
+ 	| msp430 \
+ 	| nds32 | nds32le | nds32be \
+-	| nios | nios2 \
++	| nios | nios2 | nios2eb | nios2el \
+ 	| ns16k | ns32k \
+ 	| open8 \
+-	| or32 \
++	| or1k | or32 \
+ 	| pdp10 | pdp11 | pj | pjl \
+ 	| powerpc | powerpc64 | powerpc64le | powerpcle \
+ 	| pyramid \
+@@ -328,7 +325,7 @@ case $basic_machine in
+ 	c6x)
+ 		basic_machine=tic6x-unknown
+ 		;;
+-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
++	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ 		basic_machine=$basic_machine-unknown
+ 		os=-none
+ 		;;
+@@ -370,13 +367,13 @@ case $basic_machine in
+ 	| aarch64-* | aarch64_be-* \
+ 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+ 	| avr-* | avr32-* \
+ 	| be32-* | be64-* \
+ 	| bfin-* | bs2000-* \
+ 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+-	| clipper-* | craynv-* | cydra-* \
++	| c8051-* | clipper-* | craynv-* | cydra-* \
+ 	| d10v-* | d30v-* | dlx-* \
+ 	| elxsi-* \
+ 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+@@ -385,11 +382,13 @@ case $basic_machine in
+ 	| hexagon-* \
+ 	| i*86-* | i860-* | i960-* | ia64-* \
+ 	| ip2k-* | iq2000-* \
++	| k1om-* \
+ 	| le32-* | le64-* \
+ 	| lm32-* \
+ 	| m32c-* | m32r-* | m32rle-* \
+ 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
++	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
++	| microblaze-* | microblazeel-* \
+ 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ 	| mips16-* \
+ 	| mips64-* | mips64el-* \
+@@ -407,12 +406,13 @@ case $basic_machine in
+ 	| mipsisa64r2-* | mipsisa64r2el-* \
+ 	| mipsisa64sb1-* | mipsisa64sb1el-* \
+ 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
++	| mipsr5900-* | mipsr5900el-* \
+ 	| mipstx39-* | mipstx39el-* \
+ 	| mmix-* \
+ 	| mt-* \
+ 	| msp430-* \
+ 	| nds32-* | nds32le-* | nds32be-* \
+-	| nios-* | nios2-* \
++	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+ 	| none-* | np1-* | ns16k-* | ns32k-* \
+ 	| open8-* \
+ 	| orion-* \
+@@ -788,11 +788,15 @@ case $basic_machine in
+ 		basic_machine=ns32k-utek
+ 		os=-sysv
+ 		;;
+-	microblaze)
++	microblaze*)
+ 		basic_machine=microblaze-xilinx
+ 		;;
++	mingw64)
++		basic_machine=x86_64-pc
++		os=-mingw64
++		;;
+ 	mingw32)
+-		basic_machine=i386-pc
++		basic_machine=i686-pc
+ 		os=-mingw32
+ 		;;
+ 	mingw32ce)
+@@ -828,7 +832,7 @@ case $basic_machine in
+ 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ 		;;
+ 	msys)
+-		basic_machine=i386-pc
++		basic_machine=i686-pc
+ 		os=-msys
+ 		;;
+ 	mvs)
+@@ -1019,7 +1023,11 @@ case $basic_machine in
+ 		basic_machine=i586-unknown
+ 		os=-pw32
+ 		;;
+-	rdos)
++	rdos | rdos64)
++		basic_machine=x86_64-pc
++		os=-rdos
++		;;
++	rdos32)
+ 		basic_machine=i386-pc
+ 		os=-rdos
+ 		;;
+@@ -1346,21 +1354,21 @@ case $os in
+ 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+-	      | -sym* | -kopensolaris* \
++	      | -sym* | -kopensolaris* | -plan9* \
+ 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ 	      | -aos* | -aros* \
+ 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+-	      | -openbsd* | -solidbsd* \
++	      | -bitrig* | -openbsd* | -solidbsd* \
+ 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ 	      | -chorusos* | -chorusrdb* | -cegcc* \
+ 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+-	      | -mingw32* | -linux-gnu* | -linux-android* \
+-	      | -linux-newlib* | -linux-uclibc* \
++	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ 	      | -uxpv* | -beos* | -mpeix* | -udk* \
+ 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+@@ -1492,9 +1500,6 @@ case $os in
+ 	-aros*)
+ 		os=-aros
+ 		;;
+-	-kaos*)
+-		os=-kaos
+-		;;
+ 	-zvmoe)
+ 		os=-zvmoe
+ 		;;
+@@ -1543,6 +1548,9 @@ case $basic_machine in
+ 	c4x-* | tic4x-*)
+ 		os=-coff
+ 		;;
++	c8051-*)
++		os=-elf
++		;;
+ 	hexagon-*)
+ 		os=-elf
+ 		;;
+@@ -1586,6 +1594,9 @@ case $basic_machine in
+ 	mips*-*)
+ 		os=-elf
+ 		;;
++	or1k-*)
++		os=-elf
++		;;
+ 	or32-*)
+ 		os=-coff
+ 		;;
+--- isl-0.11.1/config.guess.jj	2014-04-10 20:44:52.000000000 +0200
++++ isl-0.11.1/config.guess	2014-04-10 10:38:36.329993540 +0200
+@@ -1,14 +1,12 @@
+ #! /bin/sh
+ # Attempt to guess a canonical system name.
+-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+-#   2011, 2012 Free Software Foundation, Inc.
++#   Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+-timestamp='2012-06-10'
++timestamp='2013-06-10'
+ 
+ # This file is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful, but
+@@ -22,19 +20,17 @@ timestamp='2012-06-10'
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
+-
+-
+-# Originally written by Per Bothner.  Please send patches (context
+-# diff format) to <config-patches@gnu.org> and include a ChangeLog
+-# entry.
++# the same distribution terms that you use for the rest of that
++# program.  This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+ #
+-# This script attempts to guess a canonical system name similar to
+-# config.sub.  If it succeeds, it prints the system name on stdout, and
+-# exits with 0.  Otherwise, it exits with 1.
++# Originally written by Per Bothner.
+ #
+ # You can get the latest version of this script from:
+ # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
++#
++# Please send patches with a ChangeLog entry to config-patches@gnu.org.
++
+ 
+ me=`echo "$0" | sed -e 's,.*/,,'`
+ 
+@@ -54,9 +50,7 @@ version="\
+ GNU config.guess ($timestamp)
+ 
+ Originally written by Per Bothner.
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+-Free Software Foundation, Inc.
++Copyright 1992-2013 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` |
+ UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+ 
++case "${UNAME_SYSTEM}" in
++Linux|GNU|GNU/*)
++	# If the system lacks a compiler, then just pick glibc.
++	# We could probably try harder.
++	LIBC=gnu
++
++	eval $set_cc_for_build
++	cat <<-EOF > $dummy.c
++	#include <features.h>
++	#if defined(__UCLIBC__)
++	LIBC=uclibc
++	#elif defined(__dietlibc__)
++	LIBC=dietlibc
++	#else
++	LIBC=gnu
++	#endif
++	EOF
++	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
++	;;
++esac
++
+ # Note: order is significant - the case branches are not exclusive.
+ 
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+@@ -200,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+ 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ 	echo "${machine}-${os}${release}"
+ 	exit ;;
++    *:Bitrig:*:*)
++	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
++	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
++	exit ;;
+     *:OpenBSD:*:*)
+ 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+@@ -302,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ 	echo arm-acorn-riscix${UNAME_RELEASE}
+ 	exit ;;
+-    arm:riscos:*:*|arm:RISCOS:*:*)
++    arm*:riscos:*:*|arm*:RISCOS:*:*)
+ 	echo arm-unknown-riscos
+ 	exit ;;
+     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+@@ -801,6 +820,9 @@ EOF
+     i*:CYGWIN*:*)
+ 	echo ${UNAME_MACHINE}-pc-cygwin
+ 	exit ;;
++    *:MINGW64*:*)
++	echo ${UNAME_MACHINE}-pc-mingw64
++	exit ;;
+     *:MINGW*:*)
+ 	echo ${UNAME_MACHINE}-pc-mingw32
+ 	exit ;;
+@@ -852,21 +874,21 @@ EOF
+ 	exit ;;
+     *:GNU:*:*)
+ 	# the GNU system
+-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
++	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ 	exit ;;
+     *:GNU/*:*:*)
+ 	# other systems with GNU libc and userland
+-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
++	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ 	exit ;;
+     i*86:Minix:*:*)
+ 	echo ${UNAME_MACHINE}-pc-minix
+ 	exit ;;
+     aarch64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     aarch64_be:Linux:*:*)
+ 	UNAME_MACHINE=aarch64_be
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     alpha:Linux:*:*)
+ 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+@@ -879,59 +901,54 @@ EOF
+ 	  EV68*) UNAME_MACHINE=alphaev68 ;;
+ 	esac
+ 	objdump --private-headers /bin/sh | grep -q ld.so.1
+-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
++	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
++    arc:Linux:*:* | arceb:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     arm*:Linux:*:*)
+ 	eval $set_cc_for_build
+ 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ 	    | grep -q __ARM_EABI__
+ 	then
+-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
++	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	else
+ 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ 		| grep -q __ARM_PCS_VFP
+ 	    then
+-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
++		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+ 	    else
+-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
++		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+ 	    fi
+ 	fi
+ 	exit ;;
+     avr32*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     cris:Linux:*:*)
+-	echo ${UNAME_MACHINE}-axis-linux-gnu
++	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
+     crisv32:Linux:*:*)
+-	echo ${UNAME_MACHINE}-axis-linux-gnu
++	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
+     frv:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     hexagon:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:Linux:*:*)
+-	LIBC=gnu
+-	eval $set_cc_for_build
+-	sed 's/^	//' << EOF >$dummy.c
+-	#ifdef __dietlibc__
+-	LIBC=dietlibc
+-	#endif
+-EOF
+-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
++	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ 	exit ;;
+     ia64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     m32r*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     m68*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     mips:Linux:*:* | mips64:Linux:*:*)
+ 	eval $set_cc_for_build
+@@ -950,54 +967,63 @@ EOF
+ 	#endif
+ EOF
+ 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
++	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ 	;;
++    or1k:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
+     or32:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     padre:Linux:*:*)
+-	echo sparc-unknown-linux-gnu
++	echo sparc-unknown-linux-${LIBC}
+ 	exit ;;
+     parisc64:Linux:*:* | hppa64:Linux:*:*)
+-	echo hppa64-unknown-linux-gnu
++	echo hppa64-unknown-linux-${LIBC}
+ 	exit ;;
+     parisc:Linux:*:* | hppa:Linux:*:*)
+ 	# Look for CPU level
+ 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+-	  *)    echo hppa-unknown-linux-gnu ;;
++	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
++	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
++	  *)    echo hppa-unknown-linux-${LIBC} ;;
+ 	esac
+ 	exit ;;
+     ppc64:Linux:*:*)
+-	echo powerpc64-unknown-linux-gnu
++	echo powerpc64-unknown-linux-${LIBC}
+ 	exit ;;
+     ppc:Linux:*:*)
+-	echo powerpc-unknown-linux-gnu
++	echo powerpc-unknown-linux-${LIBC}
++	exit ;;
++    ppc64le:Linux:*:*)
++	echo powerpc64le-unknown-linux-${LIBC}
++	exit ;;
++    ppcle:Linux:*:*)
++	echo powerpcle-unknown-linux-${LIBC}
+ 	exit ;;
+     s390:Linux:*:* | s390x:Linux:*:*)
+-	echo ${UNAME_MACHINE}-ibm-linux
++	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+ 	exit ;;
+     sh64*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     sh*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     sparc:Linux:*:* | sparc64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     tile*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     vax:Linux:*:*)
+-	echo ${UNAME_MACHINE}-dec-linux-gnu
++	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ 	exit ;;
+     x86_64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     xtensa*:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:DYNIX/ptx:4*:*)
+ 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+@@ -1201,6 +1227,9 @@ EOF
+     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+ 	echo i586-pc-haiku
+ 	exit ;;
++    x86_64:Haiku:*:*)
++	echo x86_64-unknown-haiku
++	exit ;;
+     SX-4:SUPER-UX:*:*)
+ 	echo sx4-nec-superux${UNAME_RELEASE}
+ 	exit ;;
+@@ -1227,19 +1256,21 @@ EOF
+ 	exit ;;
+     *:Darwin:*:*)
+ 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+-	case $UNAME_PROCESSOR in
+-	    i386)
+-		eval $set_cc_for_build
+-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+-		      grep IS_64BIT_ARCH >/dev/null
+-		  then
+-		      UNAME_PROCESSOR="x86_64"
+-		  fi
+-		fi ;;
+-	    unknown) UNAME_PROCESSOR=powerpc ;;
+-	esac
++	eval $set_cc_for_build
++	if test "$UNAME_PROCESSOR" = unknown ; then
++	    UNAME_PROCESSOR=powerpc
++	fi
++	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
++	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
++		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
++		grep IS_64BIT_ARCH >/dev/null
++	    then
++		case $UNAME_PROCESSOR in
++		    i386) UNAME_PROCESSOR=x86_64 ;;
++		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
++		esac
++	    fi
++	fi
+ 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ 	exit ;;
+     *:procnto*:*:* | *:QNX:[0123456789]*:*)
+@@ -1330,9 +1361,6 @@ EOF
+ 	exit ;;
+ esac
+ 
+-#echo '(No uname command or uname output not recognized.)' 1>&2
+-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+-
+ eval $set_cc_for_build
+ cat >$dummy.c <<EOF
+ #ifdef _SEQUENT_
+--- isl-0.11.1/m4/libtool.m4.jj	2011-11-24 13:37:42.000000000 +0100
++++ isl-0.11.1/m4/libtool.m4	2014-04-10 20:45:52.524663864 +0200
+@@ -1268,7 +1268,7 @@ ia64-*-hpux*)
+   rm -rf conftest*
+   ;;
+ 
+-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
++x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+   # Find out which ABI we are using.
+   echo 'int i;' > conftest.$ac_ext
+@@ -1282,7 +1282,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_i386"
+ 	    ;;
+-	  ppc64-*linux*|powerpc64-*linux*)
++	  powerpc64le-*linux*)
++	    LD="${LD-ld} -m elf32lppclinux"
++	    ;;
++	  powerpc64-*linux*)
+ 	    LD="${LD-ld} -m elf32ppclinux"
+ 	    ;;
+ 	  s390x-*linux*)
+@@ -1301,7 +1304,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
+ 	  x86_64-*linux*)
+ 	    LD="${LD-ld} -m elf_x86_64"
+ 	    ;;
+-	  ppc*-*linux*|powerpc*-*linux*)
++	  powerpcle-*linux*)
++	    LD="${LD-ld} -m elf64lppc"
++	    ;;
++	  powerpc-*linux*)
+ 	    LD="${LD-ld} -m elf64ppc"
+ 	    ;;
+ 	  s390*-*linux*|s390*-*tpf*)
diff --git a/SPECS/gcc.spec b/SPECS/gcc.spec
index 2c3f959..fa0f6e2 100644
--- a/SPECS/gcc.spec
+++ b/SPECS/gcc.spec
@@ -1,13 +1,12 @@
-%global DATE 20140120
-%global SVNREV 206854
-%global gcc_version 4.8.2
+%global DATE 20140911
+%global SVNREV 215159
 # Note, gcc_release must be integer, if you want to add suffixes to
 # %{release}, append them after %{gcc_release} on Release: line.
-%global gcc_release 16
+%global gcc_release 9
 %global _unpackaged_files_terminate_build 0
 %global _performance_build 1
 %global multilib_64_archs sparc64 ppc64 ppc64p7 s390x x86_64
-%ifarch %{ix86} x86_64 ia64 ppc ppc64 ppc64p7 alpha
+%ifarch %{ix86} x86_64 ia64 ppc ppc64 ppc64le ppc64p7 alpha aarch64
 %global build_ada 1
 %else
 %global build_ada 0
@@ -17,7 +16,7 @@
 %else
 %global build_java 1
 %endif
-%ifarch %{ix86} x86_64 ppc ppc64 ppc64p7 s390 s390x %{arm}
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm}
 %global build_go 1
 %else
 %global build_go 0
@@ -37,19 +36,19 @@
 %else
 %global build_libtsan 0
 %endif
-%ifarch %{ix86} x86_64 ppc ppc64 ppc64p7 s390 s390x %{arm}
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm}
 %global build_libatomic 1
 %else
 %global build_libatomic 0
 %endif
-%ifarch %{ix86} x86_64 %{arm} alpha ppc ppc64 ppc64p7 s390 s390x
+%ifarch %{ix86} x86_64 %{arm} alpha ppc ppc64 ppc64le ppc64p7 s390 s390x aarch64
 %global build_libitm 1
 %else
 %global build_libitm 0
 %endif
 %global build_cloog 1
 %global build_libstdcxx_docs 1
-%ifarch %{ix86} x86_64 ppc ppc64 ppc64p7 s390 s390x %{arm} aarch64
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm} aarch64
 %global attr_ifunc 1
 %else
 %global attr_ifunc 0
@@ -74,15 +73,23 @@
 %endif
 Summary: Various compilers (C, C++, Objective-C, Java, ...)
 Name: gcc
-Version: %{gcc_version}
-Release: %{gcc_release}.2%{?dist}
+%if 0%{?rhel} == 7
+%global gcc_version 4.8.2
+%else
+%global gcc_version 4.8.3
+%endif
+Version: 4.8.3
+Release: %{gcc_release}%{?dist}
+%if "%{version}" != "%{gcc_version}"
+%define gcc_provides %{gcc_version}-16%{?dist}
+%endif
 # libgcc, libgfortran, libmudflap, libgomp, libstdc++ and crtstuff have
 # GCC Runtime Exception.
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
 Group: Development/Languages
 # The source for this package was pulled from upstream's vcs.  Use the
 # following commands to generate the tarball:
-# svn export svn://gcc.gnu.org/svn/gcc/branches/redhat/gcc-4_7-branch@%{SVNREV} gcc-%{version}-%{DATE}
+# svn export svn://gcc.gnu.org/svn/gcc/branches/redhat/gcc-4_8-branch@%{SVNREV} gcc-%{version}-%{DATE}
 # tar cf - gcc-%{version}-%{DATE} | bzip2 -9 > gcc-%{version}-%{DATE}.tar.bz2
 Source0: gcc-%{version}-%{DATE}.tar.bz2
 %global isl_version 0.11.1
@@ -129,7 +136,7 @@ BuildRequires: gcc-java, libgcj
 BuildRequires: glibc-devel >= 2.4.90-13
 BuildRequires: elfutils-devel >= 0.147
 BuildRequires: elfutils-libelf-devel >= 0.147
-%ifarch ppc ppc64 ppc64p7 s390 s390x sparc sparcv9 alpha
+%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha
 # Make sure glibc supports TFmode long double
 BuildRequires: glibc >= 2.3.90-35
 %endif
@@ -166,7 +173,7 @@ Requires: binutils >= 2.20.51.0.2-12
 # Make sure gdb will understand DW_FORM_strp
 Conflicts: gdb < 5.1-2
 Requires: glibc-devel >= 2.2.90-12
-%ifarch ppc ppc64 ppc64p7 s390 s390x sparc sparcv9 alpha
+%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha
 # Make sure glibc supports TFmode long double
 Requires: glibc >= 2.3.90-35
 %endif
@@ -185,6 +192,9 @@ Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
 AutoReq: true
 Provides: bundled(libiberty)
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc = %{gcc_provides}
+%endif
 
 Patch0: gcc48-hack.patch
 Patch1: gcc48-java-nomulti.patch
@@ -204,15 +214,13 @@ Patch14: gcc48-pr56493.patch
 Patch15: gcc48-color-auto.patch
 Patch16: gcc48-pr28865.patch
 Patch17: gcc48-libgo-p224.patch
-Patch18: gcc48-pr60137.patch
-Patch19: gcc48-pr60010.patch
-Patch20: gcc48-pr60046.patch
-Patch21: gcc48-pr57896.patch
-Patch22: gcc48-pr60272.patch
-Patch23: gcc48-pr60233.patch
-Patch24: gcc48-pr60274.patch
-Patch25: gcc48-rh1121077.patch
-Patch26: gcc48-pr61801.patch
+Patch18: gcc48-pr60010.patch
+Patch19: gcc48-aarch64-ada.patch
+Patch20: gcc48-aarch64-async-unw-tables.patch
+Patch21: gcc48-aarch64-unwind-opt.patch
+Patch22: gcc48-pr63341.patch
+Patch23: gcc48-pr63284.patch
+Patch24: gcc48-test-compat-Wno-abi.patch
 
 Patch1000: fastjar-0.97-segfault.patch
 Patch1001: fastjar-0.97-len1.patch
@@ -220,8 +228,12 @@ Patch1002: fastjar-0.97-filename0.patch
 Patch1003: fastjar-CVE-2010-0831.patch
 Patch1004: fastjar-man.patch
 Patch1005: fastjar-0.97-aarch64-config.patch
+Patch1006: fastjar-0.97-ppc64le-config.patch
 
 Patch1100: isl-%{isl_version}-aarch64-config.patch
+Patch1101: isl-%{isl_version}-ppc64le-config.patch
+
+Patch1200: cloog-%{cloog_version}-ppc64le-config.patch
 
 # On ARM EABI systems, we do want -gnueabi to be part of the
 # target triple.
@@ -246,6 +258,9 @@ You'll need this package in order to compile C code.
 Summary: GCC version 4.8 shared support library
 Group: System Environment/Libraries
 Autoreq: false
+%if "%{version}" != "%{gcc_version}"
+Provides: libgcc = %{gcc_provides}
+%endif
 
 %description -n libgcc
 This package contains GCC shared support library which is needed
@@ -258,6 +273,9 @@ Requires: gcc = %{version}-%{release}
 Requires: libstdc++ = %{version}-%{release}
 Requires: libstdc++-devel = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-c++ = %{gcc_provides}
+%endif
 
 %description c++
 This package adds C++ support to the GNU Compiler Collection.
@@ -269,6 +287,9 @@ Summary: GNU Standard C++ Library
 Group: System Environment/Libraries
 Autoreq: true
 Requires: glibc >= 2.10.90-7
+%if "%{version}" != "%{gcc_version}"
+Provides: libstdc++ = %{gcc_provides}
+%endif
 
 %description -n libstdc++
 The libstdc++ package contains a rewritten standard compliant GCC Standard
@@ -279,6 +300,9 @@ Summary: Header files and libraries for C++ development
 Group: Development/Libraries
 Requires: libstdc++%{?_isa} = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libstdc++-devel = %{gcc_provides}
+%endif
 
 %description -n libstdc++-devel
 This is the GNU implementation of the standard C++ libraries.  This
@@ -290,6 +314,9 @@ Summary: Static libraries for the GNU standard C++ library
 Group: Development/Libraries
 Requires: libstdc++-devel = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libstdc++-static = %{gcc_provides}
+%endif
 
 %description -n libstdc++-static
 Static libraries for the GNU standard C++ library.
@@ -298,6 +325,9 @@ Static libraries for the GNU standard C++ library.
 Summary: Documentation for the GNU standard C++ library
 Group: Development/Libraries
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libstdc++-docs = %{gcc_provides}
+%endif
 
 %description -n libstdc++-docs
 Manual, doxygen generated API information and Frequently Asked Questions
@@ -309,6 +339,9 @@ Group: Development/Languages
 Requires: gcc = %{version}-%{release}
 Requires: libobjc = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-objc = %{gcc_provides}
+%endif
 
 %description objc
 gcc-objc provides Objective-C support for the GCC.
@@ -320,6 +353,9 @@ Summary: Objective-C++ support for GCC
 Group: Development/Languages
 Requires: gcc-c++ = %{version}-%{release}, gcc-objc = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-objc++ = %{gcc_provides}
+%endif
 
 %description objc++
 gcc-objc++ package provides Objective-C++ support for the GCC.
@@ -328,6 +364,9 @@ gcc-objc++ package provides Objective-C++ support for the GCC.
 Summary: Objective-C runtime
 Group: System Environment/Libraries
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libobjc = %{gcc_provides}
+%endif
 
 %description -n libobjc
 This package contains Objective-C shared library which is needed to run
@@ -346,6 +385,9 @@ BuildRequires: gmp-devel >= 4.1.2-8, mpfr-devel >= 2.2.1, libmpc-devel >= 0.8.1
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-gfortran = %{gcc_provides}
+%endif
 
 %description gfortran
 The gcc-gfortran package provides support for compiling Fortran
@@ -358,6 +400,9 @@ Autoreq: true
 %if %{build_libquadmath}
 Requires: libquadmath = %{version}-%{release}
 %endif
+%if "%{version}" != "%{gcc_version}"
+Provides: libgfortran = %{gcc_provides}
+%endif
 
 %description -n libgfortran
 This package contains Fortran shared library which is needed to run
@@ -371,6 +416,9 @@ Requires: gcc = %{version}-%{release}
 %if %{build_libquadmath}
 Requires: libquadmath-static = %{version}-%{release}
 %endif
+%if "%{version}" != "%{gcc_version}"
+Provides: libgfortran-static = %{gcc_provides}
+%endif
 
 %description -n libgfortran-static
 This package contains static Fortran libraries.
@@ -380,6 +428,9 @@ Summary: GCC OpenMP v3.0 shared support library
 Group: System Environment/Libraries
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
+%if "%{version}" != "%{gcc_version}"
+Provides: libgomp = %{gcc_provides}
+%endif
 
 %description -n libgomp
 This package contains GCC shared support library which is needed
@@ -388,6 +439,9 @@ for OpenMP v3.0 support.
 %package -n libmudflap
 Summary: GCC mudflap shared support library
 Group: System Environment/Libraries
+%if "%{version}" != "%{gcc_version}"
+Provides: libmudflap = %{gcc_provides}
+%endif
 
 %description -n libmudflap
 This package contains GCC shared support library which is needed
@@ -398,6 +452,9 @@ Summary: GCC mudflap support
 Group: Development/Libraries
 Requires: libmudflap = %{version}-%{release}
 Requires: gcc = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libmudflap-devel = %{gcc_provides}
+%endif
 
 %description -n libmudflap-devel
 This package contains headers for building mudflap-instrumented programs.
@@ -410,6 +467,9 @@ also add -fmudflapth and -lmudflapth.
 Summary: Static libraries for mudflap support
 Group: Development/Libraries
 Requires: libmudflap-devel = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libmudflap-static = %{gcc_provides}
+%endif
 
 %description -n libmudflap-static
 This package contains static libraries for building mudflap-instrumented
@@ -420,6 +480,9 @@ Summary: GCC __float128 shared support library
 Group: System Environment/Libraries
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
+%if "%{version}" != "%{gcc_version}"
+Provides: libquadmath = %{gcc_provides}
+%endif
 
 %description -n libquadmath
 This package contains GCC shared support library which is needed
@@ -430,6 +493,9 @@ Summary: GCC __float128 support
 Group: Development/Libraries
 Requires: libquadmath = %{version}-%{release}
 Requires: gcc = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libquadmath-devel = %{gcc_provides}
+%endif
 
 %description -n libquadmath-devel
 This package contains headers for building Fortran programs using
@@ -439,6 +505,9 @@ REAL*16 and programs using __float128 math.
 Summary: Static libraries for __float128 support
 Group: Development/Libraries
 Requires: libquadmath-devel = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libquadmath-static = %{gcc_provides}
+%endif
 
 %description -n libquadmath-static
 This package contains static libraries for building Fortran programs
@@ -449,6 +518,9 @@ Summary: The GNU Transactional Memory library
 Group: System Environment/Libraries
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
+%if "%{version}" != "%{gcc_version}"
+Provides: libitm = %{gcc_provides}
+%endif
 
 %description -n libitm
 This package contains the GNU Transactional Memory library
@@ -459,6 +531,9 @@ Summary: The GNU Transactional Memory support
 Group: Development/Libraries
 Requires: libitm = %{version}-%{release}
 Requires: gcc = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libitm-devel = %{gcc_provides}
+%endif
 
 %description -n libitm-devel
 This package contains headers and support files for the
@@ -468,6 +543,9 @@ GNU Transactional Memory library.
 Summary: The GNU Transactional Memory static library
 Group: Development/Libraries
 Requires: libitm-devel = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libitm-static = %{gcc_provides}
+%endif
 
 %description -n libitm-static
 This package contains GNU Transactional Memory static libraries.
@@ -477,6 +555,9 @@ Summary: The GNU Atomic library
 Group: System Environment/Libraries
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
+%if "%{version}" != "%{gcc_version}"
+Provides: libatomic = %{gcc_provides}
+%endif
 
 %description -n libatomic
 This package contains the GNU Atomic library
@@ -487,6 +568,9 @@ by hardware.
 Summary: The GNU Atomic static library
 Group: Development/Libraries
 Requires: libatomic = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libatomic-static = %{gcc_provides}
+%endif
 
 %description -n libatomic-static
 This package contains GNU Atomic static libraries.
@@ -496,6 +580,9 @@ Summary: The Address Sanitizer runtime library
 Group: System Environment/Libraries
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
+%if "%{version}" != "%{gcc_version}"
+Provides: libasan = %{gcc_provides}
+%endif
 
 %description -n libasan
 This package contains the Address Sanitizer library
@@ -505,6 +592,9 @@ which is used for -fsanitize=address instrumented programs.
 Summary: The Address Sanitizer static library
 Group: Development/Libraries
 Requires: libasan = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libasan-static = %{gcc_provides}
+%endif
 
 %description -n libasan-static
 This package contains Address Sanitizer static runtime library.
@@ -514,6 +604,9 @@ Summary: The Thread Sanitizer runtime library
 Group: System Environment/Libraries
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
+%if "%{version}" != "%{gcc_version}"
+Provides: libtsan = %{gcc_provides}
+%endif
 
 %description -n libtsan
 This package contains the Thread Sanitizer library
@@ -523,6 +616,9 @@ which is used for -fsanitize=thread instrumented programs.
 Summary: The Thread Sanitizer static library
 Group: Development/Libraries
 Requires: libtsan = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libtsan-static = %{gcc_provides}
+%endif
 
 %description -n libtsan-static
 This package contains Thread Sanitizer static runtime library.
@@ -537,6 +633,9 @@ Requires: /usr/share/java/eclipse-ecj.jar
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-java = %{gcc_provides}
+%endif
 
 %description java
 This package adds support for compiling Java(tm) programs and
@@ -560,6 +659,9 @@ BuildRequires: libXtst-devel
 BuildRequires: libXt-devel
 %endif
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libgcj = %{gcc_provides}
+%endif
 
 %description -n libgcj
 The Java(tm) runtime library. You will need this package to run your Java
@@ -573,6 +675,9 @@ Requires: zlib-devel%{?_isa}
 Requires: /bin/awk
 Autoreq: false
 Autoprov: false
+%if "%{version}" != "%{gcc_version}"
+Provides: libgcj-devel = %{gcc_provides}
+%endif
 
 %description -n libgcj-devel
 The Java(tm) static libraries and C header files. You will need this
@@ -583,6 +688,9 @@ Summary: Java library sources from GCC4 preview
 Group: System Environment/Libraries
 Requires: libgcj = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libgcj-src = %{gcc_provides}
+%endif
 
 %description -n libgcj-src
 The Java(tm) runtime library sources for use in Eclipse.
@@ -595,6 +703,9 @@ Provides: /lib/cpp
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: cpp = %{gcc_provides}
+%endif
 
 %description -n cpp
 Cpp is the GNU C-Compatible Compiler Preprocessor.
@@ -626,6 +737,9 @@ Requires: libgnat = %{version}-%{release}, libgnat-devel = %{version}-%{release}
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-gnat = %{gcc_provides}
+%endif
 
 %description gnat
 GNAT is a GNU Ada 95 front-end to GCC. This package includes development tools,
@@ -635,6 +749,9 @@ the documents and Ada 95 compiler.
 Summary: GNU Ada 95 runtime shared libraries
 Group: System Environment/Libraries
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libgnat = %{gcc_provides}
+%endif
 
 %description -n libgnat
 GNAT is a GNU Ada 95 front-end to GCC. This package includes shared libraries,
@@ -644,6 +761,9 @@ which are required to run programs compiled with the GNAT.
 Summary: GNU Ada 95 libraries
 Group: Development/Languages
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libgnat-devel = %{gcc_provides}
+%endif
 
 %description -n libgnat-devel
 GNAT is a GNU Ada 95 front-end to GCC. This package includes libraries,
@@ -654,6 +774,9 @@ Summary: GNU Ada 95 static libraries
 Group: Development/Languages
 Requires: libgnat-devel = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libgnat-static = %{gcc_provides}
+%endif
 
 %description -n libgnat-static
 GNAT is a GNU Ada 95 front-end to GCC. This package includes static libraries.
@@ -667,6 +790,9 @@ Requires: libgo-devel = %{version}-%{release}
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-go = %{gcc_provides}
+%endif
 
 %description go
 The gcc-go package provides support for compiling Go programs
@@ -676,6 +802,9 @@ with the GNU Compiler Collection.
 Summary: Go runtime
 Group: System Environment/Libraries
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libgo = %{gcc_provides}
+%endif
 
 %description -n libgo
 This package contains Go shared library which is needed to run
@@ -686,6 +815,9 @@ Summary: Go development libraries
 Group: Development/Languages
 Requires: libgo = %{version}-%{release}
 Autoreq: true
+%if "%{version}" != "%{gcc_version}"
+Provides: libgo-devel = %{gcc_provides}
+%endif
 
 %description -n libgo-devel
 This package includes libraries and support files for compiling
@@ -696,6 +828,9 @@ Summary: Static Go libraries
 Group: Development/Libraries
 Requires: libgo = %{version}-%{release}
 Requires: gcc = %{version}-%{release}
+%if "%{version}" != "%{gcc_version}"
+Provides: libgo-static = %{gcc_provides}
+%endif
 
 %description -n libgo-static
 This package contains static Go libraries.
@@ -705,6 +840,9 @@ Summary: Support for compiling GCC plugins
 Group: Development/Languages
 Requires: gcc = %{version}-%{release}
 Requires: gmp-devel >= 4.1.2-8, mpfr-devel >= 2.2.1, libmpc-devel >= 0.8.1
+%if "%{version}" != "%{gcc_version}"
+Provides: gcc-plugin-devel = %{gcc_provides}
+%endif
 
 %description plugin-devel
 This package contains header files and other support files
@@ -775,15 +913,15 @@ package or when debugging this package.
 %patch16 -p0 -b .pr28865~
 %patch17 -p0 -b .libgo-p224~
 rm -f libgo/go/crypto/elliptic/p224{,_test}.go
-%patch18 -p0 -b .pr60137~
-%patch19 -p0 -b .pr60010~
-%patch20 -p0 -b .pr60046~
-%patch21 -p0 -b .pr57896~
-%patch22 -p0 -b .pr60272~
-%patch23 -p0 -b .pr60233~
-%patch24 -p0 -b .pr60274~
-%patch25 -p0 -b .rh1121077~
-%patch26 -p0 -b .pr61801~
+%patch18 -p0 -b .pr60010~
+%ifarch aarch64
+%patch19 -p0 -b .aarch64-ada~
+%endif
+%patch20 -p0 -b .aarch64-async-unw-tables~
+%patch21 -p0 -b .aarch64-unwind-opt~
+%patch22 -p0 -b .pr63341~
+%patch23 -p0 -b .pr63284~
+%patch24 -p0 -b .test-compat-Wno-abi~
 
 %if 0%{?_enable_debug_packages}
 cat > split-debuginfo.sh <<\EOF
@@ -843,14 +981,18 @@ tar xzf %{SOURCE4}
 %patch1003 -p0 -b .fastjar-CVE-2010-0831~
 %patch1004 -p0 -b .fastjar-man~
 %patch1005 -p0 -b .fastjar-0.97-aarch64-config~
+%patch1006 -p0 -b .fastjar-0.97-ppc64le-config~
 
 %if %{bootstrap_java}
 tar xjf %{SOURCE10}
 %endif
 
-%patch1100 -p0 -b .isl-aarch64~
+%patch1100 -p0 -b .isl-aarch64-config~
+%patch1101 -p0 -b .isl-ppc64le-config~
 
-sed -i -e 's/4\.8\.3/4.8.2/' gcc/BASE-VER
+%patch1200 -p0 -b .cloog-ppc64le-config~
+
+sed -i -e 's/4\.8\.4/4.8.3/' gcc/BASE-VER
 echo 'Red Hat %{version}-%{gcc_release}' > gcc/DEV-PHASE
 
 %if 0%{?fedora} >= 16 || 0%{?rhel} >= 7
@@ -1013,7 +1155,7 @@ EOF
 chmod +x gcc64
 CC=`pwd`/gcc64
 %endif
-%ifarch ppc64 ppc64p7
+%ifarch ppc64 ppc64le ppc64p7
 if gcc -m64 -xc -S /dev/null -o - > /dev/null 2>&1; then
   cat > gcc64 <<"EOF"
 #!/bin/sh
@@ -1074,12 +1216,15 @@ CC="$CC" CFLAGS="$OPT_FLAGS" \
 %ifarch %{arm}
 	--disable-sjlj-exceptions \
 %endif
-%ifarch ppc ppc64 ppc64p7
+%ifarch ppc ppc64 ppc64le ppc64p7
 	--enable-secureplt \
 %endif
-%ifarch sparc sparcv9 sparc64 ppc ppc64 ppc64p7 s390 s390x alpha
+%ifarch sparc sparcv9 sparc64 ppc ppc64 ppc64le ppc64p7 s390 s390x alpha
 	--with-long-double-128 \
 %endif
+%ifarch ppc64le
+	--disable-multilib \
+%endif
 %ifarch sparc
 	--disable-linux-futex \
 %endif
@@ -1089,6 +1234,9 @@ CC="$CC" CFLAGS="$OPT_FLAGS" \
 %ifarch sparc sparcv9
 	--host=%{gcc_target_platform} --build=%{gcc_target_platform} --target=%{gcc_target_platform} --with-cpu=v7
 %endif
+%ifarch ppc64le
+       --with-cpu-64=power7 --with-tune-64=power8 \
+%endif
 %ifarch ppc ppc64 ppc64p7
 %if 0%{?rhel} >= 7
 	--with-cpu-32=power7 --with-tune-32=power7 --with-cpu-64=power7 --with-tune-64=power7 \
@@ -1248,8 +1396,8 @@ make DESTDIR=%{buildroot} -C %{gcc_target_platform}/libjava install-src.zip
 chmod 644 %{buildroot}%{_infodir}/gnat*
 %endif
 
-FULLPATH=%{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
-FULLEPATH=%{buildroot}%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+FULLPATH=%{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+FULLEPATH=%{buildroot}%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
 
 %if %{build_cloog}
 cp -a cloog-install/lib/libcloog-isl.so.4 $FULLPATH/
@@ -1267,7 +1415,7 @@ ln -sf gcc %{buildroot}%{_prefix}/bin/gnatgcc
 cxxconfig="`find %{gcc_target_platform}/libstdc++-v3/include -name c++config.h`"
 for i in `find %{gcc_target_platform}/[36]*/libstdc++-v3/include -name c++config.h 2>/dev/null`; do
   if ! diff -up $cxxconfig $i; then
-    cat > %{buildroot}%{_prefix}/include/c++/%{gcc_version}/%{gcc_target_platform}/bits/c++config.h <<EOF
+    cat > %{buildroot}%{_prefix}/include/c++/%{version}/%{gcc_target_platform}/bits/c++config.h <<EOF
 #ifndef _CPP_CPPCONFIG_WRAPPER
 #define _CPP_CPPCONFIG_WRAPPER 1
 #include <bits/wordsize.h>
@@ -1290,7 +1438,7 @@ EOF
   fi
 done
 
-for f in `find %{buildroot}%{_prefix}/include/c++/%{gcc_version}/%{gcc_target_platform}/ -name c++config.h`; do
+for f in `find %{buildroot}%{_prefix}/include/c++/%{version}/%{gcc_target_platform}/ -name c++config.h`; do
   for i in 1 2 4 8; do
     sed -i -e 's/#define _GLIBCXX_ATOMIC_BUILTINS_'$i' 1/#ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_'$i'\
 &\
@@ -1307,7 +1455,7 @@ done
 # 4) it is huge
 # People can always precompile on their own whatever they want, but
 # shipping this for everybody is unnecessary.
-rm -rf %{buildroot}%{_prefix}/include/c++/%{gcc_version}/%{gcc_target_platform}/bits/*.h.gch
+rm -rf %{buildroot}%{_prefix}/include/c++/%{version}/%{gcc_target_platform}/bits/*.h.gch
 
 %if %{build_libstdcxx_docs}
 libstdcxx_doc_builddir=%{gcc_target_platform}/libstdc++-v3/doc/doxygen
@@ -1360,9 +1508,9 @@ mv %{buildroot}%{_prefix}/%{_lib}/libitm.spec $FULLPATH/
 %endif
 
 mkdir -p %{buildroot}/%{_lib}
-mv -f %{buildroot}%{_prefix}/%{_lib}/libgcc_s.so.1 %{buildroot}/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
-chmod 755 %{buildroot}/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
-ln -sf libgcc_s-%{gcc_version}-%{DATE}.so.1 %{buildroot}/%{_lib}/libgcc_s.so.1
+mv -f %{buildroot}%{_prefix}/%{_lib}/libgcc_s.so.1 %{buildroot}/%{_lib}/libgcc_s-%{version}-%{DATE}.so.1
+chmod 755 %{buildroot}/%{_lib}/libgcc_s-%{version}-%{DATE}.so.1
+ln -sf libgcc_s-%{version}-%{DATE}.so.1 %{buildroot}/%{_lib}/libgcc_s.so.1
 ln -sf /%{_lib}/libgcc_s.so.1 $FULLPATH/libgcc_s.so
 %ifarch sparcv9 ppc
 ln -sf /lib64/libgcc_s.so.1 $FULLPATH/64/libgcc_s.so
@@ -1428,7 +1576,7 @@ mv -f %{buildroot}%{_prefix}/%{_lib}/libstdc++*gdb.py* \
       %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/
 pushd ../libstdc++-v3/python
 for i in `find . -name \*.py`; do
-  touch -r $i %{buildroot}%{_prefix}/share/gcc-%{gcc_version}/python/$i
+  touch -r $i %{buildroot}%{_prefix}/share/gcc-%{version}/python/$i
 done
 touch -r hook.in %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/libstdc++*gdb.py
 popd
@@ -1737,33 +1885,33 @@ ln -sf lib64/adalib adalib
 %endif
 %else
 %ifarch %{multilib_64_archs}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libgfortran.a 32/libgfortran.a
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libstdc++.a 32/libstdc++.a
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libsupc++.a 32/libsupc++.a
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libmudflap.a 32/libmudflap.a
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libmudflapth.a 32/libmudflapth.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libgfortran.a 32/libgfortran.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libstdc++.a 32/libstdc++.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libsupc++.a 32/libsupc++.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libmudflap.a 32/libmudflap.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libmudflapth.a 32/libmudflapth.a
 %if %{build_libquadmath}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libquadmath.a 32/libquadmath.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libquadmath.a 32/libquadmath.a
 %endif
 %if %{build_libitm}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libitm.a 32/libitm.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libitm.a 32/libitm.a
 %endif
 %if %{build_libatomic}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libatomic.a 32/libatomic.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libatomic.a 32/libatomic.a
 %endif
 %if %{build_libasan}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libasan.a 32/libasan.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libasan.a 32/libasan.a
 %endif
 %if %{build_go}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libgo.a 32/libgo.a
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libgobegin.a 32/libgobegin.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libgo.a 32/libgo.a
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libgobegin.a 32/libgobegin.a
 %endif
 %if %{build_java}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libgcj_bc.so 32/libgcj_bc.so
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/libgcj_bc.so 32/libgcj_bc.so
 %endif
 %if %{build_ada}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/adainclude 32/adainclude
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/adalib 32/adalib
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/adainclude 32/adainclude
+ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{version}/adalib 32/adalib
 %endif
 %endif
 %endif
@@ -1840,6 +1988,31 @@ exec gcc $fl ${1+"$@"}
 EOF
 chmod 755 %{buildroot}%{_prefix}/bin/c?9
 
+%if "%{version}" != "%{gcc_version}"
+mv -f $RPM_BUILD_ROOT%{_prefix}/libexec/gcc/%{gcc_target_platform}/{%{version},%{gcc_version}}
+ln -sf %{gcc_version} $RPM_BUILD_ROOT%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/gcc/%{gcc_target_platform}/{%{version},%{gcc_version}}
+ln -sf %{gcc_version} $RPM_BUILD_ROOT%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+mv -f $RPM_BUILD_ROOT%{_prefix}/include/c++/{%{version},%{gcc_version}}
+ln -sf %{gcc_version} $RPM_BUILD_ROOT%{_prefix}/include/c++/%{version}
+mv -f $RPM_BUILD_ROOT%{_prefix}/share/gcc-{%{version},%{gcc_version}}
+ln -sf gcc-%{gcc_version} $RPM_BUILD_ROOT%{_prefix}/share/gcc-%{version}
+%if %{build_java}
+mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/gcj-{%{version},%{gcc_version}}
+ln -sf gcj-%{gcc_version} $RPM_BUILD_ROOT%{_prefix}/%{_lib}/gcj-%{version}
+mv -f $RPM_BUILD_ROOT%{_prefix}/share/java/libgcj-{%{version},%{gcc_version}}.jar
+ln -sf libgcj-%{gcc_version}.jar $RPM_BUILD_ROOT%{_prefix}/share/java/libgcj-%{version}.jar
+mv -f $RPM_BUILD_ROOT%{_prefix}/share/java/libgcj-tools-{%{version},%{gcc_version}}.jar
+ln -sf libgcj-tools-%{gcc_version}.jar $RPM_BUILD_ROOT%{_prefix}/share/java/libgcj-tools-%{version}.jar
+mv -f $RPM_BUILD_ROOT%{_prefix}/share/java/src-{%{version},%{gcc_version}}.zip
+ln -sf src-%{gcc_version}.zip $RPM_BUILD_ROOT%{_prefix}/share/java/src-%{version}.zip
+%endif
+%if %{build_go}
+mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/go/{%{version},%{gcc_version}}
+ln -sf %{gcc_version} $RPM_BUILD_ROOT%{_prefix}/%{_lib}/go/%{version}
+%endif
+%endif
+
 cd ..
 %find_lang %{name}
 %find_lang cpplib
@@ -1865,6 +2038,10 @@ rm -f %{buildroot}%{_prefix}/lib/lib*.so*
 rm -f %{buildroot}%{_prefix}/lib/lib*.a
 rm -f %{buildroot}/lib/libgcc_s*.so*
 %if %{build_go}
+%if "%{version}" != "%{gcc_version}"
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/go/{%{version},%{gcc_version}}
+ln -sf %{gcc_version} $RPM_BUILD_ROOT%{_prefix}/lib/go/%{version}
+%endif
 rm -rf %{buildroot}%{_prefix}/lib/go/%{gcc_version}/%{gcc_target_platform}
 %ifnarch sparc64 ppc64 ppc64p7
 ln -sf %{multilib_32_arch}-%{_vendor}-%{_target_os} %{buildroot}%{_prefix}/lib/go/%{gcc_version}/%{gcc_target_platform}
@@ -1876,6 +2053,10 @@ rm -f %{buildroot}%{_prefix}/lib64/lib*.so*
 rm -f %{buildroot}%{_prefix}/lib64/lib*.a
 rm -f %{buildroot}/lib64/libgcc_s*.so*
 %if %{build_go}
+%if "%{version}" != "%{gcc_version}"
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/go/{%{version},%{gcc_version}}
+ln -sf %{gcc_version} $RPM_BUILD_ROOT%{_prefix}/lib64/go/%{version}
+%endif
 rm -rf %{buildroot}%{_prefix}/lib64/go/%{gcc_version}/%{gcc_target_platform}
 %endif
 %endif
@@ -1883,11 +2064,11 @@ rm -rf %{buildroot}%{_prefix}/lib64/go/%{gcc_version}/%{gcc_target_platform}
 
 %if %{build_java}
 mkdir -p %{buildroot}%{_prefix}/share/java/gcj-endorsed \
-	 %{buildroot}%{_prefix}/%{_lib}/gcj-%{version}/classmap.db.d
+	 %{buildroot}%{_prefix}/%{_lib}/gcj-%{gcc_version}/classmap.db.d
 chmod 755 %{buildroot}%{_prefix}/share/java/gcj-endorsed \
-	  %{buildroot}%{_prefix}/%{_lib}/gcj-%{version} \
-	  %{buildroot}%{_prefix}/%{_lib}/gcj-%{version}/classmap.db.d
-touch %{buildroot}%{_prefix}/%{_lib}/gcj-%{version}/classmap.db
+	  %{buildroot}%{_prefix}/%{_lib}/gcj-%{gcc_version} \
+	  %{buildroot}%{_prefix}/%{_lib}/gcj-%{gcc_version}/classmap.db.d
+touch %{buildroot}%{_prefix}/%{_lib}/gcj-%{gcc_version}/classmap.db
 %endif
 
 rm -f %{buildroot}%{mandir}/man3/ffi*
@@ -2143,10 +2324,16 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/lto1
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/lto-wrapper
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/liblto_plugin.so*
@@ -2208,7 +2395,7 @@ fi
 %ifarch ia64
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/ia64intrin.h
 %endif
-%ifarch ppc ppc64 ppc64p7
+%ifarch ppc ppc64 ppc64le ppc64p7
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/ppc-asm.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/altivec.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/spe.h
@@ -2364,11 +2551,14 @@ fi
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/cc1
 
 %files -n libgcc
 %defattr(-,root,root,-)
-/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
+/%{_lib}/libgcc_s-%{version}-%{DATE}.so.1
 /%{_lib}/libgcc_s.so.1
 %doc gcc/COPYING* COPYING.RUNTIME
 
@@ -2381,9 +2571,15 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/cc1plus
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/64
@@ -2416,18 +2612,27 @@ fi
 %{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/libstdc*gdb.py*
 %dir %{_prefix}/share/gcc-%{gcc_version}
 %dir %{_prefix}/share/gcc-%{gcc_version}/python
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/share/gcc-%{version}
+%endif
 %{_prefix}/share/gcc-%{gcc_version}/python/libstdcxx
 
 %files -n libstdc++-devel
 %defattr(-,root,root,-)
 %dir %{_prefix}/include/c++
 %dir %{_prefix}/include/c++/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/include/c++/%{version}
+%endif
 %{_prefix}/include/c++/%{gcc_version}/[^gjos]*
 %{_prefix}/include/c++/%{gcc_version}/os*
 %{_prefix}/include/c++/%{gcc_version}/s[^u]*
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifnarch sparcv9 ppc %{multilib_64_archs}
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libstdc++.so
 %endif
@@ -2438,6 +2643,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libstdc++.a
@@ -2465,9 +2673,15 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/objc
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/cc1obj
@@ -2491,6 +2705,9 @@ fi
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/cc1objplus
 
 %files -n libobjc
@@ -2506,9 +2723,15 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/finclude
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/finclude/omp_lib.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/finclude/omp_lib.f90
@@ -2547,6 +2770,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libgfortran.a
@@ -2574,9 +2800,15 @@ fi
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/jc1
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/ecj1
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/jvgenmain
@@ -2640,26 +2872,35 @@ fi
 %{_prefix}/%{_lib}/libgcj-tools.so.*
 %{_prefix}/%{_lib}/libgcj_bc.so.*
 %{_prefix}/%{_lib}/libgij.so.*
-%dir %{_prefix}/%{_lib}/gcj-%{version}
-%{_prefix}/%{_lib}/gcj-%{version}/libgtkpeer.so
-%{_prefix}/%{_lib}/gcj-%{version}/libgjsmalsa.so
-%{_prefix}/%{_lib}/gcj-%{version}/libjawt.so
-%{_prefix}/%{_lib}/gcj-%{version}/libjvm.so
-%{_prefix}/%{_lib}/gcj-%{version}/libjavamath.so
+%dir %{_prefix}/%{_lib}/gcj-%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/%{_lib}/gcj-%{version}
+%endif
+%{_prefix}/%{_lib}/gcj-%{gcc_version}/libgtkpeer.so
+%{_prefix}/%{_lib}/gcj-%{gcc_version}/libgjsmalsa.so
+%{_prefix}/%{_lib}/gcj-%{gcc_version}/libjawt.so
+%{_prefix}/%{_lib}/gcj-%{gcc_version}/libjvm.so
+%{_prefix}/%{_lib}/gcj-%{gcc_version}/libjavamath.so
 %dir %{_prefix}/share/java
 %{_prefix}/share/java/[^sl]*
+%{_prefix}/share/java/libgcj-%{gcc_version}.jar
+%if "%{version}" != "%{gcc_version}"
 %{_prefix}/share/java/libgcj-%{version}.jar
+%endif
 %dir %{_prefix}/%{_lib}/security
 %config(noreplace) %{_prefix}/%{_lib}/security/classpath.security
 %{_prefix}/%{_lib}/logging.properties
-%dir %{_prefix}/%{_lib}/gcj-%{version}/classmap.db.d
-%attr(0644,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) %{_prefix}/%{_lib}/gcj-%{version}/classmap.db
+%dir %{_prefix}/%{_lib}/gcj-%{gcc_version}/classmap.db.d
+%attr(0644,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) %{_prefix}/%{_lib}/gcj-%{gcc_version}/classmap.db
 
 %files -n libgcj-devel
 %defattr(-,root,root,-)
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/gcj
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/jawt.h
@@ -2681,6 +2922,9 @@ fi
 %endif
 %dir %{_prefix}/include/c++
 %dir %{_prefix}/include/c++/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/include/c++/%{version}
+%endif
 %{_prefix}/include/c++/%{gcc_version}/[gj]*
 %{_prefix}/include/c++/%{gcc_version}/org
 %{_prefix}/include/c++/%{gcc_version}/sun
@@ -2692,8 +2936,11 @@ fi
 %defattr(-,root,root,-)
 %dir %{_prefix}/share/java
 %{_prefix}/share/java/src*.zip
+%{_prefix}/share/java/libgcj-tools-%{gcc_version}.jar
+%if "%{version}" != "%{gcc_version}"
 %{_prefix}/share/java/libgcj-tools-%{version}.jar
 %endif
+%endif
 
 %if %{build_ada}
 %files gnat
@@ -2704,9 +2951,15 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/64
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/64/adainclude
@@ -2734,6 +2987,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/adainclude
@@ -2760,6 +3016,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/adalib
@@ -2795,6 +3054,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/mf-runtime.h
 %ifnarch sparcv9 sparc64 ppc ppc64 ppc64p7
@@ -2808,6 +3070,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libmudflap.a
@@ -2835,6 +3100,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/quadmath.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/quadmath_weak.h
@@ -2848,6 +3116,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libquadmath.a
@@ -2872,6 +3143,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include
 #%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/itm.h
 #%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/itm_weak.h
@@ -2885,6 +3159,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libitm.a
@@ -2908,6 +3185,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libatomic.a
@@ -2932,6 +3212,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libasan.a
@@ -2956,6 +3239,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libtsan.a
 %doc rpm.doc/changelogs/libsanitizer/ChangeLog* libsanitizer/LICENSE.TXT
 %endif
@@ -2968,9 +3254,15 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/go1
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/64
@@ -3005,11 +3297,17 @@ fi
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
 %dir %{_prefix}/%{_lib}/go
 %dir %{_prefix}/%{_lib}/go/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/%{_lib}/go/%{version}
+%endif
 %{_prefix}/%{_lib}/go/%{gcc_version}/%{gcc_target_platform}
 %ifarch %{multilib_64_archs}
 %ifnarch sparc64 ppc64 ppc64p7
 %dir %{_prefix}/lib/go
 %dir %{_prefix}/lib/go/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/go/%{version}
+%endif
 %{_prefix}/lib/go/%{gcc_version}/%{gcc_target_platform}
 %endif
 %endif
@@ -3031,6 +3329,9 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %ifarch sparcv9 ppc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/lib32/libgo.a
@@ -3049,21 +3350,133 @@ fi
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/lib/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/plugin
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
+%if "%{version}" != "%{gcc_version}"
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{version}
+%endif
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/plugin
 
 %changelog
-* Wed Aug  6 2014 Jakub Jelinek <jakub@redhat.com> 4.8.2-16.2
-- backport two further OpenMP 4.0 libgomp tasking fixes (#1121077)
-- fix scheduler wrong-code with DEBUG_INSNs containing volatile ASM_OPERANDS
-  (#1127120, PR rtl-optimization/61801)
-
-* Fri Jul 18 2014 Jakub Jelinek <jakub@redhat.com> 4.8.2-16.1
-- backport OpenMP 4.0 support to libgomp (library only; #1121077,
-  PR libgomp/58691)
+* Fri Nov 14 2014 Richard Henderson <rth@redhat.com> 4.8.3-9
+- Enable Ada for ppc64le (#1162196)
+
+* Fri Sep 26 2014 Jakub Jelinek <jakub@redhat.com> 4.8.3-8
+- fix PowerPC unaligned vectorization bug (#1146871,
+  PR tree-optimization/63341)
+- fix another -fcompare-debug issue (PR debug/63284)
+
+* Thu Sep 11 2014 Jakub Jelinek <jakub@redhat.com> 4.8.3-7
+- update from the 4.8 branch
+  - fix ppc32 libgo.so.4 to avoid RWE PT_GNU_STACK
+
+* Wed Sep 10 2014 Jakub Jelinek <jakub@redhat.com> 4.8.3-6
+- update from the 4.8 branch (#1140019)
+  - PRs c++/58714, c++/59823, c++/59956, c++/60241, c++/60361, c++/61959,
+	c/61271, debug/55794, debug/60655, debug/61923, fortran/61999,
+	fortran/62214, fortran/62270, ipa/61986, ipa/62015, libgfortran/62188,
+	libstdc++/58962, libstdc++/61946, middle-end/61010, middle-end/61045,
+	middle-end/62103, rtl-optimization/62004, rtl-optimization/62030,
+	target/61996, target/62038, target/62195, testsuite/56194,
+	tree-optimization/60196, tree-optimization/60707,
+	tree-optimization/61452, tree-optimization/62073,
+	tree-optimization/62075, tree-optimization/63189
+
+* Thu Aug 21 2014 Richard Henderson <rth@redhat.com> 4.8.3-5
+- backport aarch64 unwind info improvements (#1132636)
+
+* Fri Aug  1 2014 Jakub Jelinek <jakub@redhat.com> 4.8.3-4
+- update from the 4.8 branch
+  - PRs fortran/61780, libobjc/61920, target/47230, tree-optimization/61375,
+	tree-optimization/61964
+  - fix libgfortran overflows on allocation (CVE-2014-5044)
+- backport ibm-ldouble performance improvements (#1090620)
+
+* Wed Jul 30 2014 Jakub Jelinek <jakub@redhat.com> 4.8.3-3
+- on ppc64le use -mtune=power8 by default (#1123484)
+
+* Thu Jul 17 2014 Jakub Jelinek <jakub@redhat.com> 4.8.3-2
+- update from the 4.8 branch
+  - PRs c++/61500, c++/61539, c++/61647, fortran/58883, fortran/61459,
+	middle-end/53590, rtl-optimization/61801, target/61542, target/61586,
+	tree-optimization/61306, tree-optimization/61684
+- for rhel 7.1 keep the old 4.8.2 pathnames and use 4.8.3 symlinks
+- merge in aarch64 support (#1070290)
+- small improvements on s390x for z196 and later (#1088542)
+- make sure OpenMP outlined artificial functions have DW_AT_name (#844959)
+
+* Tue Jun 24 2014 Jakub Jelinek <jakub@redhat.com> 4.8.3-1
+- update from the 4.8 branch
+  - GCC 4.8.3 release
+  - PRs c++/60605, c++/60731, c++/61134, fortran/45187, ipa/61393,
+	libfortran/61187, libfortran/61310, libstdc++/60734, libstdc++/60966,
+	rtl-optimization/60866, rtl-optimization/60901, rtl-optimization/61094,
+	rtl-optimization/61446, target/61044, target/61193, target/61202,
+	target/61208, target/61231, target/61239, target/61249, target/61300,
+	target/61415, target/61423, target/61431, target/61443, target/61483,
+	target/61545, target/61570, tree-optimization/61383
+
+* Thu May 15 2014 Jakub Jelinek <jakub@redhat.com> 4.8.2-18
+- update from the 4.8 branch
+  - PRs c++/60367, c++/60628, c++/60689, c++/60708, c++/60713, debug/60603,
+	driver/61106, libfortran/56919, libfortran/60810, libstdc++/60497,
+	libstdc++/60594, libstdc++/61117, middle-end/36282, middle-end/55022,
+	middle-end/60635, middle-end/60729, middle-end/60750,
+	middle-end/60849, middle-end/60895, rtl-optimization/60769,
+	target/57589, target/58595, target/59952, target/60516, target/60609,
+	target/60672, target/60693, target/60839, target/60909, target/60941,
+	target/60991, target/61026, target/61055, tree-optimization/57864,
+	tree-optimization/59817, tree-optimization/60453,
+	tree-optimization/60502, tree-optimization/60740,
+	tree-optimization/60766, tree-optimization/60836,
+	tree-optimization/60903, tree-optimization/60930,
+	tree-optimization/60960
+- backport OpenMP 4.0 support to libgomp (library only; PR libgomp/58691)
+
+* Fri Apr 11 2014 Jakub Jelinek <jakub@redhat.com> 4.8.2-17
+- update from the 4.8 branch
+  - PRs ada/51483, ada/60703, c/37743, c/59891, c/60101, c++/37140, c++/41174,
+	c++/54652, c++/55800, c++/57043, c++/57524, c++/57899, c++/58466,
+	c++/58504, c++/58606, c++/58632, c++/58639, c++/58672, c++/58812,
+	c++/58814, c++/58835, c++/58837, c++/58845, c++/58873, c++/58965,
+	c++/59097, c++/59224, c++/59646, c++/59989, c++/60108, c++/60146,
+	c++/60182, c++/60187, c++/60216, c++/60219, c++/60248, debug/59776,
+	fortran/49397, fortran/52370, fortran/55907, fortran/57033,
+	fortran/58007, fortran/58803, fortran/59395, fortran/59414,
+	fortran/59599, fortran/59700, fortran/59906, fortran/60231,
+	fortran/60283, fortran/60341, fortran/60450, fortran/60522,
+	fortran/60543, fortran/60576, fortran/60677, ipa/55260, ipa/60026,
+	ipa/60419, ipa/60640, libfortran/38199, libfortran/58324,
+	libfortran/59700, libfortran/59764, libfortran/59771,
+	libfortran/59774, libfortran/59836, libfortran/60128, libgcc/60166,
+	libgcj/55637, libstdc++/59215, libstdc++/59392, libstdc++/59548,
+	libstdc++/59680, libstdc++/59738, libstdc++/60564, libstdc++/60658,
+	middle-end/57499, middle-end/58809, middle-end/60004,
+	middle-end/60221, middle-end/60291, objc/56870, other/56653,
+	preprocessor/56824, preprocessor/58844, preprocessor/60400,
+	rtl-optimization/56356, rtl-optimization/57422,
+	rtl-optimization/57425, rtl-optimization/57569,
+	rtl-optimization/57637, rtl-optimization/60116,
+	rtl-optimization/60452, rtl-optimization/60601,
+	rtl-optimization/60700, target/43546, target/48094, target/54083,
+	target/54407, target/55426, target/56843, target/57052, target/57935,
+	target/57949, target/58675, target/58710, target/59054, target/59379,
+	target/59396, target/59462, target/59718, target/59777, target/59844,
+	target/59880, target/59909, target/59929, target/60017, target/60032,
+	target/60039, target/60062, target/60151, target/60193, target/60203,
+	target/60207, target/60486, target/60568, target/60735,
+	tree-optimization/56490, tree-optimization/59903,
+	tree-optimization/60115, tree-optimization/60183,
+	tree-optimization/60276, tree-optimization/60382,
+	tree-optimization/60429, tree-optimization/60454,
+	tree-optimization/60485
+  - powerpc64 little endian support
+- enable ppc64le in the spec file
 
 * Mon Mar  3 2014 Jakub Jelinek <jakub@redhat.com> 4.8.2-16
 - fix up compare_exchange_* in libatomic too (PR c++/60272)