From: Elan Ruusamäe Date: Sun, 11 Jan 2015 17:50:55 +0000 (+0200) Subject: new package X-Git-Url: http://git.pld-linux.org/?p=packages%2Fcross-gcc.git;a=commitdiff_plain;h=b5b0b447990b2c0ae00a6b93d8a23cb06c19c625 new package build all cross target from single source version 4.9.2 based on fedora package 16d1e7e --- b5b0b447990b2c0ae00a6b93d8a23cb06c19c625 diff --git a/cloog-0.18.1-ppc64le-config.patch b/cloog-0.18.1-ppc64le-config.patch new file mode 100644 index 0000000..a280e20 --- /dev/null +++ b/cloog-0.18.1-ppc64le-config.patch @@ -0,0 +1,717 @@ +--- cloog-0.18.1/m4/libtool.m4.jj 2013-10-11 09:27:45.000000000 +0200 ++++ cloog-0.18.1/m4/libtool.m4 2014-04-11 18:24:56.607493726 +0200 +@@ -1312,7 +1312,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 +@@ -1333,7 +1333,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux* + ;; + esac + ;; +- ppc64-*linux*|powerpc64-*linux*) ++ powerpc64le-*linux*) ++ LD="${LD-ld} -m elf32lppclinux" ++ ;; ++ powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) +@@ -1352,7 +1355,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*) +--- cloog-0.18.1/autoconf/config.sub.jj 2013-10-11 09:27:45.000000000 +0200 ++++ cloog-0.18.1/autoconf/config.sub 2014-04-11 18:24:56.608493721 +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 . +@@ -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 . 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 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 ++ #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 < conftest.$ac_ext +@@ -6408,7 +6408,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux* + ;; + esac + ;; +- ppc64-*linux*|powerpc64-*linux*) ++ powerpc64le-*linux*) ++ LD="${LD-ld} -m elf32lppclinux" ++ ;; ++ powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) +@@ -6427,7 +6430,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/cross-gcc-bfin.patch b/cross-gcc-bfin.patch new file mode 100644 index 0000000..5272080 --- /dev/null +++ b/cross-gcc-bfin.patch @@ -0,0 +1,15 @@ +Index: gcc/config/bfin/bfin.c +=================================================================== +--- gcc/config/bfin/bfin.c (revision 211729) ++++ gcc/config/bfin/bfin.c (working copy) +@@ -4629,10 +4629,6 @@ + + df_analyze (); + +- /* Doloop optimization */ +- if (cfun->machine->has_hardware_loops) +- bfin_reorg_loops (); +- + workaround_speculation (); + + if (flag_var_tracking) diff --git a/cross-gcc-c6x.patch b/cross-gcc-c6x.patch new file mode 100644 index 0000000..5533d01 --- /dev/null +++ b/cross-gcc-c6x.patch @@ -0,0 +1,51 @@ +Index: gcc/config/c6x/c6x.c +=================================================================== +RCS file: /cvs/cvsfiles/devo/gcc/config/c6x/c6x.c,v +retrieving revision 1.16 +diff -u -3 -p -r1.16 c6x.c +--- gcc/config/c6x/c6x.c 26 Jan 2014 17:41:28 -0000 1.16 ++++ gcc/config/c6x/c6x.c 20 Jun 2014 13:07:59 -0000 +@@ -5894,6 +5894,9 @@ static struct hw_doloop_hooks c6x_doloop + static void + c6x_hwloops (void) + { ++ /* start-sanitize-redhat */ ++ if (0) /* CFG called too late. */ ++ /* end-sanitize-redhat */ + if (optimize) + reorg_loops (true, &c6x_doloop_hooks); + } +Index: gcc/config/c6x/c6x.md +=================================================================== +RCS file: /cvs/cvsfiles/devo/gcc/config/c6x/c6x.md,v +retrieving revision 1.10 +diff -u -3 -p -r1.10 c6x.md +--- gcc/config/c6x/c6x.md 26 Jan 2014 17:41:28 -0000 1.10 ++++ gcc/config/c6x/c6x.md 4 Jul 2014 10:37:34 -0000 +@@ -1432,7 +1432,7 @@ + (plus:SI (match_dup 0) + (const_int -1))) + (clobber (match_dup 2))])] ; match_scratch +- "TARGET_INSNS_64PLUS && optimize" ++ "TARGET_INSNS_64PLUS && optimize && 0" + { + /* The loop optimizer doesn't check the predicates... */ + if (GET_MODE (operands[0]) != SImode) +@@ -1485,7 +1485,7 @@ + (plus:SI (match_dup 3) + (const_int -1))) + (clobber (match_scratch:SI 2 "=X,&AB,&AB,&AB"))] +- "TARGET_INSNS_64PLUS && optimize" ++ "TARGET_INSNS_64PLUS && optimize && 0" + "#" + [(set_attr "type" "spkernel")]) + +@@ -1499,7 +1499,7 @@ + (plus:SI (match_dup 3) + (const_int -1))) + (clobber (match_scratch 2))] +- "" ++ "0" + [(set (match_dup 2) (plus:SI (match_dup 3) (const_int -1))) + (set (match_dup 0) (match_dup 2)) + (set (pc) diff --git a/cross-gcc-with-libgcc.patch b/cross-gcc-with-libgcc.patch new file mode 100644 index 0000000..6143131 --- /dev/null +++ b/cross-gcc-with-libgcc.patch @@ -0,0 +1,26 @@ +diff -up gcc-4.7.0/libgcc/unwind-generic.h.cross-libgcc-ia64 gcc-4.7.0/libgcc/unwind-generic.h +--- gcc-4.7.0/libgcc/unwind-generic.h.cross-libgcc-ia64 2012-06-01 18:14:22.552450391 +0200 ++++ gcc-4.7.0/libgcc/unwind-generic.h 2012-06-01 18:14:42.523121821 +0200 +@@ -211,7 +211,9 @@ _Unwind_SjLj_Resume_or_Rethrow (struct _ + compatible with the standard ABI for IA-64, we inline these. */ + + #ifdef __ia64__ ++#ifndef inhibit_libc + #include ++#endif + + static inline _Unwind_Ptr + _Unwind_GetDataRelBase (struct _Unwind_Context *_C) +diff -up gcc-4.7.0/libgcc/config/m68k/linux-atomic.c.cross-libgcc-m68k gcc-4.7.0/libgcc/config/m68k/linux-atomic.c +--- gcc-4.7.0/libgcc/config/m68k/linux-atomic.c.cross-libgcc-m68k 2012-06-01 18:08:54.998851298 +0200 ++++ gcc-4.7.0/libgcc/config/m68k/linux-atomic.c 2012-06-01 18:09:16.871488040 +0200 +@@ -33,7 +33,9 @@ see the files COPYING3 and COPYING.RUNTI + using the kernel helper defined below. There is no support for + 64-bit operations yet. */ + ++#ifndef inhibit_libc + #include ++#endif + #include + + #ifndef __NR_atomic_cmpxchg_32 diff --git a/cross-gcc.spec b/cross-gcc.spec new file mode 100644 index 0000000..e274bf6 --- /dev/null +++ b/cross-gcc.spec @@ -0,0 +1,806 @@ +# +# Conditional build: +%bcond_without cloog # cloog +# Targets: +%bcond_without aarch64 # enable aarch64 +%bcond_without alpha # enable alpha +%bcond_without arm # enable arm +%bcond_without avr32 # enable avr32 +%bcond_without blackfin # enable blackfin +%bcond_without c6x # enable c6x +%bcond_without cris # enable cris +%bcond_without frv # enable frv +%bcond_without h8300 # enable h8300 +%bcond_without hppa # enable hppa +%bcond_without hppa64 # enable hppa64 +%bcond_without ia64 # enable ia64 +%bcond_without m32r # enable m32r +%bcond_without m68k # enable m68k +%bcond_without microblaze # enable microblaze +%bcond_without mips64 # enable mips64 +%bcond_without mn10300 # enable mn10300 +%bcond_without nios2 # enable nios2 +%bcond_without powerpc64 # enable powerpc64 +%bcond_without s390x # enable s390x +%bcond_without sh # enable sh +%bcond_without sh64 # enable sh64 +%bcond_without sparc64 # enable sparc64 +%bcond_without tile # enable tile +%bcond_without x86_64 # enable x86_64 +%bcond_without xtensa # enable xtensa + +# built compiler generates lots of ICEs +# - none at this time + +# gcc considers obsolete +%undefine with_score + +# gcc doesn't build +# - sh64 doesn't build on pld: +# ../../gcc-4.9.2-20141212/gcc/genmultilib[264]: shift: nothing to shift +# Makefile:1851: recipe for target 's-mlib' failed +%undefine with_sh64 +# packaging error, files packaged to gcc-hppa-linux-gnu and gcc-hppa64-linux-gnu +%undefine with_hppa64 + +# 32-bit packages we don't build as we can use the 64-bit package instead +%undefine with_i386 +%undefine with_mips +%undefine with_powerpc +%undefine with_s390 +%undefine with_sh4 +%undefine with_sparc + +# gcc doesn't support +%undefine with_metag +%undefine with_openrisc + +# not available in binutils-2.22 +%undefine with_unicore32 + +%define multilib_64_archs sparc64 ppc64 s390x x86_64 + +# we won't build libgcc for these as it depends on C library or kernel headers +%define no_libgcc_targets nios2*|tile-* + +############################################################################### +# +# The gcc versioning information. In a sed command below, the specfile winds +# pre-release version numbers in BASE-VER back to the last actually-released +# number. +%define DATE 20141212 +%define SVNREV 218667 + +%define srcdir gcc-%{version}-%{DATE} +%define cross_binutils_version 2.24 +%define isl_version 0.12.2 +%define cloog_version 0.18.1 + +Summary: Cross C compiler +Name: cross-gcc +Version: 4.9.2 +Release: 0.1 +# 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 +URL: http://gcc.gnu.org/ +# 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} +# tar cf - gcc-%{version}-%{DATE} | bzip2 -9 > gcc-%{version}-%{DATE}.tar.bz2 +Source0: http://pkgs.fedoraproject.org/repo/pkgs/cross-gcc/%{srcdir}.tar.bz2/ccd8cac944582f8d2ddf5274a15df176/%{srcdir}.tar.bz2 +# Source0-md5: ccd8cac944582f8d2ddf5274a15df176 +Source1: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-%{isl_version}.tar.bz2 +# Source1-md5: e039bfcfb6c2ab039b8ee69bf883e824 +Source2: ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-%{cloog_version}.tar.gz +# Source2-md5: e34fca0540d840e5d0f6427e98c92252 +Patch0: gcc49-hack.patch +Patch1: gcc49-java-nomulti.patch +Patch2: gcc49-ppc32-retaddr.patch +Patch3: gcc49-rh330771.patch +Patch4: gcc49-i386-libgomp.patch +Patch5: gcc49-sparc-config-detection.patch +Patch6: gcc49-libgomp-omp_h-multilib.patch +Patch7: gcc49-libtool-no-rpath.patch +Patch8: gcc49-cloog-dl.patch +Patch9: gcc49-cloog-dl2.patch +Patch10: gcc49-pr38757.patch +Patch11: gcc49-libstdc++-docs.patch +Patch12: gcc49-no-add-needed.patch +Patch13: gcc49-color-auto.patch +Patch14: gcc49-libgo-p224.patch +Patch15: gcc49-aarch64-async-unw-tables.patch +Patch16: gcc49-aarch64-unwind-opt.patch +Patch17: gcc49-pr64269.patch +Patch900: cross-intl-filename.patch +# ia64 - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44553 +# m68k - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53557 +# alpha - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55344 +Patch901: cross-gcc-with-libgcc.patch +Patch903: cross-gcc-bfin.patch +Patch904: cross-gcc-c6x.patch +Patch1100: cloog-0.18.1-ppc64le-config.patch +BuildRequires: cross-binutils-common >= %{cross_binutils_version} +BuildRequires: binutils >= 2.20.51.0.2-12 +BuildRequires: bison +BuildRequires: dejagnu +BuildRequires: flex +BuildRequires: gettext +BuildRequires: sharutils +BuildRequires: texinfo +BuildRequires: zlib-devel +# make sure pthread.h doesn't contain __thread tokens +# make sure glibc supports stack protector +# make sure glibc supports DT_GNU_HASH +BuildRequires: elfutils-devel >= 0.147 +BuildRequires: glibc-devel >= 2.4.90-13 +BuildRequires: gmp-devel >= 4.2 +BuildRequires: libmpc-devel >= 0.8.1 +BuildRequires: mpfr-devel >= 2.3.1 +Provides: bundled(libiberty) +BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n) + +%define builddir %{_builddir}/%{name}-%{version} + +%description +Cross-build GNU C compiler collection. + +%package common +Summary: Cross-build GNU C compiler documentation and translation files +Group: Development/Languages +%if "%{_rpmversion}" >= "5" +BuildArch: noarch +%endif + +%description common +Documentation, manual pages and translation files for cross-build GNU +C compiler. + +This is the common part of a set of cross-build GNU C compiler +packages for building kernels for other architectures. No support for +cross-building user space programs is currently supplied as that would +massively multiply the number of packages. + +%define do_package() \ +%if %{expand:%%{?with_%{2}:1}%%{!?with_%{2}:0}} \ +%package -n gcc-%1 \ +Summary: Cross-build binary utilities for %1 \ +Group: Development/Languages \ +BuildRequires: binutils-%1 >= %{cross_binutils_version}\ +Requires: %{name}-common = %{version}-%{release}\ +Requires: binutils-%1 >= %{cross_binutils_version}\ +\ +%description -n gcc-%1 \ +Cross-build GNU C compiler. \ +\ +Only building kernels is currently supported. Support for cross-building \ +user space programs is not currently provided as that would massively multiply \ +the number of packages. \ +\ +%package -n gcc-c++-%1 \ +Summary: Cross-build binary utilities for %1 \ +Group: Development/Languages \ +Requires: gcc-%1 = %{version}-%{release}\ +\ +%description -n gcc-c++-%1 \ +Cross-build GNU C++ compiler. \ +\ +Only the compiler is provided; not libstdc++. Support for cross-building \ +user space programs is not currently provided as that would massively multiply \ +the number of packages. \ +%endif + +%define do_symlink() \ +%if %{expand:%%{?with_%{2}:1}%%{!?with_%{2}:0}} \ +%package -n gcc-%1 \ +Summary: Cross-build binary utilities for %1 \ +Group: Development/Languages \ +Requires: gcc-%3 = %{version}-%{release}\ +\ +%description -n gcc-%1 \ +Cross-build GNU C++ compiler. \ +\ +Only building kernels is currently supported. Support for cross-building \ +user space programs is not currently provided as that would massively multiply \ +the number of packages. \ +\ +%package -n gcc-c++-%1 \ +Summary: Cross-build binary utilities for %1 \ +Group: Development/Languages \ +Requires: gcc-%1 = %{version}-%{release}\ +Requires: gcc-c++-%3 = %{version}-%{release}\ +\ +%description -n gcc-c++-%1 \ +Cross-build GNU C++ compiler. \ +\ +Only the compiler is provided; not libstdc++. Support for cross-building \ +user space programs is not currently provided as that would massively multiply \ +the number of packages. \ +%endif + +%do_package alpha-linux-gnu alpha +%do_package arm-linux-gnu arm +%do_package aarch64-linux-gnu aarch64 +%do_package avr32-linux-gnu avr32 +%do_package bfin-linux-gnu blackfin +%do_package c6x-linux-gnu c6x +%do_package cris-linux-gnu cris +%do_package frv-linux-gnu frv +%do_package h8300-linux-gnu h8300 +%do_package hppa-linux-gnu hppa +%do_package hppa64-linux-gnu hppa64 +%do_package i386-linux-gnu i386 +%do_package ia64-linux-gnu ia64 +%do_package m32r-linux-gnu m32r +%do_package m68k-linux-gnu m68k +%do_package metag-linux-gnu metag +%do_package microblaze-linux-gnu microblaze +%do_package mips-linux-gnu mips +%do_package mips64-linux-gnu mips64 +%do_package mn10300-linux-gnu mn10300 +%do_package nios2-linux-gnu nios2 +%do_package openrisc-linux-gnu openrisc +%do_package powerpc-linux-gnu powerpc +%do_package powerpc64-linux-gnu powerpc64 +%do_symlink ppc-linux-gnu powerpc powerpc-linux-gnu +%do_symlink ppc64-linux-gnu powerpc64 powerpc64-linux-gnu +%do_package s390-linux-gnu s390 +%do_package s390x-linux-gnu s390x +%do_package score-linux-gnu score +%do_package sh-linux-gnu sh +%do_package sh4-linux-gnu sh4 +%do_package sh64-linux-gnu sh64 +%do_package sparc-linux-gnu sparc +%do_package sparc64-linux-gnu sparc64 +%do_package tile-linux-gnu tile +%do_package unicore32-linux-gnu unicore32 +%do_package x86_64-linux-gnu x86_64 +%do_package xtensa-linux-gnu xtensa + +%prep +%setup -qc -a 1 -a 2 +cd %{srcdir} +%patch0 -p0 +%patch1 -p0 +%patch2 -p0 +%patch3 -p0 +%patch4 -p0 +%patch5 -p0 +%patch6 -p0 +%patch7 -p0 +%if %{with cloog} +%patch8 -p0 +%patch9 -p0 +%endif +%patch10 -p0 +# % if %{with libstdcxx_docs} +# % patch11 -p0 +# % endif +%patch12 -p0 +%patch13 -p0 +%patch14 -p0 +rm -f libgo/go/crypto/elliptic/p224{,_test}.go +%patch15 -p0 +%patch16 -p0 +%patch17 -p0 + +%patch900 -p0 +%patch901 -p1 +%patch903 -p0 +%patch904 -p0 + +cd .. +%patch1100 -p0 +cd %{srcdir} + +# Move the version number back +sed -i -e 's/4\.9\.3/4.9.2/' gcc/BASE-VER +echo 'PLD-Linux Cross %{version}-%{release}' > gcc/DEV-PHASE + +# Default to -gdwarf-4 -fno-debug-types-section rather than -gdwarf-2 +sed -i '/UInteger Var(dwarf_version)/s/Init(2)/Init(4)/' gcc/common.opt +sed -i '/flag_debug_types_section/s/Init(1)/Init(0)/' gcc/common.opt +sed -i '/dwarf_record_gcc_switches/s/Init(0)/Init(1)/' gcc/common.opt +sed -i 's/\(may be either 2, 3 or 4; the default version is \)2\./\14./' gcc/doc/invoke.texi + +./contrib/gcc_update --touch + +LC_ALL=C sed -i -e 's/\xa0/ /' gcc/doc/options.texi + +cat > target.list <&2 "No targets selected" + exit 8 +fi + +%build + +# Undo the broken autoconf change in recent Fedora versions +export CONFIG_SITE=NONE + +# +# Configure and build the ISL and CLooG libraries +# +%if %{with cloog} + +%define isl_source %{builddir}/isl-%{isl_version} +%define isl_build %{builddir}/isl-build +%define isl_install %{builddir}/isl-install + +mkdir %{isl_build} %{isl_install} +%ifarch s390 s390x +ISL_FLAG_PIC=-fPIC +%else +ISL_FLAG_PIC=-fpic +%endif +cd %{isl_build} + %{isl_source}/configure \ + --disable-silent-rules \ + --disable-shared \ + CC="%{__cc}" \ + CXX="%{__cxx}" \ + CFLAGS="${CFLAGS:-%rpmcflags} $ISL_FLAG_PIC" \ + --prefix=%{isl_install} + %{__make} + %{__make} install +cd .. + +%define cloog_source %{builddir}/cloog-%{cloog_version} +%define cloog_build %{builddir}/cloog-build +%define cloog_install %{builddir}/cloog-install + +install -d %{cloog_build} %{builddir}/cloog-install +cd %{cloog_build} +cat >> %{cloog_source}/source/isl/constraints.c << \EOF +#include +static void __attribute__((used)) *s1 = (void *) isl_union_map_compute_flow; +static void __attribute__((used)) *s2 = (void *) isl_map_dump; +EOF +sed -i 's|libcloog|libgcc49privatecloog|g' %{cloog_source}/{,test/}Makefile.{am,in} + +%{cloog_source}/configure \ + --disable-silent-rules \ + --with-isl=system \ + --with-isl-prefix=%{isl_install} \ + CC="%{__cc}" \ + CXX="%{__cxx}" \ + CFLAGS="${CFLAGS:-%rpmcflags}" \ + CXXFLAGS="${CXXFLAGS:-%rpmcxxflags}" \ + --prefix=%{cloog_install} +sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool +sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool +%{__make} +%{__make} install +cd %{cloog_install}/lib +rm libgcc49privatecloog-isl.so{,.4} +mv libgcc49privatecloog-isl.so.4.0.0 libcloog-isl.so.4 +ln -sf libcloog-isl.so.4 libcloog-isl.so +ln -sf libcloog-isl.so.4 libcloog.so + +%endif + +# +# Configure the compiler +# +cd %{builddir} +config_target() { + echo "=== CONFIGURING $1" + + arch=$1 + prefix=$arch- + build_dir=$1 + + case $arch in + arm-*) target=arm-linux-gnueabi;; + aarch64-*) target=aarch64-linux-gnu;; + avr32-*) target=avr-linux;; + bfin-*) target=bfin-uclinux;; + c6x-*) target=c6x-uclinux;; + h8300-*) target=h8300-elf;; + mn10300-*) target=am33_2.0-linux;; + m68knommu-*) target=m68k-linux;; + openrisc-*) target=or32-linux;; + parisc-*) target=hppa-linux;; + score-*) target=score-elf;; + sh64-*) target=sh64-linux;; + tile-*) target=tilegx-linux;; + v850-*) target=v850e-linux;; + x86-*) target=x86_64-linux;; + *) target=$arch;; + esac + + echo $arch: target is $target + #export CFLAGS="$RPM_OPT_FLAGS" + + CONFIG_FLAGS= + case $arch in + arm) + CONFIG_FLAGS="--with-cpu=cortex-a8 --with-tune=cortex-a8 --with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16 --with-abi=aapcs-linux" + ;; + powerpc-*|powerpc64-*) + CONFIG_FLAGS="--with-cpu-32=power4 --with-tune-32=power6 --with-cpu-64=power4 --with-tune-64=power6 --enable-secureplt" + ;; + s390*-*) + CONFIG_FLAGS="--with-arch=z9-109 --with-tune=z10 --enable-decimal-float" + ;; + sh-*) + CONFIG_FLAGS="--with-multilib-list=m1,m2,m2e,m4,m4-single,m4-single-only,m2a,m2a-single,!m2a,!m2a-single" + ;; + sh64-*) + CONFIG_FLAGS="--with-multilib-list=m5-32media,m5-32media-nofpu,m5-compact,m5-compact-nofpu,m5-64media,m5-64media-nofpu" + ;; + sparc-*) + CONFIG_FLAGS="--disable-linux-futex" + ;; + tile-*) + #CONFIG_FLAGS="--with-arch_32=tilepro" + ;; + x86-*) + CONFIG_FLAGS="--with-arch_32=i686" + ;; + esac + + case $arch in + alpha|powerpc*|s390*|sparc*) + CONFIG_FLAGS="$CONFIG_FLAGS --with-long-double-128" ;; + esac + + install -d $build_dir + cd $build_dir + + # We could optimize the cross builds size by --enable-shared but the produced + # binaries may be less convenient in the embedded environment. + AR_FOR_TARGET=%{_bindir}/$arch-ar \ + AS_FOR_TARGET=%{_bindir}/$arch-as \ + DLLTOOL_FOR_TARGET=%{_bindir}/$arch-dlltool \ + LD_FOR_TARGET=%{_bindir}/$arch-ld \ + NM_FOR_TARGET=%{_bindir}/$arch-nm \ + OBJDUMP_FOR_TARGET=%{_bindir}/$arch-objdump \ + RANLIB_FOR_TARGET=%{_bindir}/$arch-ranlib \ + STRIP_FOR_TARGET=%{_bindir}/$arch-strip \ + WINDRES_FOR_TARGET=%{_bindir}/$arch-windres \ + WINDMC_FOR_TARGET=%{_bindir}/$arch-windmc \ + CC="%{__cc}" \ + CFLAGS="%{rpmcflags}" \ + CXXFLAGS="%{rpmcxxflags}" \ + LDFLAGS="-Wl,-z,relro " \ + ../%{srcdir}/configure \ + --bindir=%{_bindir} \ + --build=%{_target_platform} \ + --datadir=%{_datadir} \ + --disable-decimal-float \ + --disable-dependency-tracking \ + --disable-gold \ + --disable-libgomp \ + --disable-libmudflap \ + --disable-libquadmath \ + --disable-libssp \ + --disable-nls \ + --disable-plugin \ + --disable-shared \ + --disable-silent-rules \ + --disable-sjlj-exceptions \ + --disable-threads \ + --with-ld=/usr/bin/$arch-ld \ + --enable-checking=$checking \ + --enable-gnu-unique-object \ + --enable-initfini-array \ + --enable-languages=c,c++ \ + --enable-linker-build-id \ + --enable-nls \ + --enable-obsolete \ + --enable-targets=all \ + --exec-prefix=%{_exec_prefix} \ + --host=%{_target_platform} \ + --includedir=%{_includedir} \ + --infodir=%{_infodir} \ + --libexecdir=%{_libexecdir} \ + --localstatedir=%{_localstatedir} \ + --mandir=%{_mandir} \ + --prefix=%{_prefix} \ + --program-prefix=$prefix \ + --sbindir=%{_sbindir} \ + --sharedstatedir=%{_sharedstatedir} \ + --sysconfdir=%{_sysconfdir} \ + --target=$target \ + --with-bugurl="http://bugs.pld-linux.org" \ + --with-linker-hash-style=gnu \ + --with-newlib \ + --with-sysroot=%{_prefix}/$arch/sys-root \ + --with-system-libunwind \ + --with-system-zlib \ + --without-headers \ +%if %{with cloog} + --with-isl=%{isl_install} --with-cloog=%{cloog_install} \ +%else + --without-isl --without-cloog \ +%endif + $CONFIG_FLAGS +%if 0 + --libdir=%{_libdir} # we want stuff in /usr/lib/gcc/ not /usr/lib64/gcc +%endif + cd .. +} + +for target in $(cat target.list); do + config_target $target +done + +build_target() { + echo "=== BUILDING $1" + + arch=$1 + build_dir=$1 + + AR_FOR_TARGET=%{_bindir}/$arch-ar \ + AS_FOR_TARGET=%{_bindir}/$arch-as \ + DLLTOOL_FOR_TARGET=%{_bindir}/$arch-dlltool \ + LD_FOR_TARGET=%{_bindir}/$arch-ld \ + NM_FOR_TARGET=%{_bindir}/$arch-nm \ + OBJDUMP_FOR_TARGET=%{_bindir}/$arch-objdump \ + RANLIB_FOR_TARGET=%{_bindir}/$arch-ranlib \ + STRIP_FOR_TARGET=%{_bindir}/$arch-strip \ + WINDRES_FOR_TARGET=%{_bindir}/$arch-windres \ + WINDMC_FOR_TARGET=%{_bindir}/$arch-windmc \ + %{__make} -C $build_dir tooldir=%{_prefix} all-gcc + + case $arch in + %{no_libgcc_targets}) + ;; + *) + %{__make} -C $build_dir tooldir=%{_prefix} all-target-libgcc + ;; + esac +} + +for target in $(cat target.list); do + build_target $target +done + +%install +rm -rf $RPM_BUILD_ROOT + +install_bin() { + echo "=== INSTALLING $1" + + arch=$1 + cpu=${1%%%%-*} + + case $arch in + %{no_libgcc_targets}) with_libgcc="";; + *) with_libgcc="install-target-libgcc";; + esac + + %{__make} -C $arch DESTDIR=$RPM_BUILD_ROOT install-gcc ${with_libgcc} + + # We want links for ppc and ppc64 also if we make powerpc or powerpc64 + case $cpu in + powerpc*) + cd $RPM_BUILD_ROOT%{_bindir} + for i in $cpu-*; do + ln -s $i ppc${i#powerpc} + done + cd - + ;; + esac +} + +for target in $(cat target.list); do + install -d $RPM_BUILD_ROOT%{_prefix}/$target/sys-root + install_bin $target +done + +grep ^powerpc target.list | sed -e s/powerpc/ppc/ > symlink-target.list + +# We have to copy cloog somewhere graphite can dlopen it from +%if %{with cloog} +for i in $RPM_BUILD_ROOT%{_prefix}/lib/gcc/*/%{version}; do + cp -a %{cloog_install}/lib/libcloog-isl.so.4 $i +done +%endif + +# For cross-gcc we drop the documentation. +rm -rf $RPM_BUILD_ROOT%{_infodir} + +# Remove binaries we will not be including, so that they don't end up in +# gcc-debuginfo +rm -f $RPM_BUILD_ROOT%{_libdir}/{libffi*,libiberty.a} +rm -f $RPM_BUILD_ROOT%{_libexecdir}/gcc/*/%{version}/install-tools/{mkheaders,fixincl} +rm -f $RPM_BUILD_ROOT%{_bindir}/*-gcc-%{version} || : +rm -f $RPM_BUILD_ROOT%{_bindir}/*-ar || : +rm -f $RPM_BUILD_ROOT%{_bindir}/*-nm || : +rm -f $RPM_BUILD_ROOT%{_bindir}/*-ranlib || : +rmdir $RPM_BUILD_ROOT%{_includedir} + +find $RPM_BUILD_ROOT%{_datadir} -name gcc.mo | +while read x; do + y=$(dirname $x) + mv $x $y/cross-gcc.mo +done + +%find_lang cross-gcc + +rm $RPM_BUILD_ROOT%{_mandir}/man7/*.7 +rmdir $RPM_BUILD_ROOT%{_mandir}/man7 + +# All the installed manual pages and translation files for each program are the +# same, so symlink them to the common package +cd $RPM_BUILD_ROOT%{_mandir}/man1 + for i in cross-cpp.1 cross-gcc.1 cross-g++.1 cross-gcov.1; do + j=${i#cross-} + + for k in *-$j; do + if [ $k != $i -a ! -L $k ]; then + mv $k $i + ln -s $i $k + fi + done + done + + # Add manpages the additional symlink-only targets + %if %{with powerpc}%{with powerpc64} + for i in powerpc*; do + ln -s $i ppc${i#powerpc} + done + %endif +cd - + +install_lang() { + arch=$1 + cpu=${arch%%%%-*} + + case $cpu in + avr32) target_cpu=avr;; + bfin) target_cpu=bfin;; + h8300) target_cpu=h8300;; + mn10300) target_cpu=am33_2.0;; + openrisc) target_cpu=openrisc;; + parisc) target_cpu=hppa;; + score) target_cpu=score;; + tile) target_cpu=tilegx;; + v850) target_cpu=v850e;; + x86) target_cpu=x86_64;; + *) target_cpu=$cpu;; + esac + + ( + echo "%%defattr(-,root,root,-)" + echo "%{_bindir}/$arch*-cpp" + echo "%{_bindir}/$arch*-gcc" + echo "%{_bindir}/$arch*-gcov" + echo "%{_mandir}/man1/$arch*-cpp*" + echo "%{_mandir}/man1/$arch*-gcc*" + echo "%{_mandir}/man1/$arch*-gcov*" + case $cpu in + ppc*|ppc64*) + ;; + *) + echo "/usr/lib/gcc/$target_cpu-*/" + echo "%{_libexecdir}/gcc/$target_cpu*/*/cc1" + echo "%{_libexecdir}/gcc/$target_cpu*/*/collect2" + echo "%{_libexecdir}/gcc/$target_cpu*/*/[abd-z]*" + echo "%{_prefix}/$arch/sys-root" + esac + + ) >files.$arch + + ( + echo "%%defattr(-,root,root,-)" + echo "%{_bindir}/$arch*-c++" + echo "%{_bindir}/$arch*-g++" + echo "%{_mandir}/man1/$arch*-g++*" + case $cpu in + ppc*|ppc64*) + ;; + *) + echo "%{_libexecdir}/gcc/$target_cpu*/*/cc1plus" + esac + ) > files-c++.$arch +} + +for target in $(cat target.list symlink-target.list); do + install_lang $target +done + +%define __ar_no_strip $RPM_BUILD_DIR/%{name}-%{version}/ar-no-strip +cat >%{__ar_no_strip} <<'EOF' +#!/bin/sh +f=$2 +if [ ${f##*/} = libgcc.a -o ${f##*/} = libgcov.a ]; then + : +else + %{__strip} $* +fi +EOF +chmod +x %{__ar_no_strip} +%undefine __strip +%define __strip %{__ar_no_strip} + +%clean +rm -rf $RPM_BUILD_ROOT + +%files common -f cross-gcc.lang +%doc %{srcdir}/COPYING* +%doc %{srcdir}/README +%{_mandir}/man1/cross-* + +%define do_files() \ +%files -n gcc-%1 -f files.%1 \ +%files -n gcc-c++-%1 -f files-c++.%1 \ + +%{?with_alpha:%do_files alpha-linux-gnu} +%{?with_arm:%do_files arm-linux-gnu} +%{?with_aarch64:%do_files aarch64-linux-gnu} +%{?with_avr32:%do_files avr32-linux-gnu} +%{?with_blackfin:%do_files bfin-linux-gnu} +%{?with_c6x:%do_files c6x-linux-gnu} +%{?with_cris:%do_files cris-linux-gnu} +%{?with_frv:%do_files frv-linux-gnu} +%{?with_h8300:%do_files h8300-linux-gnu} +%{?with_hppa:%do_files hppa-linux-gnu} +%{?with_hppa64:%do_files hppa64-linux-gnu} +%{?with_i386:%do_files i386-linux-gnu} +%{?with_ia64:%do_files ia64-linux-gnu} +%{?with_m32r:%do_files m32r-linux-gnu} +%{?with_m68k:%do_files m68k-linux-gnu} +%{?with_metag:%do_files metag-linux-gnu} +%{?with_microblaze:%do_files microblaze-linux-gnu} +%{?with_mips:%do_files mips-linux-gnu} +%{?with_mips64:%do_files mips64-linux-gnu} +%{?with_mn10300:%do_files mn10300-linux-gnu} +%{?with_nios2:%do_files nios2-linux-gnu} +%{?with_openrisc:%do_files openrisc-linux-gnu} +%{?with_powerpc:%do_files powerpc-linux-gnu} +%{?with_powerpc64:%do_files powerpc64-linux-gnu} +%{?with_powerpc:%do_files ppc-linux-gnu} +%{?with_powerpc64:%do_files ppc64-linux-gnu} +%{?with_s390:%do_files s390-linux-gnu} +%{?with_s390x:%do_files s390x-linux-gnu} +%{?with_score:%do_files score-linux-gnu} +%{?with_sh:%do_files sh-linux-gnu} +%{?with_sh4:%do_files sh4-linux-gnu} +%{?with_sh64:%do_files sh64-linux-gnu} +%{?with_sparc:%do_files sparc-linux-gnu} +%{?with_sparc64:%do_files sparc64-linux-gnu} +%{?with_tile:%do_files tile-linux-gnu} +%{?with_unicore32:%do_files unicore32-linux-gnu} +%{?with_x86_64:%do_files x86_64-linux-gnu} +%{?with_xtensa:%do_files xtensa-linux-gnu} diff --git a/cross-intl-filename.patch b/cross-intl-filename.patch new file mode 100644 index 0000000..b24f547 --- /dev/null +++ b/cross-intl-filename.patch @@ -0,0 +1,14 @@ +diff -uNr --exclude '*~' gcc-4.7.0-RC-20120302/gcc/intl.c gcc-4.7.0-RC-20120302-old/gcc/intl.c +--- gcc/intl.c 2010-12-01 17:29:12.000000000 +0000 ++++ gcc/intl.c 2012-03-15 14:49:19.709968148 +0000 +@@ -56,8 +56,8 @@ + setlocale (LC_ALL, ""); + #endif + +- (void) bindtextdomain ("gcc", LOCALEDIR); +- (void) textdomain ("gcc"); ++ (void) bindtextdomain ("cross-gcc", LOCALEDIR); ++ (void) textdomain ("cross-gcc"); + + /* Opening quotation mark. */ + open_quote = _("`"); diff --git a/gcc49-aarch64-async-unw-tables.patch b/gcc49-aarch64-async-unw-tables.patch new file mode 100644 index 0000000..feec149 --- /dev/null +++ b/gcc49-aarch64-async-unw-tables.patch @@ -0,0 +1,35 @@ +2014-04-07 Richard Henderson + + * 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/gcc49-aarch64-unwind-opt.patch b/gcc49-aarch64-unwind-opt.patch new file mode 100644 index 0000000..3ad55ab --- /dev/null +++ b/gcc49-aarch64-unwind-opt.patch @@ -0,0 +1,338 @@ +2014-08-08 Richard Henderson + + * 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.jj 2014-07-08 17:38:17.398231989 +0200 ++++ gcc/config/aarch64/aarch64.c 2014-08-13 10:02:45.599757706 +0200 +@@ -1810,8 +1810,7 @@ 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; +@@ -1819,16 +1818,16 @@ aarch64_save_or_restore_fprs (int start_ + 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 +@@ -1840,56 +1839,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; + } + } +- + } + + +@@ -1897,13 +1891,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; +@@ -1912,11 +1907,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 +@@ -1928,56 +1925,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: +@@ -2179,7 +2174,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, +@@ -2248,15 +2243,18 @@ 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; + } + ++ rtx cfi_ops = NULL; + 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) +@@ -2264,6 +2262,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) + { +@@ -2276,52 +2276,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/gcc49-cloog-dl.patch b/gcc49-cloog-dl.patch new file mode 100644 index 0000000..8a72509 --- /dev/null +++ b/gcc49-cloog-dl.patch @@ -0,0 +1,476 @@ +--- gcc/Makefile.in.jj 2012-12-13 17:09:20.000000000 +0100 ++++ gcc/Makefile.in 2012-12-14 11:45:22.585670055 +0100 +@@ -1006,7 +1006,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY) + # and the system's installed libraries. + LIBS = @LIBS@ libcommon.a $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBBACKTRACE) \ + $(LIBIBERTY) $(LIBDECNUMBER) $(HOST_LIBS) +-BACKENDLIBS = $(CLOOGLIBS) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \ ++BACKENDLIBS = $(if $(CLOOGLIBS),-ldl) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \ + $(ZLIB) + # Any system libraries needed just for GNAT. + SYSLIBS = @GNAT_LIBEXC@ +@@ -2011,6 +2011,15 @@ $(out_object_file): $(out_file) + $(common_out_object_file): $(common_out_file) + $(COMPILE) $< + $(POSTCOMPILE) ++ ++graphite%.o : \ ++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS)) ++graphite.o : \ ++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS)) ++graphite%.o : \ ++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS)) ++graphite.o : \ ++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS)) + # + # Generate header and source files from the machine description, + # and compile them. +--- gcc/graphite-poly.h.jj 2012-12-13 11:31:27.000000000 +0100 ++++ gcc/graphite-poly.h 2012-12-14 13:41:41.970800726 +0100 +@@ -22,6 +22,371 @@ along with GCC; see the file COPYING3. + #ifndef GCC_GRAPHITE_POLY_H + #define GCC_GRAPHITE_POLY_H + ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#define DYNSYMS \ ++ DYNSYM (clast_pprint); \ ++ DYNSYM (cloog_clast_create_from_input); \ ++ DYNSYM (cloog_clast_free); \ ++ DYNSYM (cloog_domain_from_isl_set); \ ++ DYNSYM (cloog_input_alloc); \ ++ DYNSYM (cloog_isl_state_malloc); \ ++ DYNSYM (cloog_options_free); \ ++ DYNSYM (cloog_options_malloc); \ ++ DYNSYM (cloog_scattering_from_isl_map); \ ++ DYNSYM (cloog_state_free); \ ++ DYNSYM (cloog_union_domain_add_domain); \ ++ DYNSYM (cloog_union_domain_alloc); \ ++ DYNSYM (cloog_union_domain_set_name); \ ++ DYNSYM (isl_aff_add_coefficient_si); \ ++ DYNSYM (isl_aff_add_constant); \ ++ DYNSYM (isl_aff_free); \ ++ DYNSYM (isl_aff_get_coefficient); \ ++ DYNSYM (isl_aff_get_space); \ ++ DYNSYM (isl_aff_mod); \ ++ DYNSYM (isl_aff_set_coefficient_si); \ ++ DYNSYM (isl_aff_set_constant_si); \ ++ DYNSYM (isl_aff_zero_on_domain); \ ++ DYNSYM (isl_band_free); \ ++ DYNSYM (isl_band_get_children); \ ++ DYNSYM (isl_band_get_partial_schedule); \ ++ DYNSYM (isl_band_has_children); \ ++ DYNSYM (isl_band_list_free); \ ++ DYNSYM (isl_band_list_get_band); \ ++ DYNSYM (isl_band_list_get_ctx); \ ++ DYNSYM (isl_band_list_n_band); \ ++ DYNSYM (isl_band_member_is_zero_distance); \ ++ DYNSYM (isl_band_n_member); \ ++ DYNSYM (isl_basic_map_add_constraint); \ ++ DYNSYM (isl_basic_map_project_out); \ ++ DYNSYM (isl_basic_map_universe); \ ++ DYNSYM (isl_constraint_set_coefficient); \ ++ DYNSYM (isl_constraint_set_coefficient_si); \ ++ DYNSYM (isl_constraint_set_constant); \ ++ DYNSYM (isl_constraint_set_constant_si); \ ++ DYNSYM (isl_ctx_alloc); \ ++ DYNSYM (isl_ctx_free); \ ++ DYNSYM (isl_equality_alloc); \ ++ DYNSYM (isl_id_alloc); \ ++ DYNSYM (isl_id_copy); \ ++ DYNSYM (isl_id_free); \ ++ DYNSYM (isl_inequality_alloc); \ ++ DYNSYM (isl_local_space_copy); \ ++ DYNSYM (isl_local_space_free); \ ++ DYNSYM (isl_local_space_from_space); \ ++ DYNSYM (isl_local_space_range); \ ++ DYNSYM (isl_map_add_constraint); \ ++ DYNSYM (isl_map_add_dims); \ ++ DYNSYM (isl_map_align_params); \ ++ DYNSYM (isl_map_apply_range); \ ++ DYNSYM (isl_map_copy); \ ++ DYNSYM (isl_map_dim); \ ++ DYNSYM (isl_map_dump); \ ++ DYNSYM (isl_map_equate); \ ++ DYNSYM (isl_map_fix_si); \ ++ DYNSYM (isl_map_flat_product); \ ++ DYNSYM (isl_map_flat_range_product); \ ++ DYNSYM (isl_map_free); \ ++ DYNSYM (isl_map_from_basic_map); \ ++ DYNSYM (isl_map_from_pw_aff); \ ++ DYNSYM (isl_map_from_union_map); \ ++ DYNSYM (isl_map_get_ctx); \ ++ DYNSYM (isl_map_get_space); \ ++ DYNSYM (isl_map_get_tuple_id); \ ++ DYNSYM (isl_map_insert_dims); \ ++ DYNSYM (isl_map_intersect); \ ++ DYNSYM (isl_map_intersect_domain); \ ++ DYNSYM (isl_map_intersect_range); \ ++ DYNSYM (isl_map_is_empty); \ ++ DYNSYM (isl_map_lex_ge); \ ++ DYNSYM (isl_map_lex_le); \ ++ DYNSYM (isl_map_n_out); \ ++ DYNSYM (isl_map_range); \ ++ DYNSYM (isl_map_set_tuple_id); \ ++ DYNSYM (isl_map_universe); \ ++ DYNSYM (isl_options_set_on_error); \ ++ DYNSYM (isl_options_set_schedule_fuse); \ ++ DYNSYM (isl_options_set_schedule_max_constant_term); \ ++ DYNSYM (isl_options_set_schedule_maximize_band_depth); \ ++ DYNSYM (isl_printer_free); \ ++ DYNSYM (isl_printer_print_aff); \ ++ DYNSYM (isl_printer_print_constraint); \ ++ DYNSYM (isl_printer_print_map); \ ++ DYNSYM (isl_printer_print_set); \ ++ DYNSYM (isl_printer_to_file); \ ++ DYNSYM (isl_pw_aff_add); \ ++ DYNSYM (isl_pw_aff_alloc); \ ++ DYNSYM (isl_pw_aff_copy); \ ++ DYNSYM (isl_pw_aff_eq_set); \ ++ DYNSYM (isl_pw_aff_free); \ ++ DYNSYM (isl_pw_aff_from_aff); \ ++ DYNSYM (isl_pw_aff_ge_set); \ ++ DYNSYM (isl_pw_aff_gt_set); \ ++ DYNSYM (isl_pw_aff_is_cst); \ ++ DYNSYM (isl_pw_aff_le_set); \ ++ DYNSYM (isl_pw_aff_lt_set); \ ++ DYNSYM (isl_pw_aff_mod); \ ++ DYNSYM (isl_pw_aff_mul); \ ++ DYNSYM (isl_pw_aff_ne_set); \ ++ DYNSYM (isl_pw_aff_nonneg_set); \ ++ DYNSYM (isl_pw_aff_set_tuple_id); \ ++ DYNSYM (isl_pw_aff_sub); \ ++ DYNSYM (isl_pw_aff_zero_set); \ ++ DYNSYM (isl_schedule_free); \ ++ DYNSYM (isl_schedule_get_band_forest); \ ++ DYNSYM (isl_set_add_constraint); \ ++ DYNSYM (isl_set_add_dims); \ ++ DYNSYM (isl_set_apply); \ ++ DYNSYM (isl_set_coalesce); \ ++ DYNSYM (isl_set_copy); \ ++ DYNSYM (isl_set_dim); \ ++ DYNSYM (isl_set_fix_si); \ ++ DYNSYM (isl_set_free); \ ++ DYNSYM (isl_set_from_cloog_domain); \ ++ DYNSYM (isl_set_get_space); \ ++ DYNSYM (isl_set_get_tuple_id); \ ++ DYNSYM (isl_set_intersect); \ ++ DYNSYM (isl_set_is_empty); \ ++ DYNSYM (isl_set_max); \ ++ DYNSYM (isl_set_min); \ ++ DYNSYM (isl_set_n_dim); \ ++ DYNSYM (isl_set_nat_universe); \ ++ DYNSYM (isl_set_project_out); \ ++ DYNSYM (isl_set_set_tuple_id); \ ++ DYNSYM (isl_set_universe); \ ++ DYNSYM (isl_space_add_dims); \ ++ DYNSYM (isl_space_alloc); \ ++ DYNSYM (isl_space_copy); \ ++ DYNSYM (isl_space_dim); \ ++ DYNSYM (isl_space_domain); \ ++ DYNSYM (isl_space_find_dim_by_id); \ ++ DYNSYM (isl_space_free); \ ++ DYNSYM (isl_space_from_domain); \ ++ DYNSYM (isl_space_get_tuple_id); \ ++ DYNSYM (isl_space_params_alloc); \ ++ DYNSYM (isl_space_range); \ ++ DYNSYM (isl_space_set_alloc); \ ++ DYNSYM (isl_space_set_dim_id); \ ++ DYNSYM (isl_space_set_tuple_id); \ ++ DYNSYM (isl_union_map_add_map); \ ++ DYNSYM (isl_union_map_align_params); \ ++ DYNSYM (isl_union_map_apply_domain); \ ++ DYNSYM (isl_union_map_apply_range); \ ++ DYNSYM (isl_union_map_compute_flow); \ ++ DYNSYM (isl_union_map_copy); \ ++ DYNSYM (isl_union_map_empty); \ ++ DYNSYM (isl_union_map_flat_range_product); \ ++ DYNSYM (isl_union_map_foreach_map); \ ++ DYNSYM (isl_union_map_free); \ ++ DYNSYM (isl_union_map_from_map); \ ++ DYNSYM (isl_union_map_get_ctx); \ ++ DYNSYM (isl_union_map_get_space); \ ++ DYNSYM (isl_union_map_gist_domain); \ ++ DYNSYM (isl_union_map_gist_range); \ ++ DYNSYM (isl_union_map_intersect_domain); \ ++ DYNSYM (isl_union_map_is_empty); \ ++ DYNSYM (isl_union_map_subtract); \ ++ DYNSYM (isl_union_map_union); \ ++ DYNSYM (isl_union_set_add_set); \ ++ DYNSYM (isl_union_set_compute_schedule); \ ++ DYNSYM (isl_union_set_copy); \ ++ DYNSYM (isl_union_set_empty); \ ++ DYNSYM (isl_union_set_from_set); \ ++ DYNSYM (stmt_ass); \ ++ DYNSYM (stmt_block); \ ++ DYNSYM (stmt_for); \ ++ DYNSYM (stmt_guard); \ ++ DYNSYM (stmt_root); \ ++ DYNSYM (stmt_user); ++extern struct cloog_pointers_s__ ++{ ++ bool inited; ++ void *h; ++#define DYNSYM(x) __typeof (x) *p_##x ++ DYNSYMS ++#undef DYNSYM ++} cloog_pointers__; ++ ++#define cloog_block_alloc (*cloog_pointers__.p_cloog_block_alloc) ++#define clast_pprint (*cloog_pointers__.p_clast_pprint) ++#define cloog_clast_create_from_input (*cloog_pointers__.p_cloog_clast_create_from_input) ++#define cloog_clast_free (*cloog_pointers__.p_cloog_clast_free) ++#define cloog_domain_from_isl_set (*cloog_pointers__.p_cloog_domain_from_isl_set) ++#define cloog_input_alloc (*cloog_pointers__.p_cloog_input_alloc) ++#define cloog_isl_state_malloc (*cloog_pointers__.p_cloog_isl_state_malloc) ++#define cloog_options_free (*cloog_pointers__.p_cloog_options_free) ++#define cloog_options_malloc (*cloog_pointers__.p_cloog_options_malloc) ++#define cloog_scattering_from_isl_map (*cloog_pointers__.p_cloog_scattering_from_isl_map) ++#define cloog_state_free (*cloog_pointers__.p_cloog_state_free) ++#define cloog_union_domain_add_domain (*cloog_pointers__.p_cloog_union_domain_add_domain) ++#define cloog_union_domain_alloc (*cloog_pointers__.p_cloog_union_domain_alloc) ++#define cloog_union_domain_set_name (*cloog_pointers__.p_cloog_union_domain_set_name) ++#define isl_aff_add_coefficient_si (*cloog_pointers__.p_isl_aff_add_coefficient_si) ++#define isl_aff_add_constant (*cloog_pointers__.p_isl_aff_add_constant) ++#define isl_aff_free (*cloog_pointers__.p_isl_aff_free) ++#define isl_aff_get_coefficient (*cloog_pointers__.p_isl_aff_get_coefficient) ++#define isl_aff_get_space (*cloog_pointers__.p_isl_aff_get_space) ++#define isl_aff_mod (*cloog_pointers__.p_isl_aff_mod) ++#define isl_aff_set_coefficient_si (*cloog_pointers__.p_isl_aff_set_coefficient_si) ++#define isl_aff_set_constant_si (*cloog_pointers__.p_isl_aff_set_constant_si) ++#define isl_aff_zero_on_domain (*cloog_pointers__.p_isl_aff_zero_on_domain) ++#define isl_band_free (*cloog_pointers__.p_isl_band_free) ++#define isl_band_get_children (*cloog_pointers__.p_isl_band_get_children) ++#define isl_band_get_partial_schedule (*cloog_pointers__.p_isl_band_get_partial_schedule) ++#define isl_band_has_children (*cloog_pointers__.p_isl_band_has_children) ++#define isl_band_list_free (*cloog_pointers__.p_isl_band_list_free) ++#define isl_band_list_get_band (*cloog_pointers__.p_isl_band_list_get_band) ++#define isl_band_list_get_ctx (*cloog_pointers__.p_isl_band_list_get_ctx) ++#define isl_band_list_n_band (*cloog_pointers__.p_isl_band_list_n_band) ++#define isl_band_member_is_zero_distance (*cloog_pointers__.p_isl_band_member_is_zero_distance) ++#define isl_band_n_member (*cloog_pointers__.p_isl_band_n_member) ++#define isl_basic_map_add_constraint (*cloog_pointers__.p_isl_basic_map_add_constraint) ++#define isl_basic_map_project_out (*cloog_pointers__.p_isl_basic_map_project_out) ++#define isl_basic_map_universe (*cloog_pointers__.p_isl_basic_map_universe) ++#define isl_constraint_set_coefficient (*cloog_pointers__.p_isl_constraint_set_coefficient) ++#define isl_constraint_set_coefficient_si (*cloog_pointers__.p_isl_constraint_set_coefficient_si) ++#define isl_constraint_set_constant (*cloog_pointers__.p_isl_constraint_set_constant) ++#define isl_constraint_set_constant_si (*cloog_pointers__.p_isl_constraint_set_constant_si) ++#define isl_ctx_alloc (*cloog_pointers__.p_isl_ctx_alloc) ++#define isl_ctx_free (*cloog_pointers__.p_isl_ctx_free) ++#define isl_equality_alloc (*cloog_pointers__.p_isl_equality_alloc) ++#define isl_id_alloc (*cloog_pointers__.p_isl_id_alloc) ++#define isl_id_copy (*cloog_pointers__.p_isl_id_copy) ++#define isl_id_free (*cloog_pointers__.p_isl_id_free) ++#define isl_inequality_alloc (*cloog_pointers__.p_isl_inequality_alloc) ++#define isl_local_space_copy (*cloog_pointers__.p_isl_local_space_copy) ++#define isl_local_space_free (*cloog_pointers__.p_isl_local_space_free) ++#define isl_local_space_from_space (*cloog_pointers__.p_isl_local_space_from_space) ++#define isl_local_space_range (*cloog_pointers__.p_isl_local_space_range) ++#define isl_map_add_constraint (*cloog_pointers__.p_isl_map_add_constraint) ++#define isl_map_add_dims (*cloog_pointers__.p_isl_map_add_dims) ++#define isl_map_align_params (*cloog_pointers__.p_isl_map_align_params) ++#define isl_map_apply_range (*cloog_pointers__.p_isl_map_apply_range) ++#define isl_map_copy (*cloog_pointers__.p_isl_map_copy) ++#define isl_map_dim (*cloog_pointers__.p_isl_map_dim) ++#define isl_map_dump (*cloog_pointers__.p_isl_map_dump) ++#define isl_map_equate (*cloog_pointers__.p_isl_map_equate) ++#define isl_map_fix_si (*cloog_pointers__.p_isl_map_fix_si) ++#define isl_map_flat_product (*cloog_pointers__.p_isl_map_flat_product) ++#define isl_map_flat_range_product (*cloog_pointers__.p_isl_map_flat_range_product) ++#define isl_map_free (*cloog_pointers__.p_isl_map_free) ++#define isl_map_from_basic_map (*cloog_pointers__.p_isl_map_from_basic_map) ++#define isl_map_from_pw_aff (*cloog_pointers__.p_isl_map_from_pw_aff) ++#define isl_map_from_union_map (*cloog_pointers__.p_isl_map_from_union_map) ++#define isl_map_get_ctx (*cloog_pointers__.p_isl_map_get_ctx) ++#define isl_map_get_space (*cloog_pointers__.p_isl_map_get_space) ++#define isl_map_get_tuple_id (*cloog_pointers__.p_isl_map_get_tuple_id) ++#define isl_map_insert_dims (*cloog_pointers__.p_isl_map_insert_dims) ++#define isl_map_intersect (*cloog_pointers__.p_isl_map_intersect) ++#define isl_map_intersect_domain (*cloog_pointers__.p_isl_map_intersect_domain) ++#define isl_map_intersect_range (*cloog_pointers__.p_isl_map_intersect_range) ++#define isl_map_is_empty (*cloog_pointers__.p_isl_map_is_empty) ++#define isl_map_lex_ge (*cloog_pointers__.p_isl_map_lex_ge) ++#define isl_map_lex_le (*cloog_pointers__.p_isl_map_lex_le) ++#define isl_map_n_out (*cloog_pointers__.p_isl_map_n_out) ++#define isl_map_range (*cloog_pointers__.p_isl_map_range) ++#define isl_map_set_tuple_id (*cloog_pointers__.p_isl_map_set_tuple_id) ++#define isl_map_universe (*cloog_pointers__.p_isl_map_universe) ++#define isl_options_set_on_error (*cloog_pointers__.p_isl_options_set_on_error) ++#define isl_options_set_schedule_fuse (*cloog_pointers__.p_isl_options_set_schedule_fuse) ++#define isl_options_set_schedule_max_constant_term (*cloog_pointers__.p_isl_options_set_schedule_max_constant_term) ++#define isl_options_set_schedule_maximize_band_depth (*cloog_pointers__.p_isl_options_set_schedule_maximize_band_depth) ++#define isl_printer_free (*cloog_pointers__.p_isl_printer_free) ++#define isl_printer_print_aff (*cloog_pointers__.p_isl_printer_print_aff) ++#define isl_printer_print_constraint (*cloog_pointers__.p_isl_printer_print_constraint) ++#define isl_printer_print_map (*cloog_pointers__.p_isl_printer_print_map) ++#define isl_printer_print_set (*cloog_pointers__.p_isl_printer_print_set) ++#define isl_printer_to_file (*cloog_pointers__.p_isl_printer_to_file) ++#define isl_pw_aff_add (*cloog_pointers__.p_isl_pw_aff_add) ++#define isl_pw_aff_alloc (*cloog_pointers__.p_isl_pw_aff_alloc) ++#define isl_pw_aff_copy (*cloog_pointers__.p_isl_pw_aff_copy) ++#define isl_pw_aff_eq_set (*cloog_pointers__.p_isl_pw_aff_eq_set) ++#define isl_pw_aff_free (*cloog_pointers__.p_isl_pw_aff_free) ++#define isl_pw_aff_from_aff (*cloog_pointers__.p_isl_pw_aff_from_aff) ++#define isl_pw_aff_ge_set (*cloog_pointers__.p_isl_pw_aff_ge_set) ++#define isl_pw_aff_gt_set (*cloog_pointers__.p_isl_pw_aff_gt_set) ++#define isl_pw_aff_is_cst (*cloog_pointers__.p_isl_pw_aff_is_cst) ++#define isl_pw_aff_le_set (*cloog_pointers__.p_isl_pw_aff_le_set) ++#define isl_pw_aff_lt_set (*cloog_pointers__.p_isl_pw_aff_lt_set) ++#define isl_pw_aff_mod (*cloog_pointers__.p_isl_pw_aff_mod) ++#define isl_pw_aff_mul (*cloog_pointers__.p_isl_pw_aff_mul) ++#define isl_pw_aff_ne_set (*cloog_pointers__.p_isl_pw_aff_ne_set) ++#define isl_pw_aff_nonneg_set (*cloog_pointers__.p_isl_pw_aff_nonneg_set) ++#define isl_pw_aff_set_tuple_id (*cloog_pointers__.p_isl_pw_aff_set_tuple_id) ++#define isl_pw_aff_sub (*cloog_pointers__.p_isl_pw_aff_sub) ++#define isl_pw_aff_zero_set (*cloog_pointers__.p_isl_pw_aff_zero_set) ++#define isl_schedule_free (*cloog_pointers__.p_isl_schedule_free) ++#define isl_schedule_get_band_forest (*cloog_pointers__.p_isl_schedule_get_band_forest) ++#define isl_set_add_constraint (*cloog_pointers__.p_isl_set_add_constraint) ++#define isl_set_add_dims (*cloog_pointers__.p_isl_set_add_dims) ++#define isl_set_apply (*cloog_pointers__.p_isl_set_apply) ++#define isl_set_coalesce (*cloog_pointers__.p_isl_set_coalesce) ++#define isl_set_copy (*cloog_pointers__.p_isl_set_copy) ++#define isl_set_dim (*cloog_pointers__.p_isl_set_dim) ++#define isl_set_fix_si (*cloog_pointers__.p_isl_set_fix_si) ++#define isl_set_free (*cloog_pointers__.p_isl_set_free) ++#define isl_set_from_cloog_domain (*cloog_pointers__.p_isl_set_from_cloog_domain) ++#define isl_set_get_space (*cloog_pointers__.p_isl_set_get_space) ++#define isl_set_get_tuple_id (*cloog_pointers__.p_isl_set_get_tuple_id) ++#define isl_set_intersect (*cloog_pointers__.p_isl_set_intersect) ++#define isl_set_is_empty (*cloog_pointers__.p_isl_set_is_empty) ++#define isl_set_max (*cloog_pointers__.p_isl_set_max) ++#define isl_set_min (*cloog_pointers__.p_isl_set_min) ++#define isl_set_n_dim (*cloog_pointers__.p_isl_set_n_dim) ++#define isl_set_nat_universe (*cloog_pointers__.p_isl_set_nat_universe) ++#define isl_set_project_out (*cloog_pointers__.p_isl_set_project_out) ++#define isl_set_set_tuple_id (*cloog_pointers__.p_isl_set_set_tuple_id) ++#define isl_set_universe (*cloog_pointers__.p_isl_set_universe) ++#define isl_space_add_dims (*cloog_pointers__.p_isl_space_add_dims) ++#define isl_space_alloc (*cloog_pointers__.p_isl_space_alloc) ++#define isl_space_copy (*cloog_pointers__.p_isl_space_copy) ++#define isl_space_dim (*cloog_pointers__.p_isl_space_dim) ++#define isl_space_domain (*cloog_pointers__.p_isl_space_domain) ++#define isl_space_find_dim_by_id (*cloog_pointers__.p_isl_space_find_dim_by_id) ++#define isl_space_free (*cloog_pointers__.p_isl_space_free) ++#define isl_space_from_domain (*cloog_pointers__.p_isl_space_from_domain) ++#define isl_space_get_tuple_id (*cloog_pointers__.p_isl_space_get_tuple_id) ++#define isl_space_params_alloc (*cloog_pointers__.p_isl_space_params_alloc) ++#define isl_space_range (*cloog_pointers__.p_isl_space_range) ++#define isl_space_set_alloc (*cloog_pointers__.p_isl_space_set_alloc) ++#define isl_space_set_dim_id (*cloog_pointers__.p_isl_space_set_dim_id) ++#define isl_space_set_tuple_id (*cloog_pointers__.p_isl_space_set_tuple_id) ++#define isl_union_map_add_map (*cloog_pointers__.p_isl_union_map_add_map) ++#define isl_union_map_align_params (*cloog_pointers__.p_isl_union_map_align_params) ++#define isl_union_map_apply_domain (*cloog_pointers__.p_isl_union_map_apply_domain) ++#define isl_union_map_apply_range (*cloog_pointers__.p_isl_union_map_apply_range) ++#define isl_union_map_compute_flow (*cloog_pointers__.p_isl_union_map_compute_flow) ++#define isl_union_map_copy (*cloog_pointers__.p_isl_union_map_copy) ++#define isl_union_map_empty (*cloog_pointers__.p_isl_union_map_empty) ++#define isl_union_map_flat_range_product (*cloog_pointers__.p_isl_union_map_flat_range_product) ++#define isl_union_map_foreach_map (*cloog_pointers__.p_isl_union_map_foreach_map) ++#define isl_union_map_free (*cloog_pointers__.p_isl_union_map_free) ++#define isl_union_map_from_map (*cloog_pointers__.p_isl_union_map_from_map) ++#define isl_union_map_get_ctx (*cloog_pointers__.p_isl_union_map_get_ctx) ++#define isl_union_map_get_space (*cloog_pointers__.p_isl_union_map_get_space) ++#define isl_union_map_gist_domain (*cloog_pointers__.p_isl_union_map_gist_domain) ++#define isl_union_map_gist_range (*cloog_pointers__.p_isl_union_map_gist_range) ++#define isl_union_map_intersect_domain (*cloog_pointers__.p_isl_union_map_intersect_domain) ++#define isl_union_map_is_empty (*cloog_pointers__.p_isl_union_map_is_empty) ++#define isl_union_map_subtract (*cloog_pointers__.p_isl_union_map_subtract) ++#define isl_union_map_union (*cloog_pointers__.p_isl_union_map_union) ++#define isl_union_set_add_set (*cloog_pointers__.p_isl_union_set_add_set) ++#define isl_union_set_compute_schedule (*cloog_pointers__.p_isl_union_set_compute_schedule) ++#define isl_union_set_copy (*cloog_pointers__.p_isl_union_set_copy) ++#define isl_union_set_empty (*cloog_pointers__.p_isl_union_set_empty) ++#define isl_union_set_from_set (*cloog_pointers__.p_isl_union_set_from_set) ++#define stmt_ass (*cloog_pointers__.p_stmt_ass) ++#define stmt_block (*cloog_pointers__.p_stmt_block) ++#define stmt_for (*cloog_pointers__.p_stmt_for) ++#define stmt_guard (*cloog_pointers__.p_stmt_guard) ++#define stmt_root (*cloog_pointers__.p_stmt_root) ++#define stmt_user (*cloog_pointers__.p_stmt_user) ++ + typedef struct poly_dr *poly_dr_p; + + typedef struct poly_bb *poly_bb_p; +--- gcc/graphite.c.jj 2012-12-13 11:31:00.000000000 +0100 ++++ gcc/graphite.c 2012-12-14 13:40:44.155136961 +0100 +@@ -78,6 +78,34 @@ along with GCC; see the file COPYING3. + + CloogState *cloog_state; + ++__typeof (cloog_pointers__) cloog_pointers__; ++ ++static bool ++init_cloog_pointers (void) ++{ ++ void *h; ++ ++ if (cloog_pointers__.inited) ++ return cloog_pointers__.h != NULL; ++ h = dlopen ("libcloog-isl.so.4", RTLD_LAZY); ++ cloog_pointers__.h = h; ++ if (h == NULL) ++ return false; ++#define DYNSYM(x) \ ++ do \ ++ { \ ++ union { __typeof (cloog_pointers__.p_##x) p; void *q; } u; \ ++ u.q = dlsym (h, #x); \ ++ if (u.q == NULL) \ ++ return false; \ ++ cloog_pointers__.p_##x = u.p; \ ++ } \ ++ while (0) ++ DYNSYMS ++#undef DYNSYM ++ return true; ++} ++ + /* Print global statistics to FILE. */ + + static void +@@ -277,6 +305,15 @@ graphite_transform_loops (void) + if (parallelized_function_p (cfun->decl)) + return; + ++ if (number_of_loops (cfun) <= 1) ++ return; ++ ++ if (!init_cloog_pointers ()) ++ { ++ sorry ("Graphite loop optimizations cannot be used"); ++ return; ++ } ++ + ctx = isl_ctx_alloc (); + isl_options_set_on_error (ctx, ISL_ON_ERROR_ABORT); + if (!graphite_initialize (ctx)) +--- gcc/graphite-clast-to-gimple.c.jj 2012-12-13 11:31:27.000000000 +0100 ++++ gcc/graphite-clast-to-gimple.c 2012-12-14 13:27:47.196519858 +0100 +@@ -910,7 +910,7 @@ compute_bounds_for_loop (struct clast_fo + from STMT_FOR. */ + + static tree +-type_for_clast_for (struct clast_for *stmt_for, ivs_params_p ip) ++type_for_clast_for (struct clast_for *stmt_fora, ivs_params_p ip) + { + mpz_t bound_one, bound_two; + tree lb_type, ub_type; +@@ -918,8 +918,8 @@ type_for_clast_for (struct clast_for *st + mpz_init (bound_one); + mpz_init (bound_two); + +- lb_type = type_for_clast_expr (stmt_for->LB, ip, bound_one, bound_two); +- ub_type = type_for_clast_expr (stmt_for->UB, ip, bound_one, bound_two); ++ lb_type = type_for_clast_expr (stmt_fora->LB, ip, bound_one, bound_two); ++ ub_type = type_for_clast_expr (stmt_fora->UB, ip, bound_one, bound_two); + + mpz_clear (bound_one); + mpz_clear (bound_two); diff --git a/gcc49-cloog-dl2.patch b/gcc49-cloog-dl2.patch new file mode 100644 index 0000000..2f647a3 --- /dev/null +++ b/gcc49-cloog-dl2.patch @@ -0,0 +1,74 @@ +2011-04-04 Jakub Jelinek + + * toplev.c (toplev_main_argv): New variable. + (toplev_main): Initialize it. + * graphite.c (init_cloog_pointers): Load libcloog-isl.so.4 from gcc's private + directory. + +--- gcc/toplev.c.jj 2008-12-09 23:59:10.000000000 +0100 ++++ gcc/toplev.c 2009-01-27 14:33:52.000000000 +0100 +@@ -107,6 +107,8 @@ static bool no_backend; + /* Length of line when printing switch values. */ + #define MAX_LINE 75 + ++const char **toplev_main_argv; ++ + /* Decoded options, and number of such options. */ + struct cl_decoded_option *save_decoded_options; + unsigned int save_decoded_options_count; +@@ -1909,6 +1911,8 @@ toplev_main (int argc, char **argv) + + expandargv (&argc, &argv); + ++ toplev_main_argv = CONST_CAST2 (const char **, char **, argv); ++ + /* Initialization of GCC's environment, and diagnostics. */ + general_init (argv[0]); + +--- gcc/graphite.c.jj 2010-12-01 10:24:32.000000000 -0500 ++++ gcc/graphite.c 2010-12-01 11:46:07.832118193 -0500 +@@ -72,11 +72,39 @@ __typeof (cloog_pointers__) cloog_pointe + static bool + init_cloog_pointers (void) + { +- void *h; +- +- if (cloog_pointers__.inited) +- return cloog_pointers__.h != NULL; +- h = dlopen ("libcloog-isl.so.4", RTLD_LAZY); ++ void *h = NULL; ++ extern const char **toplev_main_argv; ++ char *buf, *p; ++ size_t len; ++ ++ if (cloog_pointers__.inited) ++ return cloog_pointers__.h != NULL; ++ len = progname - toplev_main_argv[0]; ++ buf = XALLOCAVAR (char, len + sizeof "libcloog-isl.so.4"); ++ memcpy (buf, toplev_main_argv[0], len); ++ strcpy (buf + len, "libcloog-isl.so.4"); ++ len += sizeof "libcloog-isl.so.4"; ++ p = strstr (buf, "/libexec/"); ++ if (p != NULL) ++ { ++ while (1) ++ { ++ char *q = strstr (p + 8, "/libexec/"); ++ if (q == NULL) ++ break; ++ p = q; ++ } ++ memmove (p + 4, p + 8, len - (p + 8 - buf)); ++ h = dlopen (buf, RTLD_LAZY); ++ if (h == NULL) ++ { ++ len = progname - toplev_main_argv[0]; ++ memcpy (buf, toplev_main_argv[0], len); ++ strcpy (buf + len, "libcloog-isl.so.4"); ++ } ++ } ++ if (h == NULL) ++ h = dlopen (buf, RTLD_LAZY); + cloog_pointers__.h = h; + if (h == NULL) + return false; diff --git a/gcc49-color-auto.patch b/gcc49-color-auto.patch new file mode 100644 index 0000000..a8cf938 --- /dev/null +++ b/gcc49-color-auto.patch @@ -0,0 +1,46 @@ +2013-09-20 Jakub Jelinek + + * common.opt (-fdiagnostics-color=): Default to auto. + * toplev.c (process_options): Always default to + -fdiagnostics-color=auto if no -f{,no-}diagnostics-color*. + * doc/invoke.texi (-fdiagnostics-color*): Adjust documentation + of the default. + +--- gcc/common.opt.jj 2013-09-18 12:06:53.000000000 +0200 ++++ gcc/common.opt 2013-09-20 10:00:00.935823900 +0200 +@@ -1037,7 +1037,7 @@ Common Alias(fdiagnostics-color=,always, + ; + + fdiagnostics-color= +-Common Joined RejectNegative Var(flag_diagnostics_show_color) Enum(diagnostic_color_rule) Init(DIAGNOSTICS_COLOR_NO) ++Common Joined RejectNegative Var(flag_diagnostics_show_color) Enum(diagnostic_color_rule) Init(DIAGNOSTICS_COLOR_AUTO) + -fdiagnostics-color=[never|always|auto] Colorize diagnostics + + ; Required for these enum values. +--- gcc/toplev.c.jj 2013-09-09 11:32:39.000000000 +0200 ++++ gcc/toplev.c 2013-09-20 10:10:08.198721005 +0200 +@@ -1229,10 +1229,8 @@ process_options (void) + + maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT; + +- /* Default to -fdiagnostics-color=auto if GCC_COLORS is in the environment, +- otherwise default to -fdiagnostics-color=never. */ +- if (!global_options_set.x_flag_diagnostics_show_color +- && getenv ("GCC_COLORS")) ++ /* Default to -fdiagnostics-color=auto. */ ++ if (!global_options_set.x_flag_diagnostics_show_color) + pp_show_color (global_dc->printer) + = colorize_init (DIAGNOSTICS_COLOR_AUTO); + +--- gcc/doc/invoke.texi.jj 2013-09-18 12:06:50.000000000 +0200 ++++ gcc/doc/invoke.texi 2013-09-20 10:09:29.079904455 +0200 +@@ -3046,8 +3046,7 @@ a message which is too long to fit on a + @cindex highlight, color, colour + @vindex GCC_COLORS @r{environment variable} + Use color in diagnostics. @var{WHEN} is @samp{never}, @samp{always}, +-or @samp{auto}. The default is @samp{never} if @env{GCC_COLORS} environment +-variable isn't present in the environment, and @samp{auto} otherwise. ++or @samp{auto}. The default is @samp{auto}. + @samp{auto} means to use color only when the standard error is a terminal. + The forms @option{-fdiagnostics-color} and @option{-fno-diagnostics-color} are + aliases for @option{-fdiagnostics-color=always} and diff --git a/gcc49-hack.patch b/gcc49-hack.patch new file mode 100644 index 0000000..1903e95 --- /dev/null +++ b/gcc49-hack.patch @@ -0,0 +1,102 @@ +--- libada/Makefile.in.jj 2009-01-14 12:07:35.000000000 +0100 ++++ libada/Makefile.in 2009-01-15 14:25:33.000000000 +0100 +@@ -66,18 +66,40 @@ libsubdir := $(libdir)/gcc/$(target_nonc + ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR)) + ADA_RTS_SUBDIR=./rts$(subst /,_,$(MULTISUBDIR)) + ++DEFAULTMULTIFLAGS := ++ifeq ($(MULTISUBDIR),) ++targ:=$(subst -, ,$(target)) ++arch:=$(word 1,$(targ)) ++ifeq ($(words $(targ)),2) ++osys:=$(word 2,$(targ)) ++else ++osys:=$(word 3,$(targ)) ++endif ++ifeq ($(strip $(filter-out i%86 x86_64 powerpc% ppc% s390% sparc% linux%, $(arch) $(osys))),) ++ifeq ($(shell $(CC) $(CFLAGS) -print-multi-os-directory),../lib64) ++DEFAULTMULTIFLAGS := -m64 ++else ++ifeq ($(strip $(filter-out s390%, $(arch))),) ++DEFAULTMULTIFLAGS := -m31 ++else ++DEFAULTMULTIFLAGS := -m32 ++endif ++endif ++endif ++endif ++ + # exeext should not be used because it's the *host* exeext. We're building + # a *target* library, aren't we?!? Likewise for CC. Still, provide bogus + # definitions just in case something slips through the safety net provided + # by recursive make invocations in gcc/ada/Makefile.in + LIBADA_FLAGS_TO_PASS = \ + "MAKEOVERRIDES=" \ +- "LDFLAGS=$(LDFLAGS)" \ ++ "LDFLAGS=$(LDFLAGS) $(DEFAULTMULTIFLAGS)" \ + "LN_S=$(LN_S)" \ + "SHELL=$(SHELL)" \ +- "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \ +- "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \ +- "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \ ++ "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ ++ "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ ++ "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG)" \ + "THREAD_KIND=$(THREAD_KIND)" \ + "TRACE=$(TRACE)" \ +@@ -88,7 +110,7 @@ LIBADA_FLAGS_TO_PASS = \ + "exeext=.exeext.should.not.be.used " \ + 'CC=the.host.compiler.should.not.be.needed' \ + "GCC_FOR_TARGET=$(CC)" \ +- "CFLAGS=$(CFLAGS)" ++ "CFLAGS=$(CFLAGS) $(DEFAULTMULTIFLAGS)" + + # Rules to build gnatlib. + .PHONY: gnatlib gnatlib-plain gnatlib-sjlj gnatlib-zcx gnatlib-shared osconstool +--- gcc/ada/sem_util.adb (revision 161677) ++++ gcc/ada/sem_util.adb (working copy) +@@ -5487,7 +5487,7 @@ package body Sem_Util is + Exp : Node_Id; + Assn : Node_Id; + Choice : Node_Id; +- Comp_Type : Entity_Id; ++ Comp_Type : Entity_Id := Empty; + Is_Array_Aggr : Boolean; + + begin +--- config-ml.in.jj 2010-06-30 09:50:44.000000000 +0200 ++++ config-ml.in 2010-07-02 21:24:17.994211151 +0200 +@@ -516,6 +516,8 @@ multi-do: + ADAFLAGS="$(ADAFLAGS) $${flags}" \ + prefix="$(prefix)" \ + exec_prefix="$(exec_prefix)" \ ++ mandir="$(mandir)" \ ++ infodir="$(infodir)" \ + GCJFLAGS="$(GCJFLAGS) $${flags}" \ + GOCFLAGS="$(GOCFLAGS) $${flags}" \ + CXXFLAGS="$(CXXFLAGS) $${flags}" \ +--- libjava/Makefile.am.jj 2010-07-09 11:17:33.729604090 +0200 ++++ libjava/Makefile.am 2010-07-09 13:16:41.894375641 +0200 +@@ -710,7 +710,8 @@ if USE_LIBGCJ_BC + ## later. + @echo Installing dummy lib libgcj_bc.so.1.0.0; \ + rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \ +- mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \ ++ $(INSTALL) $(INSTALL_STRIP_FLAG) $(here)/.libs/libgcj_bc.so $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \ ++ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0; \ + $(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \ + -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \ + rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \ +--- libjava/Makefile.in.jj 2010-07-09 11:17:34.000000000 +0200 ++++ libjava/Makefile.in 2010-07-09 13:18:07.542572270 +0200 +@@ -12665,7 +12665,8 @@ install-exec-hook: install-binPROGRAMS i + install-libexecsubPROGRAMS + @USE_LIBGCJ_BC_TRUE@ @echo Installing dummy lib libgcj_bc.so.1.0.0; \ + @USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \ +-@USE_LIBGCJ_BC_TRUE@ mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \ ++@USE_LIBGCJ_BC_TRUE@ $(INSTALL) $(INSTALL_STRIP_FLAG) $(here)/.libs/libgcj_bc.so $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \ ++@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0; \ + @USE_LIBGCJ_BC_TRUE@ $(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \ + @USE_LIBGCJ_BC_TRUE@ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \ + @USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \ diff --git a/gcc49-i386-libgomp.patch b/gcc49-i386-libgomp.patch new file mode 100644 index 0000000..520561e --- /dev/null +++ b/gcc49-i386-libgomp.patch @@ -0,0 +1,11 @@ +--- libgomp/configure.tgt.jj 2008-01-10 20:53:48.000000000 +0100 ++++ libgomp/configure.tgt 2008-03-27 12:44:51.000000000 +0100 +@@ -67,7 +67,7 @@ if test $enable_linux_futex = yes; then + ;; + *) + if test -z "$with_arch"; then +- XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}" ++ XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic" + fi + esac + ;; diff --git a/gcc49-java-nomulti.patch b/gcc49-java-nomulti.patch new file mode 100644 index 0000000..17334aa --- /dev/null +++ b/gcc49-java-nomulti.patch @@ -0,0 +1,44 @@ +--- libjava/configure.ac.jj 2007-12-07 17:55:50.000000000 +0100 ++++ libjava/configure.ac 2007-12-07 18:36:56.000000000 +0100 +@@ -82,6 +82,13 @@ AC_ARG_ENABLE(java-maintainer-mode, + [allow rebuilding of .class and .h files])) + AM_CONDITIONAL(JAVA_MAINTAINER_MODE, test "$enable_java_maintainer_mode" = yes) + ++AC_ARG_ENABLE(libjava-multilib, ++ AS_HELP_STRING([--enable-libjava-multilib], [build libjava as multilib])) ++if test "$enable_libjava_multilib" = no; then ++ multilib=no ++ ac_configure_args="$ac_configure_args --disable-multilib" ++fi ++ + # It may not be safe to run linking tests in AC_PROG_CC/AC_PROG_CXX. + GCC_NO_EXECUTABLES + +--- libjava/configure.jj 2007-12-07 17:55:50.000000000 +0100 ++++ libjava/configure 2007-12-07 18:39:58.000000000 +0100 +@@ -1021,6 +1021,8 @@ Optional Features: + default=yes + --enable-java-maintainer-mode + allow rebuilding of .class and .h files ++ --enable-libjava-multilib ++ build libjava as multilib + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-maintainer-mode enable make rules and dependencies not useful +@@ -1973,6 +1975,16 @@ else + fi + + ++# Check whether --enable-libjava-multilib was given. ++if test "${enable_libjava_multilib+set}" = set; then ++ enableval=$enable_libjava_multilib; ++fi ++ ++if test "$enable_libjava_multilib" = no; then ++ multilib=no ++ ac_configure_args="$ac_configure_args --disable-multilib" ++fi ++ + # It may not be safe to run linking tests in AC_PROG_CC/AC_PROG_CXX. + + diff --git a/gcc49-libgo-p224.patch b/gcc49-libgo-p224.patch new file mode 100644 index 0000000..89e06e1 --- /dev/null +++ b/gcc49-libgo-p224.patch @@ -0,0 +1,1093 @@ +--- libgo/Makefile.am.jj 2014-01-08 13:53:06.000000000 +0100 ++++ libgo/Makefile.am 2014-03-05 15:20:09.938466093 +0100 +@@ -1133,7 +1133,6 @@ go_crypto_ecdsa_files = \ + go/crypto/ecdsa/ecdsa.go + go_crypto_elliptic_files = \ + go/crypto/elliptic/elliptic.go \ +- go/crypto/elliptic/p224.go \ + go/crypto/elliptic/p256.go + go_crypto_hmac_files = \ + go/crypto/hmac/hmac.go +--- libgo/Makefile.in.jj 2014-01-08 13:53:06.000000000 +0100 ++++ libgo/Makefile.in 2014-03-05 15:20:20.372465471 +0100 +@@ -1291,7 +1291,6 @@ go_crypto_ecdsa_files = \ + + go_crypto_elliptic_files = \ + go/crypto/elliptic/elliptic.go \ +- go/crypto/elliptic/p224.go \ + go/crypto/elliptic/p256.go + + go_crypto_hmac_files = \ +--- libgo/go/crypto/elliptic/elliptic.go.jj 2013-11-07 11:59:09.000000000 +0100 ++++ libgo/go/crypto/elliptic/elliptic.go 2014-03-05 15:21:04.186462859 +0100 +@@ -326,7 +326,6 @@ var p384 *CurveParams + var p521 *CurveParams + + func initAll() { +- initP224() + initP256() + initP384() + initP521() +--- libgo/go/crypto/elliptic/elliptic_test.go.jj 2013-11-07 11:59:09.000000000 +0100 ++++ libgo/go/crypto/elliptic/elliptic_test.go 2014-03-05 15:46:03.739373453 +0100 +@@ -5,26 +5,16 @@ + package elliptic + + import ( +- "crypto/rand" +- "encoding/hex" +- "fmt" + "math/big" + "testing" + ) + +-func TestOnCurve(t *testing.T) { +- p224 := P224() +- if !p224.IsOnCurve(p224.Params().Gx, p224.Params().Gy) { +- t.Errorf("FAIL") +- } +-} +- + type baseMultTest struct { + k string + x, y string + } + +-var p224BaseMultTests = []baseMultTest{ ++var p256BaseMultTests = []baseMultTest{ + { + "1", + "b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21", +@@ -287,47 +277,12 @@ var p224BaseMultTests = []baseMultTest{ + }, + } + +-func TestBaseMult(t *testing.T) { +- p224 := P224() +- for i, e := range p224BaseMultTests { +- k, ok := new(big.Int).SetString(e.k, 10) +- if !ok { +- t.Errorf("%d: bad value for k: %s", i, e.k) +- } +- x, y := p224.ScalarBaseMult(k.Bytes()) +- if fmt.Sprintf("%x", x) != e.x || fmt.Sprintf("%x", y) != e.y { +- t.Errorf("%d: bad output for k=%s: got (%x, %x), want (%s, %s)", i, e.k, x, y, e.x, e.y) +- } +- if testing.Short() && i > 5 { +- break +- } +- } +-} +- +-func TestGenericBaseMult(t *testing.T) { +- // We use the P224 CurveParams directly in order to test the generic implementation. +- p224 := P224().Params() +- for i, e := range p224BaseMultTests { +- k, ok := new(big.Int).SetString(e.k, 10) +- if !ok { +- t.Errorf("%d: bad value for k: %s", i, e.k) +- } +- x, y := p224.ScalarBaseMult(k.Bytes()) +- if fmt.Sprintf("%x", x) != e.x || fmt.Sprintf("%x", y) != e.y { +- t.Errorf("%d: bad output for k=%s: got (%x, %x), want (%s, %s)", i, e.k, x, y, e.x, e.y) +- } +- if testing.Short() && i > 5 { +- break +- } +- } +-} +- + func TestP256BaseMult(t *testing.T) { + p256 := P256() + p256Generic := p256.Params() + +- scalars := make([]*big.Int, 0, len(p224BaseMultTests)+1) +- for _, e := range p224BaseMultTests { ++ scalars := make([]*big.Int, 0, len(p256BaseMultTests)+1) ++ for _, e := range p256BaseMultTests { + k, _ := new(big.Int).SetString(e.k, 10) + scalars = append(scalars, k) + } +@@ -352,7 +307,7 @@ func TestP256Mult(t *testing.T) { + p256 := P256() + p256Generic := p256.Params() + +- for i, e := range p224BaseMultTests { ++ for i, e := range p256BaseMultTests { + x, _ := new(big.Int).SetString(e.x, 16) + y, _ := new(big.Int).SetString(e.y, 16) + k, _ := new(big.Int).SetString(e.k, 10) +@@ -373,7 +328,6 @@ func TestInfinity(t *testing.T) { + name string + curve Curve + }{ +- {"p224", P224()}, + {"p256", P256()}, + } + +@@ -406,53 +360,13 @@ func TestInfinity(t *testing.T) { + } + } + +-func BenchmarkBaseMult(b *testing.B) { +- b.ResetTimer() +- p224 := P224() +- e := p224BaseMultTests[25] +- k, _ := new(big.Int).SetString(e.k, 10) +- b.StartTimer() +- for i := 0; i < b.N; i++ { +- p224.ScalarBaseMult(k.Bytes()) +- } +-} +- + func BenchmarkBaseMultP256(b *testing.B) { + b.ResetTimer() + p256 := P256() +- e := p224BaseMultTests[25] ++ e := p256BaseMultTests[25] + k, _ := new(big.Int).SetString(e.k, 10) + b.StartTimer() + for i := 0; i < b.N; i++ { + p256.ScalarBaseMult(k.Bytes()) + } + } +- +-func TestMarshal(t *testing.T) { +- p224 := P224() +- _, x, y, err := GenerateKey(p224, rand.Reader) +- if err != nil { +- t.Error(err) +- return +- } +- serialized := Marshal(p224, x, y) +- xx, yy := Unmarshal(p224, serialized) +- if xx == nil { +- t.Error("failed to unmarshal") +- return +- } +- if xx.Cmp(x) != 0 || yy.Cmp(y) != 0 { +- t.Error("unmarshal returned different values") +- return +- } +-} +- +-func TestP224Overflow(t *testing.T) { +- // This tests for a specific bug in the P224 implementation. +- p224 := P224() +- pointData, _ := hex.DecodeString("049B535B45FB0A2072398A6831834624C7E32CCFD5A4B933BCEAF77F1DD945E08BBE5178F5EDF5E733388F196D2A631D2E075BB16CBFEEA15B") +- x, y := Unmarshal(p224, pointData) +- if !p224.IsOnCurve(x, y) { +- t.Error("P224 failed to validate a correct point") +- } +-} +--- libgo/go/crypto/ecdsa/ecdsa_test.go.jj 2012-11-15 18:26:56.000000000 +0100 ++++ libgo/go/crypto/ecdsa/ecdsa_test.go 2014-03-05 15:26:38.461442929 +0100 +@@ -33,7 +33,6 @@ func testKeyGeneration(t *testing.T, c e + } + + func TestKeyGeneration(t *testing.T) { +- testKeyGeneration(t, elliptic.P224(), "p224") + if testing.Short() { + return + } +@@ -63,7 +62,6 @@ func testSignAndVerify(t *testing.T, c e + } + + func TestSignAndVerify(t *testing.T) { +- testSignAndVerify(t, elliptic.P224(), "p224") + if testing.Short() { + return + } +@@ -129,8 +127,6 @@ func TestVectors(t *testing.T) { + parts := strings.SplitN(line, ",", 2) + + switch parts[0] { +- case "P-224": +- pub.Curve = elliptic.P224() + case "P-256": + pub.Curve = elliptic.P256() + case "P-384": +--- libgo/go/crypto/x509/x509.go.jj 2013-11-07 11:59:09.000000000 +0100 ++++ libgo/go/crypto/x509/x509.go 2014-03-05 15:27:37.022439437 +0100 +@@ -305,9 +305,6 @@ func getPublicKeyAlgorithmFromOID(oid as + + // RFC 5480, 2.1.1.1. Named Curve + // +-// secp224r1 OBJECT IDENTIFIER ::= { +-// iso(1) identified-organization(3) certicom(132) curve(0) 33 } +-// + // secp256r1 OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) + // prime(1) 7 } +@@ -320,7 +317,6 @@ func getPublicKeyAlgorithmFromOID(oid as + // + // NB: secp256r1 is equivalent to prime256v1 + var ( +- oidNamedCurveP224 = asn1.ObjectIdentifier{1, 3, 132, 0, 33} + oidNamedCurveP256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 3, 1, 7} + oidNamedCurveP384 = asn1.ObjectIdentifier{1, 3, 132, 0, 34} + oidNamedCurveP521 = asn1.ObjectIdentifier{1, 3, 132, 0, 35} +@@ -328,8 +324,6 @@ var ( + + func namedCurveFromOID(oid asn1.ObjectIdentifier) elliptic.Curve { + switch { +- case oid.Equal(oidNamedCurveP224): +- return elliptic.P224() + case oid.Equal(oidNamedCurveP256): + return elliptic.P256() + case oid.Equal(oidNamedCurveP384): +@@ -342,8 +336,6 @@ func namedCurveFromOID(oid asn1.ObjectId + + func oidFromNamedCurve(curve elliptic.Curve) (asn1.ObjectIdentifier, bool) { + switch curve { +- case elliptic.P224(): +- return oidNamedCurveP224, true + case elliptic.P256(): + return oidNamedCurveP256, true + case elliptic.P384(): +@@ -1373,7 +1365,7 @@ func CreateCertificate(rand io.Reader, t + hashFunc = crypto.SHA1 + case *ecdsa.PrivateKey: + switch priv.Curve { +- case elliptic.P224(), elliptic.P256(): ++ case elliptic.P256(): + hashFunc = crypto.SHA256 + signatureAlgorithm.Algorithm = oidSignatureECDSAWithSHA256 + case elliptic.P384(): +--- libgo/go/crypto/elliptic/p224.go.jj 2012-11-15 18:26:57.000000000 +0100 ++++ libgo/go/crypto/elliptic/p224.go 2014-03-05 15:30:01.189430842 +0100 +@@ -1,765 +0,0 @@ +-// Copyright 2012 The Go Authors. All rights reserved. +-// Use of this source code is governed by a BSD-style +-// license that can be found in the LICENSE file. +- +-package elliptic +- +-// This is a constant-time, 32-bit implementation of P224. See FIPS 186-3, +-// section D.2.2. +-// +-// See http://www.imperialviolet.org/2010/12/04/ecc.html ([1]) for background. +- +-import ( +- "math/big" +-) +- +-var p224 p224Curve +- +-type p224Curve struct { +- *CurveParams +- gx, gy, b p224FieldElement +-} +- +-func initP224() { +- // See FIPS 186-3, section D.2.2 +- p224.CurveParams = new(CurveParams) +- p224.P, _ = new(big.Int).SetString("26959946667150639794667015087019630673557916260026308143510066298881", 10) +- p224.N, _ = new(big.Int).SetString("26959946667150639794667015087019625940457807714424391721682722368061", 10) +- p224.B, _ = new(big.Int).SetString("b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4", 16) +- p224.Gx, _ = new(big.Int).SetString("b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21", 16) +- p224.Gy, _ = new(big.Int).SetString("bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34", 16) +- p224.BitSize = 224 +- +- p224FromBig(&p224.gx, p224.Gx) +- p224FromBig(&p224.gy, p224.Gy) +- p224FromBig(&p224.b, p224.B) +-} +- +-// P224 returns a Curve which implements P-224 (see FIPS 186-3, section D.2.2) +-func P224() Curve { +- initonce.Do(initAll) +- return p224 +-} +- +-func (curve p224Curve) Params() *CurveParams { +- return curve.CurveParams +-} +- +-func (curve p224Curve) IsOnCurve(bigX, bigY *big.Int) bool { +- var x, y p224FieldElement +- p224FromBig(&x, bigX) +- p224FromBig(&y, bigY) +- +- // y² = x³ - 3x + b +- var tmp p224LargeFieldElement +- var x3 p224FieldElement +- p224Square(&x3, &x, &tmp) +- p224Mul(&x3, &x3, &x, &tmp) +- +- for i := 0; i < 8; i++ { +- x[i] *= 3 +- } +- p224Sub(&x3, &x3, &x) +- p224Reduce(&x3) +- p224Add(&x3, &x3, &curve.b) +- p224Contract(&x3, &x3) +- +- p224Square(&y, &y, &tmp) +- p224Contract(&y, &y) +- +- for i := 0; i < 8; i++ { +- if y[i] != x3[i] { +- return false +- } +- } +- return true +-} +- +-func (p224Curve) Add(bigX1, bigY1, bigX2, bigY2 *big.Int) (x, y *big.Int) { +- var x1, y1, z1, x2, y2, z2, x3, y3, z3 p224FieldElement +- +- p224FromBig(&x1, bigX1) +- p224FromBig(&y1, bigY1) +- if bigX1.Sign() != 0 || bigY1.Sign() != 0 { +- z1[0] = 1 +- } +- p224FromBig(&x2, bigX2) +- p224FromBig(&y2, bigY2) +- if bigX2.Sign() != 0 || bigY2.Sign() != 0 { +- z2[0] = 1 +- } +- +- p224AddJacobian(&x3, &y3, &z3, &x1, &y1, &z1, &x2, &y2, &z2) +- return p224ToAffine(&x3, &y3, &z3) +-} +- +-func (p224Curve) Double(bigX1, bigY1 *big.Int) (x, y *big.Int) { +- var x1, y1, z1, x2, y2, z2 p224FieldElement +- +- p224FromBig(&x1, bigX1) +- p224FromBig(&y1, bigY1) +- z1[0] = 1 +- +- p224DoubleJacobian(&x2, &y2, &z2, &x1, &y1, &z1) +- return p224ToAffine(&x2, &y2, &z2) +-} +- +-func (p224Curve) ScalarMult(bigX1, bigY1 *big.Int, scalar []byte) (x, y *big.Int) { +- var x1, y1, z1, x2, y2, z2 p224FieldElement +- +- p224FromBig(&x1, bigX1) +- p224FromBig(&y1, bigY1) +- z1[0] = 1 +- +- p224ScalarMult(&x2, &y2, &z2, &x1, &y1, &z1, scalar) +- return p224ToAffine(&x2, &y2, &z2) +-} +- +-func (curve p224Curve) ScalarBaseMult(scalar []byte) (x, y *big.Int) { +- var z1, x2, y2, z2 p224FieldElement +- +- z1[0] = 1 +- p224ScalarMult(&x2, &y2, &z2, &curve.gx, &curve.gy, &z1, scalar) +- return p224ToAffine(&x2, &y2, &z2) +-} +- +-// Field element functions. +-// +-// The field that we're dealing with is ℤ/pℤ where p = 2**224 - 2**96 + 1. +-// +-// Field elements are represented by a FieldElement, which is a typedef to an +-// array of 8 uint32's. The value of a FieldElement, a, is: +-// a[0] + 2**28·a[1] + 2**56·a[1] + ... + 2**196·a[7] +-// +-// Using 28-bit limbs means that there's only 4 bits of headroom, which is less +-// than we would really like. But it has the useful feature that we hit 2**224 +-// exactly, making the reflections during a reduce much nicer. +-type p224FieldElement [8]uint32 +- +-// p224P is the order of the field, represented as a p224FieldElement. +-var p224P = [8]uint32{1, 0, 0, 0xffff000, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff} +- +-// p224IsZero returns 1 if a == 0 mod p and 0 otherwise. +-// +-// a[i] < 2**29 +-func p224IsZero(a *p224FieldElement) uint32 { +- // Since a p224FieldElement contains 224 bits there are two possible +- // representations of 0: 0 and p. +- var minimal p224FieldElement +- p224Contract(&minimal, a) +- +- var isZero, isP uint32 +- for i, v := range minimal { +- isZero |= v +- isP |= v - p224P[i] +- } +- +- // If either isZero or isP is 0, then we should return 1. +- isZero |= isZero >> 16 +- isZero |= isZero >> 8 +- isZero |= isZero >> 4 +- isZero |= isZero >> 2 +- isZero |= isZero >> 1 +- +- isP |= isP >> 16 +- isP |= isP >> 8 +- isP |= isP >> 4 +- isP |= isP >> 2 +- isP |= isP >> 1 +- +- // For isZero and isP, the LSB is 0 iff all the bits are zero. +- result := isZero & isP +- result = (^result) & 1 +- +- return result +-} +- +-// p224Add computes *out = a+b +-// +-// a[i] + b[i] < 2**32 +-func p224Add(out, a, b *p224FieldElement) { +- for i := 0; i < 8; i++ { +- out[i] = a[i] + b[i] +- } +-} +- +-const two31p3 = 1<<31 + 1<<3 +-const two31m3 = 1<<31 - 1<<3 +-const two31m15m3 = 1<<31 - 1<<15 - 1<<3 +- +-// p224ZeroModP31 is 0 mod p where bit 31 is set in all limbs so that we can +-// subtract smaller amounts without underflow. See the section "Subtraction" in +-// [1] for reasoning. +-var p224ZeroModP31 = []uint32{two31p3, two31m3, two31m3, two31m15m3, two31m3, two31m3, two31m3, two31m3} +- +-// p224Sub computes *out = a-b +-// +-// a[i], b[i] < 2**30 +-// out[i] < 2**32 +-func p224Sub(out, a, b *p224FieldElement) { +- for i := 0; i < 8; i++ { +- out[i] = a[i] + p224ZeroModP31[i] - b[i] +- } +-} +- +-// LargeFieldElement also represents an element of the field. The limbs are +-// still spaced 28-bits apart and in little-endian order. So the limbs are at +-// 0, 28, 56, ..., 392 bits, each 64-bits wide. +-type p224LargeFieldElement [15]uint64 +- +-const two63p35 = 1<<63 + 1<<35 +-const two63m35 = 1<<63 - 1<<35 +-const two63m35m19 = 1<<63 - 1<<35 - 1<<19 +- +-// p224ZeroModP63 is 0 mod p where bit 63 is set in all limbs. See the section +-// "Subtraction" in [1] for why. +-var p224ZeroModP63 = [8]uint64{two63p35, two63m35, two63m35, two63m35, two63m35m19, two63m35, two63m35, two63m35} +- +-const bottom12Bits = 0xfff +-const bottom28Bits = 0xfffffff +- +-// p224Mul computes *out = a*b +-// +-// a[i] < 2**29, b[i] < 2**30 (or vice versa) +-// out[i] < 2**29 +-func p224Mul(out, a, b *p224FieldElement, tmp *p224LargeFieldElement) { +- for i := 0; i < 15; i++ { +- tmp[i] = 0 +- } +- +- for i := 0; i < 8; i++ { +- for j := 0; j < 8; j++ { +- tmp[i+j] += uint64(a[i]) * uint64(b[j]) +- } +- } +- +- p224ReduceLarge(out, tmp) +-} +- +-// Square computes *out = a*a +-// +-// a[i] < 2**29 +-// out[i] < 2**29 +-func p224Square(out, a *p224FieldElement, tmp *p224LargeFieldElement) { +- for i := 0; i < 15; i++ { +- tmp[i] = 0 +- } +- +- for i := 0; i < 8; i++ { +- for j := 0; j <= i; j++ { +- r := uint64(a[i]) * uint64(a[j]) +- if i == j { +- tmp[i+j] += r +- } else { +- tmp[i+j] += r << 1 +- } +- } +- } +- +- p224ReduceLarge(out, tmp) +-} +- +-// ReduceLarge converts a p224LargeFieldElement to a p224FieldElement. +-// +-// in[i] < 2**62 +-func p224ReduceLarge(out *p224FieldElement, in *p224LargeFieldElement) { +- for i := 0; i < 8; i++ { +- in[i] += p224ZeroModP63[i] +- } +- +- // Eliminate the coefficients at 2**224 and greater. +- for i := 14; i >= 8; i-- { +- in[i-8] -= in[i] +- in[i-5] += (in[i] & 0xffff) << 12 +- in[i-4] += in[i] >> 16 +- } +- in[8] = 0 +- // in[0..8] < 2**64 +- +- // As the values become small enough, we start to store them in |out| +- // and use 32-bit operations. +- for i := 1; i < 8; i++ { +- in[i+1] += in[i] >> 28 +- out[i] = uint32(in[i] & bottom28Bits) +- } +- in[0] -= in[8] +- out[3] += uint32(in[8]&0xffff) << 12 +- out[4] += uint32(in[8] >> 16) +- // in[0] < 2**64 +- // out[3] < 2**29 +- // out[4] < 2**29 +- // out[1,2,5..7] < 2**28 +- +- out[0] = uint32(in[0] & bottom28Bits) +- out[1] += uint32((in[0] >> 28) & bottom28Bits) +- out[2] += uint32(in[0] >> 56) +- // out[0] < 2**28 +- // out[1..4] < 2**29 +- // out[5..7] < 2**28 +-} +- +-// Reduce reduces the coefficients of a to smaller bounds. +-// +-// On entry: a[i] < 2**31 + 2**30 +-// On exit: a[i] < 2**29 +-func p224Reduce(a *p224FieldElement) { +- for i := 0; i < 7; i++ { +- a[i+1] += a[i] >> 28 +- a[i] &= bottom28Bits +- } +- top := a[7] >> 28 +- a[7] &= bottom28Bits +- +- // top < 2**4 +- mask := top +- mask |= mask >> 2 +- mask |= mask >> 1 +- mask <<= 31 +- mask = uint32(int32(mask) >> 31) +- // Mask is all ones if top != 0, all zero otherwise +- +- a[0] -= top +- a[3] += top << 12 +- +- // We may have just made a[0] negative but, if we did, then we must +- // have added something to a[3], this it's > 2**12. Therefore we can +- // carry down to a[0]. +- a[3] -= 1 & mask +- a[2] += mask & (1<<28 - 1) +- a[1] += mask & (1<<28 - 1) +- a[0] += mask & (1 << 28) +-} +- +-// p224Invert calculates *out = in**-1 by computing in**(2**224 - 2**96 - 1), +-// i.e. Fermat's little theorem. +-func p224Invert(out, in *p224FieldElement) { +- var f1, f2, f3, f4 p224FieldElement +- var c p224LargeFieldElement +- +- p224Square(&f1, in, &c) // 2 +- p224Mul(&f1, &f1, in, &c) // 2**2 - 1 +- p224Square(&f1, &f1, &c) // 2**3 - 2 +- p224Mul(&f1, &f1, in, &c) // 2**3 - 1 +- p224Square(&f2, &f1, &c) // 2**4 - 2 +- p224Square(&f2, &f2, &c) // 2**5 - 4 +- p224Square(&f2, &f2, &c) // 2**6 - 8 +- p224Mul(&f1, &f1, &f2, &c) // 2**6 - 1 +- p224Square(&f2, &f1, &c) // 2**7 - 2 +- for i := 0; i < 5; i++ { // 2**12 - 2**6 +- p224Square(&f2, &f2, &c) +- } +- p224Mul(&f2, &f2, &f1, &c) // 2**12 - 1 +- p224Square(&f3, &f2, &c) // 2**13 - 2 +- for i := 0; i < 11; i++ { // 2**24 - 2**12 +- p224Square(&f3, &f3, &c) +- } +- p224Mul(&f2, &f3, &f2, &c) // 2**24 - 1 +- p224Square(&f3, &f2, &c) // 2**25 - 2 +- for i := 0; i < 23; i++ { // 2**48 - 2**24 +- p224Square(&f3, &f3, &c) +- } +- p224Mul(&f3, &f3, &f2, &c) // 2**48 - 1 +- p224Square(&f4, &f3, &c) // 2**49 - 2 +- for i := 0; i < 47; i++ { // 2**96 - 2**48 +- p224Square(&f4, &f4, &c) +- } +- p224Mul(&f3, &f3, &f4, &c) // 2**96 - 1 +- p224Square(&f4, &f3, &c) // 2**97 - 2 +- for i := 0; i < 23; i++ { // 2**120 - 2**24 +- p224Square(&f4, &f4, &c) +- } +- p224Mul(&f2, &f4, &f2, &c) // 2**120 - 1 +- for i := 0; i < 6; i++ { // 2**126 - 2**6 +- p224Square(&f2, &f2, &c) +- } +- p224Mul(&f1, &f1, &f2, &c) // 2**126 - 1 +- p224Square(&f1, &f1, &c) // 2**127 - 2 +- p224Mul(&f1, &f1, in, &c) // 2**127 - 1 +- for i := 0; i < 97; i++ { // 2**224 - 2**97 +- p224Square(&f1, &f1, &c) +- } +- p224Mul(out, &f1, &f3, &c) // 2**224 - 2**96 - 1 +-} +- +-// p224Contract converts a FieldElement to its unique, minimal form. +-// +-// On entry, in[i] < 2**29 +-// On exit, in[i] < 2**28 +-func p224Contract(out, in *p224FieldElement) { +- copy(out[:], in[:]) +- +- for i := 0; i < 7; i++ { +- out[i+1] += out[i] >> 28 +- out[i] &= bottom28Bits +- } +- top := out[7] >> 28 +- out[7] &= bottom28Bits +- +- out[0] -= top +- out[3] += top << 12 +- +- // We may just have made out[i] negative. So we carry down. If we made +- // out[0] negative then we know that out[3] is sufficiently positive +- // because we just added to it. +- for i := 0; i < 3; i++ { +- mask := uint32(int32(out[i]) >> 31) +- out[i] += (1 << 28) & mask +- out[i+1] -= 1 & mask +- } +- +- // We might have pushed out[3] over 2**28 so we perform another, partial, +- // carry chain. +- for i := 3; i < 7; i++ { +- out[i+1] += out[i] >> 28 +- out[i] &= bottom28Bits +- } +- top = out[7] >> 28 +- out[7] &= bottom28Bits +- +- // Eliminate top while maintaining the same value mod p. +- out[0] -= top +- out[3] += top << 12 +- +- // There are two cases to consider for out[3]: +- // 1) The first time that we eliminated top, we didn't push out[3] over +- // 2**28. In this case, the partial carry chain didn't change any values +- // and top is zero. +- // 2) We did push out[3] over 2**28 the first time that we eliminated top. +- // The first value of top was in [0..16), therefore, prior to eliminating +- // the first top, 0xfff1000 <= out[3] <= 0xfffffff. Therefore, after +- // overflowing and being reduced by the second carry chain, out[3] <= +- // 0xf000. Thus it cannot have overflowed when we eliminated top for the +- // second time. +- +- // Again, we may just have made out[0] negative, so do the same carry down. +- // As before, if we made out[0] negative then we know that out[3] is +- // sufficiently positive. +- for i := 0; i < 3; i++ { +- mask := uint32(int32(out[i]) >> 31) +- out[i] += (1 << 28) & mask +- out[i+1] -= 1 & mask +- } +- +- // Now we see if the value is >= p and, if so, subtract p. +- +- // First we build a mask from the top four limbs, which must all be +- // equal to bottom28Bits if the whole value is >= p. If top4AllOnes +- // ends up with any zero bits in the bottom 28 bits, then this wasn't +- // true. +- top4AllOnes := uint32(0xffffffff) +- for i := 4; i < 8; i++ { +- top4AllOnes &= out[i] +- } +- top4AllOnes |= 0xf0000000 +- // Now we replicate any zero bits to all the bits in top4AllOnes. +- top4AllOnes &= top4AllOnes >> 16 +- top4AllOnes &= top4AllOnes >> 8 +- top4AllOnes &= top4AllOnes >> 4 +- top4AllOnes &= top4AllOnes >> 2 +- top4AllOnes &= top4AllOnes >> 1 +- top4AllOnes = uint32(int32(top4AllOnes<<31) >> 31) +- +- // Now we test whether the bottom three limbs are non-zero. +- bottom3NonZero := out[0] | out[1] | out[2] +- bottom3NonZero |= bottom3NonZero >> 16 +- bottom3NonZero |= bottom3NonZero >> 8 +- bottom3NonZero |= bottom3NonZero >> 4 +- bottom3NonZero |= bottom3NonZero >> 2 +- bottom3NonZero |= bottom3NonZero >> 1 +- bottom3NonZero = uint32(int32(bottom3NonZero<<31) >> 31) +- +- // Everything depends on the value of out[3]. +- // If it's > 0xffff000 and top4AllOnes != 0 then the whole value is >= p +- // If it's = 0xffff000 and top4AllOnes != 0 and bottom3NonZero != 0, +- // then the whole value is >= p +- // If it's < 0xffff000, then the whole value is < p +- n := out[3] - 0xffff000 +- out3Equal := n +- out3Equal |= out3Equal >> 16 +- out3Equal |= out3Equal >> 8 +- out3Equal |= out3Equal >> 4 +- out3Equal |= out3Equal >> 2 +- out3Equal |= out3Equal >> 1 +- out3Equal = ^uint32(int32(out3Equal<<31) >> 31) +- +- // If out[3] > 0xffff000 then n's MSB will be zero. +- out3GT := ^uint32(int32(n) >> 31) +- +- mask := top4AllOnes & ((out3Equal & bottom3NonZero) | out3GT) +- out[0] -= 1 & mask +- out[3] -= 0xffff000 & mask +- out[4] -= 0xfffffff & mask +- out[5] -= 0xfffffff & mask +- out[6] -= 0xfffffff & mask +- out[7] -= 0xfffffff & mask +-} +- +-// Group element functions. +-// +-// These functions deal with group elements. The group is an elliptic curve +-// group with a = -3 defined in FIPS 186-3, section D.2.2. +- +-// p224AddJacobian computes *out = a+b where a != b. +-func p224AddJacobian(x3, y3, z3, x1, y1, z1, x2, y2, z2 *p224FieldElement) { +- // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-p224Add-2007-bl +- var z1z1, z2z2, u1, u2, s1, s2, h, i, j, r, v p224FieldElement +- var c p224LargeFieldElement +- +- z1IsZero := p224IsZero(z1) +- z2IsZero := p224IsZero(z2) +- +- // Z1Z1 = Z1² +- p224Square(&z1z1, z1, &c) +- // Z2Z2 = Z2² +- p224Square(&z2z2, z2, &c) +- // U1 = X1*Z2Z2 +- p224Mul(&u1, x1, &z2z2, &c) +- // U2 = X2*Z1Z1 +- p224Mul(&u2, x2, &z1z1, &c) +- // S1 = Y1*Z2*Z2Z2 +- p224Mul(&s1, z2, &z2z2, &c) +- p224Mul(&s1, y1, &s1, &c) +- // S2 = Y2*Z1*Z1Z1 +- p224Mul(&s2, z1, &z1z1, &c) +- p224Mul(&s2, y2, &s2, &c) +- // H = U2-U1 +- p224Sub(&h, &u2, &u1) +- p224Reduce(&h) +- xEqual := p224IsZero(&h) +- // I = (2*H)² +- for j := 0; j < 8; j++ { +- i[j] = h[j] << 1 +- } +- p224Reduce(&i) +- p224Square(&i, &i, &c) +- // J = H*I +- p224Mul(&j, &h, &i, &c) +- // r = 2*(S2-S1) +- p224Sub(&r, &s2, &s1) +- p224Reduce(&r) +- yEqual := p224IsZero(&r) +- if xEqual == 1 && yEqual == 1 && z1IsZero == 0 && z2IsZero == 0 { +- p224DoubleJacobian(x3, y3, z3, x1, y1, z1) +- return +- } +- for i := 0; i < 8; i++ { +- r[i] <<= 1 +- } +- p224Reduce(&r) +- // V = U1*I +- p224Mul(&v, &u1, &i, &c) +- // Z3 = ((Z1+Z2)²-Z1Z1-Z2Z2)*H +- p224Add(&z1z1, &z1z1, &z2z2) +- p224Add(&z2z2, z1, z2) +- p224Reduce(&z2z2) +- p224Square(&z2z2, &z2z2, &c) +- p224Sub(z3, &z2z2, &z1z1) +- p224Reduce(z3) +- p224Mul(z3, z3, &h, &c) +- // X3 = r²-J-2*V +- for i := 0; i < 8; i++ { +- z1z1[i] = v[i] << 1 +- } +- p224Add(&z1z1, &j, &z1z1) +- p224Reduce(&z1z1) +- p224Square(x3, &r, &c) +- p224Sub(x3, x3, &z1z1) +- p224Reduce(x3) +- // Y3 = r*(V-X3)-2*S1*J +- for i := 0; i < 8; i++ { +- s1[i] <<= 1 +- } +- p224Mul(&s1, &s1, &j, &c) +- p224Sub(&z1z1, &v, x3) +- p224Reduce(&z1z1) +- p224Mul(&z1z1, &z1z1, &r, &c) +- p224Sub(y3, &z1z1, &s1) +- p224Reduce(y3) +- +- p224CopyConditional(x3, x2, z1IsZero) +- p224CopyConditional(x3, x1, z2IsZero) +- p224CopyConditional(y3, y2, z1IsZero) +- p224CopyConditional(y3, y1, z2IsZero) +- p224CopyConditional(z3, z2, z1IsZero) +- p224CopyConditional(z3, z1, z2IsZero) +-} +- +-// p224DoubleJacobian computes *out = a+a. +-func p224DoubleJacobian(x3, y3, z3, x1, y1, z1 *p224FieldElement) { +- var delta, gamma, beta, alpha, t p224FieldElement +- var c p224LargeFieldElement +- +- p224Square(&delta, z1, &c) +- p224Square(&gamma, y1, &c) +- p224Mul(&beta, x1, &gamma, &c) +- +- // alpha = 3*(X1-delta)*(X1+delta) +- p224Add(&t, x1, &delta) +- for i := 0; i < 8; i++ { +- t[i] += t[i] << 1 +- } +- p224Reduce(&t) +- p224Sub(&alpha, x1, &delta) +- p224Reduce(&alpha) +- p224Mul(&alpha, &alpha, &t, &c) +- +- // Z3 = (Y1+Z1)²-gamma-delta +- p224Add(z3, y1, z1) +- p224Reduce(z3) +- p224Square(z3, z3, &c) +- p224Sub(z3, z3, &gamma) +- p224Reduce(z3) +- p224Sub(z3, z3, &delta) +- p224Reduce(z3) +- +- // X3 = alpha²-8*beta +- for i := 0; i < 8; i++ { +- delta[i] = beta[i] << 3 +- } +- p224Reduce(&delta) +- p224Square(x3, &alpha, &c) +- p224Sub(x3, x3, &delta) +- p224Reduce(x3) +- +- // Y3 = alpha*(4*beta-X3)-8*gamma² +- for i := 0; i < 8; i++ { +- beta[i] <<= 2 +- } +- p224Sub(&beta, &beta, x3) +- p224Reduce(&beta) +- p224Square(&gamma, &gamma, &c) +- for i := 0; i < 8; i++ { +- gamma[i] <<= 3 +- } +- p224Reduce(&gamma) +- p224Mul(y3, &alpha, &beta, &c) +- p224Sub(y3, y3, &gamma) +- p224Reduce(y3) +-} +- +-// p224CopyConditional sets *out = *in iff the least-significant-bit of control +-// is true, and it runs in constant time. +-func p224CopyConditional(out, in *p224FieldElement, control uint32) { +- control <<= 31 +- control = uint32(int32(control) >> 31) +- +- for i := 0; i < 8; i++ { +- out[i] ^= (out[i] ^ in[i]) & control +- } +-} +- +-func p224ScalarMult(outX, outY, outZ, inX, inY, inZ *p224FieldElement, scalar []byte) { +- var xx, yy, zz p224FieldElement +- for i := 0; i < 8; i++ { +- outX[i] = 0 +- outY[i] = 0 +- outZ[i] = 0 +- } +- +- for _, byte := range scalar { +- for bitNum := uint(0); bitNum < 8; bitNum++ { +- p224DoubleJacobian(outX, outY, outZ, outX, outY, outZ) +- bit := uint32((byte >> (7 - bitNum)) & 1) +- p224AddJacobian(&xx, &yy, &zz, inX, inY, inZ, outX, outY, outZ) +- p224CopyConditional(outX, &xx, bit) +- p224CopyConditional(outY, &yy, bit) +- p224CopyConditional(outZ, &zz, bit) +- } +- } +-} +- +-// p224ToAffine converts from Jacobian to affine form. +-func p224ToAffine(x, y, z *p224FieldElement) (*big.Int, *big.Int) { +- var zinv, zinvsq, outx, outy p224FieldElement +- var tmp p224LargeFieldElement +- +- if isPointAtInfinity := p224IsZero(z); isPointAtInfinity == 1 { +- return new(big.Int), new(big.Int) +- } +- +- p224Invert(&zinv, z) +- p224Square(&zinvsq, &zinv, &tmp) +- p224Mul(x, x, &zinvsq, &tmp) +- p224Mul(&zinvsq, &zinvsq, &zinv, &tmp) +- p224Mul(y, y, &zinvsq, &tmp) +- +- p224Contract(&outx, x) +- p224Contract(&outy, y) +- return p224ToBig(&outx), p224ToBig(&outy) +-} +- +-// get28BitsFromEnd returns the least-significant 28 bits from buf>>shift, +-// where buf is interpreted as a big-endian number. +-func get28BitsFromEnd(buf []byte, shift uint) (uint32, []byte) { +- var ret uint32 +- +- for i := uint(0); i < 4; i++ { +- var b byte +- if l := len(buf); l > 0 { +- b = buf[l-1] +- // We don't remove the byte if we're about to return and we're not +- // reading all of it. +- if i != 3 || shift == 4 { +- buf = buf[:l-1] +- } +- } +- ret |= uint32(b) << (8 * i) >> shift +- } +- ret &= bottom28Bits +- return ret, buf +-} +- +-// p224FromBig sets *out = *in. +-func p224FromBig(out *p224FieldElement, in *big.Int) { +- bytes := in.Bytes() +- out[0], bytes = get28BitsFromEnd(bytes, 0) +- out[1], bytes = get28BitsFromEnd(bytes, 4) +- out[2], bytes = get28BitsFromEnd(bytes, 0) +- out[3], bytes = get28BitsFromEnd(bytes, 4) +- out[4], bytes = get28BitsFromEnd(bytes, 0) +- out[5], bytes = get28BitsFromEnd(bytes, 4) +- out[6], bytes = get28BitsFromEnd(bytes, 0) +- out[7], bytes = get28BitsFromEnd(bytes, 4) +-} +- +-// p224ToBig returns in as a big.Int. +-func p224ToBig(in *p224FieldElement) *big.Int { +- var buf [28]byte +- buf[27] = byte(in[0]) +- buf[26] = byte(in[0] >> 8) +- buf[25] = byte(in[0] >> 16) +- buf[24] = byte(((in[0] >> 24) & 0x0f) | (in[1]<<4)&0xf0) +- +- buf[23] = byte(in[1] >> 4) +- buf[22] = byte(in[1] >> 12) +- buf[21] = byte(in[1] >> 20) +- +- buf[20] = byte(in[2]) +- buf[19] = byte(in[2] >> 8) +- buf[18] = byte(in[2] >> 16) +- buf[17] = byte(((in[2] >> 24) & 0x0f) | (in[3]<<4)&0xf0) +- +- buf[16] = byte(in[3] >> 4) +- buf[15] = byte(in[3] >> 12) +- buf[14] = byte(in[3] >> 20) +- +- buf[13] = byte(in[4]) +- buf[12] = byte(in[4] >> 8) +- buf[11] = byte(in[4] >> 16) +- buf[10] = byte(((in[4] >> 24) & 0x0f) | (in[5]<<4)&0xf0) +- +- buf[9] = byte(in[5] >> 4) +- buf[8] = byte(in[5] >> 12) +- buf[7] = byte(in[5] >> 20) +- +- buf[6] = byte(in[6]) +- buf[5] = byte(in[6] >> 8) +- buf[4] = byte(in[6] >> 16) +- buf[3] = byte(((in[6] >> 24) & 0x0f) | (in[7]<<4)&0xf0) +- +- buf[2] = byte(in[7] >> 4) +- buf[1] = byte(in[7] >> 12) +- buf[0] = byte(in[7] >> 20) +- +- return new(big.Int).SetBytes(buf[:]) +-} +--- libgo/go/crypto/elliptic/p224_test.go.jj 2012-11-15 18:26:57.000000000 +0100 ++++ libgo/go/crypto/elliptic/p224_test.go 2014-03-05 15:29:58.743430988 +0100 +@@ -1,47 +0,0 @@ +-// Copyright 2012 The Go Authors. All rights reserved. +-// Use of this source code is governed by a BSD-style +-// license that can be found in the LICENSE file. +- +-package elliptic +- +-import ( +- "math/big" +- "testing" +-) +- +-var toFromBigTests = []string{ +- "0", +- "1", +- "23", +- "b70e0cb46bb4bf7f321390b94a03c1d356c01122343280d6105c1d21", +- "706a46d476dcb76798e6046d89474788d164c18032d268fd10704fa6", +-} +- +-func p224AlternativeToBig(in *p224FieldElement) *big.Int { +- ret := new(big.Int) +- tmp := new(big.Int) +- +- for i := uint(0); i < 8; i++ { +- tmp.SetInt64(int64(in[i])) +- tmp.Lsh(tmp, 28*i) +- ret.Add(ret, tmp) +- } +- ret.Mod(ret, p224.P) +- return ret +-} +- +-func TestToFromBig(t *testing.T) { +- for i, test := range toFromBigTests { +- n, _ := new(big.Int).SetString(test, 16) +- var x p224FieldElement +- p224FromBig(&x, n) +- m := p224ToBig(&x) +- if n.Cmp(m) != 0 { +- t.Errorf("#%d: %x != %x", i, n, m) +- } +- q := p224AlternativeToBig(&x) +- if n.Cmp(q) != 0 { +- t.Errorf("#%d: %x != %x (alternative)", i, n, m) +- } +- } +-} +--- libgo/go/crypto/elliptic/p256.go.jj 2013-11-07 11:59:09.000000000 +0100 ++++ libgo/go/crypto/elliptic/p256.go 2014-03-05 15:34:31.910414701 +0100 +@@ -233,6 +233,8 @@ func p256ReduceCarry(inout *[p256Limbs]u + inout[7] += carry << 25 + } + ++const bottom28Bits = 0xfffffff ++ + // p256Sum sets out = in+in2. + // + // On entry, in[i]+in2[i] must not overflow a 32-bit word. +@@ -265,6 +267,7 @@ const ( + two31m2 = 1<<31 - 1<<2 + two31p24m2 = 1<<31 + 1<<24 - 1<<2 + two30m27m2 = 1<<30 - 1<<27 - 1<<2 ++ two31m3 = 1<<31 - 1<<3 + ) + + // p256Zero31 is 0 mod p. diff --git a/gcc49-libgomp-omp_h-multilib.patch b/gcc49-libgomp-omp_h-multilib.patch new file mode 100644 index 0000000..d0e98d1 --- /dev/null +++ b/gcc49-libgomp-omp_h-multilib.patch @@ -0,0 +1,17 @@ +2008-06-09 Jakub Jelinek + + * omp.h.in (omp_nest_lock_t): Fix up for Linux multilibs. + +--- libgomp/omp.h.in.jj 2008-06-09 13:34:05.000000000 +0200 ++++ libgomp/omp.h.in 2008-06-09 13:34:48.000000000 +0200 +@@ -42,8 +42,8 @@ typedef struct + + typedef struct + { +- unsigned char _x[@OMP_NEST_LOCK_SIZE@] +- __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@))); ++ unsigned char _x[8 + sizeof (void *)] ++ __attribute__((__aligned__(sizeof (void *)))); + } omp_nest_lock_t; + #endif + diff --git a/gcc49-libstdc++-docs.patch b/gcc49-libstdc++-docs.patch new file mode 100644 index 0000000..ee8598a --- /dev/null +++ b/gcc49-libstdc++-docs.patch @@ -0,0 +1,26 @@ +--- libstdc++-v3/doc/html/index.html.jj 2011-01-03 12:53:21.282829010 +0100 ++++ libstdc++-v3/doc/html/index.html 2011-01-04 18:06:28.999851145 +0100 +@@ -5,6 +5,8 @@ + FSF + +

++ Release 4.9.2 ++

+ Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation + License, Version 1.2 or any later version published by the +--- libstdc++-v3/doc/html/api.html.jj 2011-01-03 12:53:21.000000000 +0100 ++++ libstdc++-v3/doc/html/api.html 2011-01-04 18:12:01.672757784 +0100 +@@ -18,8 +18,11 @@ + member functions for the library classes, finding out what is in a + particular include file, looking at inheritance diagrams, etc. +

+- The API documentation, rendered into HTML, can be viewed online: ++ The API documentation, rendered into HTML, can be viewed here: +

  • ++ for the 4.9.2 release, local ++ ++

  • + for the 3.4 release + +

  • diff --git a/gcc49-libtool-no-rpath.patch b/gcc49-libtool-no-rpath.patch new file mode 100644 index 0000000..466c661 --- /dev/null +++ b/gcc49-libtool-no-rpath.patch @@ -0,0 +1,27 @@ +libtool sucks. +--- ltmain.sh.jj 2007-12-07 14:53:21.000000000 +0100 ++++ ltmain.sh 2008-09-05 21:51:48.000000000 +0200 +@@ -5394,6 +5394,7 @@ EOF + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then +@@ -6071,6 +6072,7 @@ EOF + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then +@@ -6120,6 +6122,7 @@ EOF + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then diff --git a/gcc49-no-add-needed.patch b/gcc49-no-add-needed.patch new file mode 100644 index 0000000..b6ca777 --- /dev/null +++ b/gcc49-no-add-needed.patch @@ -0,0 +1,50 @@ +2010-02-08 Roland McGrath + + * config/rs6000/sysv4.h (LINK_EH_SPEC): Pass --no-add-needed to the + linker. + * config/gnu-user.h (LINK_EH_SPEC): Likewise. + * config/alpha/elf.h (LINK_EH_SPEC): Likewise. + * config/ia64/linux.h (LINK_EH_SPEC): Likewise. + +--- gcc/config/alpha/elf.h.jj 2011-01-03 12:52:31.118056764 +0100 ++++ gcc/config/alpha/elf.h 2011-01-04 18:14:10.931874160 +0100 +@@ -165,5 +165,5 @@ extern int alpha_this_gpdisp_sequence_nu + I imagine that other systems will catch up. In the meantime, it + doesn't harm to make sure that the data exists to be used later. */ + #if defined(HAVE_LD_EH_FRAME_HDR) +-#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++#define LINK_EH_SPEC "--no-add-needed %{!static:--eh-frame-hdr} " + #endif +--- gcc/config/ia64/linux.h.jj 2011-01-03 13:02:11.462994522 +0100 ++++ gcc/config/ia64/linux.h 2011-01-04 18:14:10.931874160 +0100 +@@ -77,7 +77,7 @@ do { \ + Signalize that because we have fde-glibc, we don't need all C shared libs + linked against -lgcc_s. */ + #undef LINK_EH_SPEC +-#define LINK_EH_SPEC "" ++#define LINK_EH_SPEC "--no-add-needed " + + /* Put all *tf routines in libgcc. */ + #undef LIBGCC2_HAS_TF_MODE +--- gcc/config/gnu-user.h.jj 2011-01-03 12:53:03.739057299 +0100 ++++ gcc/config/gnu-user.h 2011-01-04 18:14:10.932814884 +0100 +@@ -82,7 +82,7 @@ see the files COPYING3 and COPYING.RUNTI + #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC + + #if defined(HAVE_LD_EH_FRAME_HDR) +-#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++#define LINK_EH_SPEC "--no-add-needed %{!static:--eh-frame-hdr} " + #endif + + #undef LINK_GCC_C_SEQUENCE_SPEC +--- gcc/config/rs6000/sysv4.h.jj 2011-01-03 13:02:18.255994215 +0100 ++++ gcc/config/rs6000/sysv4.h 2011-01-04 18:14:10.933888871 +0100 +@@ -820,7 +820,7 @@ extern int fixuplabelno; + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" + + #if defined(HAVE_LD_EH_FRAME_HDR) +-# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++# define LINK_EH_SPEC "--no-add-needed %{!static:--eh-frame-hdr} " + #endif + + #define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \ diff --git a/gcc49-ppc32-retaddr.patch b/gcc49-ppc32-retaddr.patch new file mode 100644 index 0000000..7e8eeb5 --- /dev/null +++ b/gcc49-ppc32-retaddr.patch @@ -0,0 +1,87 @@ +2005-11-28 Jakub Jelinek + + * config/rs6000/rs6000.c (rs6000_return_addr): If COUNT == 0, + read word RETURN_ADDRESS_OFFSET bytes above arg_pointer_rtx + instead of doing an extran indirection from frame_pointer_rtx. + + * gcc.dg/20051128-1.c: New test. + +--- 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 +@@ -20970,18 +20970,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; + +- return +- gen_rtx_MEM +- (Pmode, +- memory_address +- (Pmode, +- plus_constant (Pmode, +- copy_to_reg +- (gen_rtx_MEM (Pmode, +- memory_address (Pmode, frame))), +- RETURN_ADDRESS_OFFSET))); ++ if (count == 0) ++ { ++ gcc_assert (frame == frame_pointer_rtx); ++ x = arg_pointer_rtx; ++ } ++ else ++ { ++ x = memory_address (Pmode, frame); ++ x = copy_to_reg (gen_rtx_MEM (Pmode, x)); ++ } ++ ++ x = plus_constant (Pmode, x, RETURN_ADDRESS_OFFSET); ++ return gen_rtx_MEM (Pmode, memory_address (Pmode, x)); + } + + cfun->machine->ra_need_lr = 1; +--- gcc/testsuite/gcc.dg/20051128-1.c.jj 2005-10-10 11:21:41.096999000 +0200 ++++ gcc/testsuite/gcc.dg/20051128-1.c 2005-11-28 12:30:57.000000000 +0100 +@@ -0,0 +1,41 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -fpic" } */ ++ ++extern void exit (int); ++extern void abort (void); ++ ++int b; ++ ++struct A ++{ ++ void *pad[147]; ++ void *ra, *h; ++ long o; ++}; ++ ++void ++__attribute__((noinline)) ++foo (struct A *a, void *x) ++{ ++ __builtin_memset (a, 0, sizeof (a)); ++ if (!b) ++ exit (0); ++} ++ ++void ++__attribute__((noinline)) ++bar (void) ++{ ++ struct A a; ++ ++ __builtin_unwind_init (); ++ foo (&a, __builtin_return_address (0)); ++} ++ ++int ++main (void) ++{ ++ bar (); ++ abort (); ++ return 0; ++} diff --git a/gcc49-pr38757.patch b/gcc49-pr38757.patch new file mode 100644 index 0000000..4206584 --- /dev/null +++ b/gcc49-pr38757.patch @@ -0,0 +1,106 @@ +2009-03-18 Jakub Jelinek + + PR debug/38757 + * langhooks.h (struct lang_hooks): Add source_language langhook. + * langhooks-def.h (LANG_HOOKS_SOURCE_LANGUAGE): Define to NULL. + (LANG_HOOKS_INITIALIZER): Add LANG_HOOKS_SOURCE_LANGUAGE. + * dwarf2out.c (add_prototyped_attribute): Add DW_AT_prototype + also for DW_LANG_{C,C99,ObjC}. + (gen_compile_unit_die): Use lang_hooks.source_language () to + determine if DW_LANG_C99 or DW_LANG_C89 should be returned. +c/ + * c-lang.c (c_source_language): New function. + (LANG_HOOKS_SOURCE_LANGUAGE): Define. + +--- gcc/langhooks.h.jj 2011-01-03 12:53:05.125745450 +0100 ++++ gcc/langhooks.h 2011-01-04 17:59:43.166744926 +0100 +@@ -467,6 +467,10 @@ struct lang_hooks + gimplification. */ + bool deep_unsharing; + ++ /* Return year of the source language standard version if the FE supports ++ multiple versions of the standard. */ ++ int (*source_language) (void); ++ + /* Whenever you add entries here, make sure you adjust langhooks-def.h + and langhooks.c accordingly. */ + }; +--- gcc/langhooks-def.h.jj 2011-01-03 12:53:05.000000000 +0100 ++++ gcc/langhooks-def.h 2011-01-04 18:00:44.858851030 +0100 +@@ -118,6 +118,7 @@ extern void lhd_omp_firstprivatize_type_ + #define LANG_HOOKS_BLOCK_MAY_FALLTHRU hook_bool_const_tree_true + #define LANG_HOOKS_EH_USE_CXA_END_CLEANUP false + #define LANG_HOOKS_DEEP_UNSHARING false ++#define LANG_HOOKS_SOURCE_LANGUAGE NULL + + /* Attribute hooks. */ + #define LANG_HOOKS_ATTRIBUTE_TABLE NULL +@@ -303,7 +304,8 @@ extern void lhd_end_section (void); + LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS, \ + LANG_HOOKS_BLOCK_MAY_FALLTHRU, \ + LANG_HOOKS_EH_USE_CXA_END_CLEANUP, \ +- LANG_HOOKS_DEEP_UNSHARING \ ++ LANG_HOOKS_DEEP_UNSHARING, \ ++ LANG_HOOKS_SOURCE_LANGUAGE \ + } + + #endif /* GCC_LANG_HOOKS_DEF_H */ +--- gcc/c/c-lang.c.jj 2011-01-03 12:53:05.376056936 +0100 ++++ gcc/c/c-lang.c 2011-01-04 17:59:43.167743798 +0100 +@@ -36,6 +36,12 @@ along with GCC; see the file COPYING3. + + enum c_language_kind c_language = clk_c; + ++static int ++c_source_language (void) ++{ ++ return flag_isoc99 ? 1999 : 1989; ++} ++ + /* Lang hooks common to C and ObjC are declared in c-objc-common.h; + consequently, there should be very few hooks below. */ + +@@ -45,6 +51,8 @@ enum c_language_kind c_language = clk_c; + #define LANG_HOOKS_INIT c_objc_common_init + #undef LANG_HOOKS_INIT_TS + #define LANG_HOOKS_INIT_TS c_common_init_ts ++#undef LANG_HOOKS_SOURCE_LANGUAGE ++#define LANG_HOOKS_SOURCE_LANGUAGE c_source_language + + /* Each front end provides its own lang hook initializer. */ + struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; +--- gcc/dwarf2out.c.jj 2011-01-03 12:53:05.102056475 +0100 ++++ gcc/dwarf2out.c 2011-01-04 18:03:14.534151763 +0100 +@@ -16109,9 +16109,18 @@ add_bit_size_attribute (dw_die_ref die, + static inline void + add_prototyped_attribute (dw_die_ref die, tree func_type) + { +- if (get_AT_unsigned (comp_unit_die (), DW_AT_language) == DW_LANG_C89 +- && prototype_p (func_type)) +- add_AT_flag (die, DW_AT_prototyped, 1); ++ switch (get_AT_unsigned (comp_unit_die (), DW_AT_language)) ++ { ++ case DW_LANG_C: ++ case DW_LANG_C89: ++ case DW_LANG_C99: ++ case DW_LANG_ObjC: ++ if (prototype_p (func_type)) ++ add_AT_flag (die, DW_AT_prototyped, 1); ++ break; ++ default: ++ break; ++ } + } + + /* Add an 'abstract_origin' attribute below a given DIE. The DIE is found +@@ -18915,6 +18924,10 @@ gen_compile_unit_die (const char *filena + if (strcmp (language_string, "GNU Go") == 0) + language = DW_LANG_Go; + } ++ else if (strcmp (language_string, "GNU C") == 0 ++ && lang_hooks.source_language ++ && lang_hooks.source_language () >= 1999) ++ language = DW_LANG_C99; + } + /* Use a degraded Fortran setting in strict DWARF2 so is_fortran works. */ + else if (strcmp (language_string, "GNU Fortran") == 0) diff --git a/gcc49-pr64269.patch b/gcc49-pr64269.patch new file mode 100644 index 0000000..baf7c59 --- /dev/null +++ b/gcc49-pr64269.patch @@ -0,0 +1,42 @@ +2014-12-12 Jakub Jelinek + + PR tree-optimization/64269 + * tree-ssa-forwprop.c (simplify_builtin_call): Bail out if + len2 or diff are too large. + + * gcc.c-torture/compile/pr64269.c: New test. + +--- gcc/tree-ssa-forwprop.c.jj 2014-12-01 14:57:30.000000000 +0100 ++++ gcc/tree-ssa-forwprop.c 2014-12-12 09:46:05.790053928 +0100 +@@ -1288,7 +1288,8 @@ simplify_builtin_call (gimple_stmt_itera + use_operand_p use_p; + + if (!tree_fits_shwi_p (val2) +- || !tree_fits_uhwi_p (len2)) ++ || !tree_fits_uhwi_p (len2) ++ || compare_tree_int (len2, 1024) == 1) + break; + if (is_gimple_call (stmt1)) + { +@@ -1354,7 +1355,8 @@ simplify_builtin_call (gimple_stmt_itera + is not constant, or is bigger than memcpy length, bail out. */ + if (diff == NULL + || !tree_fits_uhwi_p (diff) +- || tree_int_cst_lt (len1, diff)) ++ || tree_int_cst_lt (len1, diff) ++ || compare_tree_int (diff, 1024) == 1) + break; + + /* Use maximum of difference plus memset length and memcpy length +--- gcc/testsuite/gcc.c-torture/compile/pr64269.c.jj 2014-12-12 09:47:04.795015479 +0100 ++++ gcc/testsuite/gcc.c-torture/compile/pr64269.c 2014-12-12 09:46:51.000000000 +0100 +@@ -0,0 +1,9 @@ ++/* PR tree-optimization/64269 */ ++ ++void ++foo (char *p) ++{ ++ __SIZE_TYPE__ s = ~(__SIZE_TYPE__)0; ++ *p = 0; ++ __builtin_memset (p + 1, 0, s); ++} diff --git a/gcc49-rh330771.patch b/gcc49-rh330771.patch new file mode 100644 index 0000000..102730f --- /dev/null +++ b/gcc49-rh330771.patch @@ -0,0 +1,27 @@ +2007-10-16 Jakub Jelinek + + * Makefile.am (libgcj_tools_la_LIBADD): Add. + * Makefile.in: Regenerated. + +--- libjava/Makefile.am.jj 2009-05-06 08:14:50.000000000 +0200 ++++ libjava/Makefile.am 2009-05-06 10:26:43.000000000 +0200 +@@ -550,7 +550,7 @@ libgcj_tools_la_LDFLAGS = -rpath $(toole + $(LIBGCJ_LD_SYMBOLIC_FUNCTIONS) $(LIBJAVA_LDFLAGS_NOUNDEF) \ + $(LIBJAVA_LDFLAGS_LIBMATH) + +-libgcj_tools_la_LIBADD = libgcj.la ++libgcj_tools_la_LIBADD = -L$(here)/.libs libgcj.la + libgcj_tools_la_DEPENDENCIES = libgcj.la libgcj.spec \ + $(libgcj_tools_la_version_dep) + if BUILD_SUBLIBS +--- libjava/Makefile.in.jj 2009-05-06 08:14:49.000000000 +0200 ++++ libjava/Makefile.in 2009-05-06 10:27:18.000000000 +0200 +@@ -1110,7 +1110,7 @@ libgcj_tools_la_LDFLAGS = -rpath $(toole + $(LIBGCJ_LD_SYMBOLIC_FUNCTIONS) $(LIBJAVA_LDFLAGS_NOUNDEF) \ + $(LIBJAVA_LDFLAGS_LIBMATH) + +-libgcj_tools_la_LIBADD = libgcj.la ++libgcj_tools_la_LIBADD = -L$(here)/.libs libgcj.la + libgcj_tools_la_DEPENDENCIES = libgcj.la libgcj.spec \ + $(libgcj_tools_la_version_dep) $(am__append_19) + libgcj_tools_la_LINK = $(LIBLINK) $(libgcj_tools_la_LDFLAGS) \ diff --git a/gcc49-sparc-config-detection.patch b/gcc49-sparc-config-detection.patch new file mode 100644 index 0000000..a37018e --- /dev/null +++ b/gcc49-sparc-config-detection.patch @@ -0,0 +1,40 @@ +--- gcc/config.gcc.jj 2008-04-24 15:42:46.000000000 -0500 ++++ gcc/config.gcc 2008-04-24 15:44:51.000000000 -0500 +@@ -2656,7 +2656,7 @@ sparc-*-rtems*) + tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h newlib-stdint.h" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems" + ;; +-sparc-*-linux*) ++sparc-*-linux* | sparcv9-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/tso.h" + extra_options="${extra_options} sparc/long-double-switch.opt" + case ${target} in +@@ -2710,7 +2710,7 @@ sparc64-*-rtems*) + extra_options="${extra_options}" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems-64" + ;; +-sparc64-*-linux*) ++sparc64*-*-linux*) + tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/default-64.h sparc/linux64.h sparc/tso.h" + extra_options="${extra_options} sparc/long-double-switch.opt" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-linux64" +--- libgcc/config.host.jj 2008-04-24 15:46:19.000000000 -0500 ++++ libgcc/config.host 2008-04-24 15:46:49.000000000 -0500 +@@ -1002,7 +1002,7 @@ sparc-*-elf*) + tmake_file="${tmake_file} t-fdpbit t-crtfm" + extra_parts="$extra_parts crti.o crtn.o crtfastmath.o" + ;; +-sparc-*-linux*) # SPARC's running GNU/Linux, libc6 ++sparc-*-linux* | sparcv9-*-linux*) # SPARC's running GNU/Linux, libc6 + tmake_file="${tmake_file} t-crtfm" + if test "${host_address}" = 64; then + tmake_file="$tmake_file sparc/t-linux64" +@@ -1050,7 +1050,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd* + tmake_file="$tmake_file t-crtfm" + extra_parts="$extra_parts crtfastmath.o" + ;; +-sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux ++sparc64*-*-linux*) # 64-bit SPARC's running GNU/Linux + extra_parts="$extra_parts crtfastmath.o" + tmake_file="${tmake_file} t-crtfm sparc/t-linux" + if test "${host_address}" = 64; then