diff -u gcc-4.6-4.6.2/debian/rules.parameters gcc-4.6-4.6.2/debian/rules.parameters --- gcc-4.6-4.6.2/debian/rules.parameters +++ gcc-4.6-4.6.2/debian/rules.parameters @@ -2,15 +2,15 @@ GCC_VERSION := 4.6.2 NEXT_GCC_VERSION := 4.6.3 BASE_VERSION := 4.6 -SOURCE_VERSION := 4.6.2-14ubuntu1 -DEB_VERSION := 4.6.2-14ubuntu1 -DEB_EVERSION := 1:4.6.2-14ubuntu1 +SOURCE_VERSION := 4.6.2-14ubuntu2 +DEB_VERSION := 4.6.2-14ubuntu2 +DEB_EVERSION := 1:4.6.2-14ubuntu2 GDC_BASE_VERSION := DEB_GDC_VERSION := DEB_SOVERSION := 4.6 DEB_SOEVERSION := 1:4.6 DEB_LIBGCC_SOVERSION := 1:4.6 -DEB_LIBGCC_VERSION := 1:4.6.2-14ubuntu1 +DEB_LIBGCC_VERSION := 1:4.6.2-14ubuntu2 DEB_STDCXX_SOVERSION := 4.6 DEB_GCJ_SOVERSION := 4.6 PKG_GCJ_EXT := 12 diff -u gcc-4.6-4.6.2/debian/control.m4 gcc-4.6-4.6.2/debian/control.m4 --- gcc-4.6-4.6.2/debian/control.m4 +++ gcc-4.6-4.6.2/debian/control.m4 @@ -374,7 +374,7 @@ Section: debug Priority: extra Depends: BASEDEP, libhfgcc1`'LS (= ${gcc:EpochVersion}), ${misc:Depends} -Conflicts: libgcc1-dbg-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgcc1-dbg-armhf [biarchhf_archs]') Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') Debug symbols for the GCC support library. ifdef(`TARGET', `dnl @@ -408,7 +408,7 @@ Section: debug Priority: extra Depends: BASEDEP, libsfgcc1`'LS (= ${gcc:EpochVersion}), ${misc:Depends} -Conflicts: libgcc1-dbg-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgcc1-dbg-armel [biarchsf_archs]') Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') Debug symbols for the GCC support library. ifdef(`TARGET', `dnl @@ -734,7 +734,7 @@ Architecture: ifdef(`TARGET',`all',`biarchhf_archs') Section: ifdef(`TARGET',`devel',`libs') Priority: ifdef(`TARGET',`extra',`PRI(optional)') -Conflicts: libmudflap`'MF_SO`'-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libmudflap`'MF_SO`'-armhf [biarchhf_archs]') Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} Description: GCC mudflap shared support libraries (hard float) The libmudflap libraries are used by GCC for instrumenting pointer and array @@ -745,7 +745,7 @@ Section: debug Priority: extra Depends: BASEDEP, libhfmudflap`'MF_SO`'LS (= ${gcc:Version}), ${misc:Depends} -Conflicts: libmudflap`'MF_SO`'-dbg-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libmudflap`'MF_SO`'-dbg-armhf [biarchhf_archs]') Description: GCC mudflap shared support libraries (hard float debug symbols) The libmudflap libraries are used by GCC for instrumenting pointer and array dereferencing operations. @@ -757,7 +757,7 @@ Section: ifdef(`TARGET',`devel',`libs') Priority: ifdef(`TARGET',`extra',`PRI(optional)') Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} -Conflicts: libmudflap`'MF_SO`'-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libmudflap`'MF_SO`'-armel [biarchsf_archs]') Description: GCC mudflap shared support libraries (soft float) The libmudflap libraries are used by GCC for instrumenting pointer and array dereferencing operations. @@ -767,7 +767,7 @@ Section: debug Priority: extra Depends: BASEDEP, libsfmudflap`'MF_SO`'LS (= ${gcc:Version}), ${misc:Depends} -Conflicts: libmudflap`'MF_SO`'-dbg-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libmudflap`'MF_SO`'-dbg-armel [biarchsf_archs]') Description: GCC mudflap shared support libraries (soft float debug symbols) The libmudflap libraries are used by GCC for instrumenting pointer and array dereferencing operations. @@ -943,7 +943,7 @@ Architecture: ifdef(`TARGET',`all',`biarchhf_archs') Priority: ifdef(`TARGET',`extra',`PRI(optional)') Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} -Conflicts: libgomp'GOMP_SO`-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-armhf [biarchhf_archs]') Description: GCC OpenMP (GOMP) support library (hard float ABI) GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers in the GNU Compiler Collection. @@ -953,7 +953,7 @@ Section: debug Priority: extra Depends: BASEDEP, libhfgomp`'GOMP_SO`'LS (= ${gcc:Version}), ${misc:Depends} -Conflicts: libgomp'GOMP_SO`-dbg-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-dbg-armhf [biarchhf_archs]') Description: GCC OpenMP (GOMP) support library (hard float ABI debug symbols) GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers ')`'dnl libhfgomp @@ -964,7 +964,7 @@ Architecture: ifdef(`TARGET',`all',`biarchsf_archs') Priority: ifdef(`TARGET',`extra',`PRI(optional)') Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} -Conflicts: libgomp'GOMP_SO`-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-armel [biarchsf_archs]') Description: GCC OpenMP (GOMP) support library (soft float ABI) GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers in the GNU Compiler Collection. @@ -974,7 +974,7 @@ Section: debug Priority: extra Depends: BASEDEP, libsfgomp`'GOMP_SO`'LS (= ${gcc:Version}), ${misc:Depends} -Conflicts: libgomp'GOMP_SO`-dbg-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-dbg-armel [biarchsf_archs]') Description: GCC OpenMP (GOMP) support library (soft float ABI debug symbols) GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers ')`'dnl libsfgomp @@ -1262,7 +1262,7 @@ Architecture: ifdef(`TARGET',`all',`biarchhf_archs') Priority: ifdef(`TARGET',`extra',`PRI(optional)') Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} -Conflicts: libobjc'OBJC_SO`-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-armhf [biarchhf_archs]') Description: Runtime library for GNU Objective-C applications (hard float ABI) Library needed for GNU ObjC applications linked against the shared library. @@ -1271,7 +1271,7 @@ Architecture: ifdef(`TARGET',`all',`biarchhf_archs') Priority: extra Depends: BASEDEP, libhfobjc`'OBJC_SO`'LS (= ${gcc:Version}), libhfgcc`'GCC_SO-dbg`'LS, ${misc:Depends} -Conflicts: libobjc'OBJC_SO`-dbg-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-dbg-armhf [biarchhf_archs]') Description: Runtime library for GNU Objective-C applications (hard float ABI debug symbols) Library needed for GNU ObjC applications linked against the shared library. ')`'dnl libhfobjc @@ -1282,7 +1282,7 @@ Architecture: ifdef(`TARGET',`all',`biarchsf_archs') Priority: ifdef(`TARGET',`extra',`PRI(optional)') Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} -Conflicts: libobjc'OBJC_SO`-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-armel [biarchsf_archs]') Description: Runtime library for GNU Objective-C applications (soft float ABI) Library needed for GNU ObjC applications linked against the shared library. @@ -1291,7 +1291,7 @@ Architecture: ifdef(`TARGET',`all',`biarchsf_archs') Priority: extra Depends: BASEDEP, libsfobjc`'OBJC_SO`'LS (= ${gcc:Version}), libsfgcc`'GCC_SO-dbg`'LS, ${misc:Depends} -Conflicts: libobjc'OBJC_SO`-dbg-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-dbg-armel [biarchsf_archs]') Description: Runtime library for GNU Objective-C applications (soft float ABI debug symbols) Library needed for GNU ObjC applications linked against the shared library. ')`'dnl libsfobjc @@ -1441,7 +1441,7 @@ Architecture: ifdef(`TARGET',`all',`biarchhf_archs') Priority: ifdef(`TARGET',`extra',PRI(optional)) Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} -Conflicts: libgfortran'FORTRAN_SO`-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-armhf [biarchhf_archs]') Description: Runtime library for GNU Fortran applications (hard float ABI) Library needed for GNU Fortran applications linked against the shared library. @@ -1451,7 +1451,7 @@ Architecture: ifdef(`TARGET',`all',`biarchhf_archs') Priority: extra Depends: BASEDEP, libhfgfortran`'FORTRAN_SO`'LS (= ${gcc:Version}), ${misc:Depends} -Conflicts: libgfortran'FORTRAN_SO`-dbg-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-dbg-armhf [biarchhf_archs]') Description: Runtime library for GNU Fortran applications (hard float ABI debug symbols) Library needed for GNU Fortran applications linked against the shared library. @@ -1463,7 +1463,7 @@ Architecture: ifdef(`TARGET',`all',`biarchsf_archs') Priority: ifdef(`TARGET',`extra',PRI(optional)) Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} -Conflicts: libgfortran'FORTRAN_SO`-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-armel [biarchsf_archs]') Description: Runtime library for GNU Fortran applications (soft float ABI) Library needed for GNU Fortran applications linked against the shared library. @@ -1473,7 +1473,7 @@ Architecture: ifdef(`TARGET',`all',`biarchsf_archs') Priority: extra Depends: BASEDEP, libsfgfortran`'FORTRAN_SO`'LS (= ${gcc:Version}), ${misc:Depends} -Conflicts: libgfortran'FORTRAN_SO`-dbg-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-dbg-armel [biarchsf_archs]') Description: Runtime library for GNU Fortran applications (hard float ABI debug symbols) Library needed for GNU Fortran applications linked against the shared library. @@ -1918,7 +1918,7 @@ Depends: BASEDEP, ${shlibs:Depends}, libhfgcc1`'LS, ${misc:Depends} ifdef(`TARGET',`Provides: libhfstdc++CXX_SO-TARGET-dcv1 ',`')`'dnl -Conflicts: libstdc++'CXX_SO`-armhf [biarchhf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libstdc++'CXX_SO`-armhf [biarchhf_archs]') Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (hard float ABI) This package contains an additional runtime library for C++ programs built with the GNU compiler. @@ -1941,7 +1941,7 @@ Depends: BASEDEP, ${shlibs:Depends}, libsfgcc1`'LS, ${misc:Depends} ifdef(`TARGET',`Provides: libsfstdc++CXX_SO-TARGET-dcv1 ',`')`'dnl -Conflicts: libstdc++'CXX_SO`-armel [biarchsf_archs] +ifdef(`TARGET',`dnl',`Conflicts: libstdc++'CXX_SO`-armel [biarchsf_archs]') Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (soft float ABI) This package contains an additional runtime library for C++ programs built with the GNU compiler. @@ -2091,7 +2091,7 @@ Depends: BASEDEP, libhfstdc++CXX_SO`'LS (>= ${gcc:Version}), libstdc++CXX_SO`'PV-dev`'LS (= ${gcc:Version}), libhfgcc`'GCC_SO-dbg`'LS, ${shlibs:Depends}, ${misc:Depends} ifdef(`TARGET',`Provides: libhfstdc++CXX_SO-dbg-TARGET-dcv1 ',`')`'dnl -Conflicts: libhfstdc++6-dbg`'LS, libhfstdc++6-4.3-dbg`'LS, libhfstdc++6-4.4-dbg`'LS, libhfstdc++6-4.5-dbg`'LS, libstdc++'CXX_SO`-armhf [biarchhf_archs] +Conflicts: libhfstdc++6-dbg`'LS, libhfstdc++6-4.3-dbg`'LS, libhfstdc++6-4.4-dbg`'LS, libhfstdc++6-4.5-dbg`'LS`'ifdef(`TARGET',`',`, libstdc++'CXX_SO`-armhf [biarchhf_archs]') Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') This package contains the shared library of libstdc++ compiled with debugging symbols. @@ -2110,7 +2110,7 @@ Depends: BASEDEP, libsfstdc++CXX_SO`'LS (>= ${gcc:Version}), libstdc++CXX_SO`'PV-dev`'LS (= ${gcc:Version}), libsfgcc`'GCC_SO-dbg`'LS, ${shlibs:Depends}, ${misc:Depends} ifdef(`TARGET',`Provides: libsfstdc++CXX_SO-dbg-TARGET-dcv1 ',`')`'dnl -Conflicts: libsfstdc++6-dbg`'LS, libsfstdc++6-4.3-dbg`'LS, libsfstdc++6-4.4-dbg`'LS, libsfstdc++6-4.5-dbg`'LS, libstdc++'CXX_SO`-armel [biarchsf_archs] +Conflicts: libsfstdc++6-dbg`'LS, libsfstdc++6-4.3-dbg`'LS, libsfstdc++6-4.4-dbg`'LS, libsfstdc++6-4.5-dbg`'LS`'ifdef(`TARGET',`',`, libstdc++'CXX_SO`-armel [biarchsf_archs]') Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') This package contains the shared library of libstdc++ compiled with debugging symbols. diff -u gcc-4.6-4.6.2/debian/control gcc-4.6-4.6.2/debian/control --- gcc-4.6-4.6.2/debian/control +++ gcc-4.6-4.6.2/debian/control @@ -1181,7 +1181,8 @@ Depends: gcc-4.6-base (= ${gcc:Version}), g++-4.6 (= ${gcc:Version}), libstdc++6 (>= ${gcc:Version}), ${dep:libcdev}, ${misc:Depends} Conflicts: libg++27-dev, libg++272-dev (<< 2.7.2.8-1), libstdc++2.8-dev, libg++2.8-dev, libstdc++2.9-dev, libstdc++2.9-glibc2.1-dev, libstdc++2.10-dev (<< 1:2.95.3-2), libstdc++3.0-dev Suggests: libstdc++6-4.6-doc -Provides: libstdc++-devDescription: GNU Standard C++ Library v3 (development files) +Provides: libstdc++-dev +Description: GNU Standard C++ Library v3 (development files) This package contains the headers and static library files necessary for building C++ programs which use libstdc++. . diff -u gcc-4.6-4.6.2/debian/changelog gcc-4.6-4.6.2/debian/changelog --- gcc-4.6-4.6.2/debian/changelog +++ gcc-4.6-4.6.2/debian/changelog @@ -1,3 +1,12 @@ +gcc-4.6 (4.6.2-14ubuntu2) precise; urgency=low + + * Update to SVN 20120215 (r184282) from the gcc-4_6-branch. + - Fix PR tree-optimization/46886, PR debug/51950, PR c/52181, + PR middle-end/52230, PR bootstrap/51969, PR c++/52247, PR c/5218. + * Don't add ARM sf/hf conflicts for cross package builds. LP: #913734. + + -- Matthias Klose Thu, 16 Feb 2012 00:28:55 +0100 + gcc-4.6 (4.6.2-14ubuntu1) precise; urgency=low * Merge with Debian. diff -u gcc-4.6-4.6.2/debian/patches/svn-updates-linaro.diff gcc-4.6-4.6.2/debian/patches/svn-updates-linaro.diff --- gcc-4.6-4.6.2/debian/patches/svn-updates-linaro.diff +++ gcc-4.6-4.6.2/debian/patches/svn-updates-linaro.diff @@ -1,10 +1,10 @@ -# DP: updates from the 4.6 branch upto 20120210 (r184105). +# DP: updates from the 4.6 branch upto 20120215 (r184282). last_updated() { cat > ${dir}LAST_UPDATED < ++ ++ Backport from mainline ++ 2012-02-08 Richard Guenther ++ ++ PR tree-optimization/46886 ++ * testsuite/libgomp.c/pr46886.c: New testcase. ++ + 2011-11-20 Andreas Tobler + + * configure: Regenerate. +Index: libgomp/testsuite/libgomp.c/pr46886.c +=================================================================== +--- a/src/libgomp/testsuite/libgomp.c/pr46886.c (revision ++++ b/src/libgomp/testsuite/libgomp.c/pr46886.c (revision +@@ -0,0 +1,28 @@ ++/* { dg-do run } */ ++/* { dg-options "-O -ftree-parallelize-loops=4 -fno-tree-ch -fno-tree-dominator-opts" } */ ++ ++void abort(void); ++ ++int d[1024], e[1024]; ++ ++int foo (void) ++{ ++ int s = 0; ++ int i; ++ for (i = 0; i < 1024; i++) ++ s += d[i] - e[i]; ++ return s; ++} ++ ++int main () ++{ ++ int i; ++ for (i = 0; i < 1024; i++) ++ { ++ d[i] = i * 2; ++ e[i] = i; ++ } ++ if (foo () != 1023 * 1024 / 2) ++ abort (); ++ return 0; ++} +Index: gcc/gengtype.c +=================================================================== +--- a/src/gcc/gengtype.c (revision ++++ b/src/gcc/gengtype.c (revision +@@ -3594,14 +3594,13 @@ + int has_length, struct fileloc *line, const char *if_marked, + bool emit_pch, type_p field_type, const char *field_name) + { ++ struct pair newv; + /* If the field reference is relative to V, rather than to some + subcomponent of V, we can mark any subarrays with a single stride. + We're effectively treating the field as a global variable in its + own right. */ + if (v && type == v->type) + { +- struct pair newv; +- + newv = *v; + newv.type = field_type; + newv.name = ACONCAT ((v->name, ".", field_name, NULL)); Index: gcc/DATESTAMP =================================================================== --- a/src/gcc/DATESTAMP (revision +++ b/src/gcc/DATESTAMP (revision @@ -1 +1 @@ -20120201 -+20120210 ++20120215 +Index: gcc/tree-ssa-loop-ch.c +=================================================================== +--- a/src/gcc/tree-ssa-loop-ch.c (revision ++++ b/src/gcc/tree-ssa-loop-ch.c (revision +@@ -104,7 +104,7 @@ + + /* Checks whether LOOP is a do-while style loop. */ + +-static bool ++bool + do_while_loop_p (struct loop *loop) + { + gimple stmt = last_stmt (loop->latch); Index: gcc/diagnostic.c =================================================================== --- a/src/gcc/diagnostic.c (revision @@ -52,11 +134,87 @@ if (TREE_CODE_CLASS (code) != tcc_type && TREE_CODE_CLASS (code) != tcc_declaration && code != TREE_LIST +Index: gcc/omp-low.c +=================================================================== +--- a/src/gcc/omp-low.c (revision ++++ b/src/gcc/omp-low.c (revision +@@ -4618,6 +4618,9 @@ + { + int fn_index, start_ix, next_ix; + ++ if (fd.chunk_size == NULL ++ && fd.sched_kind == OMP_CLAUSE_SCHEDULE_STATIC) ++ fd.chunk_size = integer_zero_node; + gcc_assert (fd.sched_kind != OMP_CLAUSE_SCHEDULE_AUTO); + fn_index = (fd.sched_kind == OMP_CLAUSE_SCHEDULE_RUNTIME) + ? 3 : fd.sched_kind; Index: gcc/ChangeLog =================================================================== --- a/src/gcc/ChangeLog (revision +++ b/src/gcc/ChangeLog (revision -@@ -1,3 +1,142 @@ +@@ -1,3 +1,204 @@ ++2012-02-15 Richard Guenther ++ ++ Backport from mainline ++ 2012-02-08 Richard Guenther ++ ++ PR tree-optimization/46886 ++ * tree-flow.h (do_while_loop_p): Declare. ++ * tree-ssa-loop-ch.c (do_while_loop_p): Export. ++ * tree-parloops.c (parallelize_loops): Only parallelize do-while ++ loops. ++ ++2012-02-15 Eric Botcazou ++ ++ PR target/51921 ++ PR target/52205 ++ * config/sparc/sol2-unwind.h (sparc64_is_sighandler): Add support for ++ Solaris 11 and slightly reformat. ++ (sparc_is_sighandler): Likewise. ++ ++2012-02-14 Jakub Jelinek ++ ++ Backported from mainline ++ 2012-02-14 Jakub Jelinek ++ ++ PR debug/51950 ++ * dwarf2out.c (clone_tree_hash): New function. ++ (copy_decls_walk): Use it instead of clone_tree. ++ ++ PR c/52181 ++ * c-decl.c (merge_decls): Copy DECL_USER_ALIGN bit from olddecl to ++ newdecl. ++ ++ 2012-02-13 Jakub Jelinek ++ ++ * cselib.c (dump_cselib_val): Don't assume l->setting_insn is ++ non-NULL. ++ ++ PR middle-end/52230 ++ * omp-low.c (expand_omp_for): If a static schedule without ++ chunk size has NULL region->cont, force fd.chunk_size to be ++ integer_zero_node. ++ ++ PR bootstrap/51969 ++ Backported from mainline ++ 2011-11-08 Michael Matz ++ ++ * gengtype.c (write_field_root): Avoid out-of-scope access of newv. ++ ++2012-02-14 Bin Cheng ++ ++ Backport from mainline. ++ 2011-06-08 Julian Brown ++ ++ * config/arm/arm.c (arm_libcall_uses_aapcs_base): Use correct ABI ++ for double-precision helper functions in hard-float mode if only ++ single-precision arithmetic is supported in hardware. ++ ++2012-02-11 Uros Bizjak ++ ++ * compare-elim.c (find_comparisons_in_bb): Eliminate only compares ++ having the same mode as previous compare. ++ +2012-02-09 Jack Howarth + + Backported from mainline @@ -146,7 +304,7 @@ + +2012-02-09 Peter Bergner + -+ Backport from mainline ++ Backport from mainline + 2012-02-09 Peter Bergner + + PR middle-end/52140 @@ -154,7 +312,7 @@ + +2012-02-09 Andrey Belevantsev + -+ Backport from mainline ++ Backport from mainline + 2012-01-20 Andrey Belevantsev + + PR target/51106 @@ -168,11 +326,11 @@ + bit position to it (if any). + +2012-02-07 Kai Tietz -+ Dave Korn ++ Dave Korn + -+ PR target/40068 -+ * config/i386/winnt-cxx.c (i386_pe_adjust_class_at_definition): -+ Take care that typinfo gets dllexport-attribute. ++ PR target/40068 ++ * config/i386/winnt-cxx.c (i386_pe_adjust_class_at_definition): ++ Take care that typinfo gets dllexport-attribute. + +2012-02-07 Alan Modra + @@ -199,7 +357,7 @@ 2012-01-31 Matthew Gretton-Dann Backport from mainline. -@@ -23,7 +162,7 @@ +@@ -23,7 +224,7 @@ 2012-01-30 Ramana Radhakrishnan Backport from mainline. @@ -866,7 +1024,18 @@ =================================================================== --- a/src/gcc/testsuite/ChangeLog (revision +++ b/src/gcc/testsuite/ChangeLog (revision -@@ -1,3 +1,100 @@ +@@ -1,3 +1,111 @@ ++2012-02-14 Jakub Jelinek ++ ++ Backported from mainline ++ 2012-02-14 Jakub Jelinek ++ ++ PR c++/52247 ++ * g++.dg/template/asmgoto1.C: New test. ++ ++ PR c/52181 ++ * c-c++-common/pr52181.c: New test. ++ +2012-02-09 Jakub Jelinek + + Backported from mainline @@ -1081,6 +1250,29 @@ +{ + foo (0, 0, 0); +} +Index: gcc/testsuite/g++.dg/template/asmgoto1.C +=================================================================== +--- a/src/gcc/testsuite/g++.dg/template/asmgoto1.C (revision ++++ b/src/gcc/testsuite/g++.dg/template/asmgoto1.C (revision +@@ -0,0 +1,18 @@ ++// PR c++/52247 ++// { dg-do compile } ++ ++template ++bool ++bar () ++{ ++ __asm goto ("" : : : : lab); ++ return true; ++lab: ++ return false; ++} ++ ++bool ++foo () ++{ ++ return bar<0> (); ++} Index: gcc/testsuite/c-c++-common/pr51768.c =================================================================== --- a/src/gcc/testsuite/c-c++-common/pr51768.c (revision @@ -1111,11 +1303,60 @@ + int x; + asm ("" : [lab] "=r" (x) : [lab] "r" (x)); /* { dg-error "duplicate asm operand name" } */ +} +Index: gcc/testsuite/c-c++-common/pr52181.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/pr52181.c (revision ++++ b/src/gcc/testsuite/c-c++-common/pr52181.c (revision +@@ -0,0 +1,13 @@ ++/* PR c/52181 */ ++/* { dg-do compile } */ ++ ++extern const int v1[]; ++const int __attribute__((aligned(16))) v1[] = { 1 }; ++extern const int __attribute__((aligned(16))) v2[]; ++const int v2[] = { 1 }; ++extern const int __attribute__((aligned(16))) v3[]; ++const int __attribute__((aligned(16))) v3[] = { 1 }; ++const int __attribute__((aligned(16))) v4[] = { 1 }; ++int test[(__alignof__ (v4) != __alignof__ (v1) /* { dg-bogus "is negative" } */ ++ || __alignof__ (v4) != __alignof__ (v2) ++ || __alignof__ (v4) != __alignof__ (v3)) ? -1 : 0]; +Index: gcc/cp/decl.c +=================================================================== +--- a/src/gcc/cp/decl.c (revision ++++ b/src/gcc/cp/decl.c (revision +@@ -2154,7 +2154,12 @@ + SET_DECL_INIT_PRIORITY (olddecl, DECL_INIT_PRIORITY (newdecl)); + DECL_HAS_INIT_PRIORITY_P (olddecl) = 1; + } +- /* Likewise for DECL_USER_ALIGN and DECL_PACKED. */ ++ /* Likewise for DECL_ALIGN, DECL_USER_ALIGN and DECL_PACKED. */ ++ if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) ++ { ++ DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); ++ DECL_USER_ALIGN (newdecl) |= DECL_USER_ALIGN (olddecl); ++ } + DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl); + if (TREE_CODE (newdecl) == FIELD_DECL) + DECL_PACKED (olddecl) = DECL_PACKED (newdecl); Index: gcc/cp/ChangeLog =================================================================== --- a/src/gcc/cp/ChangeLog (revision +++ b/src/gcc/cp/ChangeLog (revision -@@ -1,3 +1,18 @@ +@@ -1,3 +1,31 @@ ++2012-02-14 Jakub Jelinek ++ ++ Backported from mainline ++ 2012-02-14 Jakub Jelinek ++ ++ PR c++/52247 ++ * pt.c (tsubst_copy_asm_operands): For LABEL_DECL values call ++ lookup_label on label's name and set TREE_USED. ++ ++ PR c/52181 ++ * decl.c (duplicate_decls): If olddecl has bigger DECL_ALIGN than ++ newdecl, copy DECL_ALIGN to newdecl and or DECL_USER_ALIGN bits. ++ +2012-02-09 Jakub Jelinek + + Backported from mainline @@ -1134,6 +1375,30 @@ 2012-01-19 Kai Tietz PR c++/51344 +Index: gcc/cp/pt.c +=================================================================== +--- a/src/gcc/cp/pt.c (revision ++++ b/src/gcc/cp/pt.c (revision +@@ -11886,8 +11886,17 @@ + if (purpose) + purpose = RECUR (purpose); + value = TREE_VALUE (t); +- if (value && TREE_CODE (value) != LABEL_DECL) +- value = RECUR (value); ++ if (value) ++ { ++ if (TREE_CODE (value) != LABEL_DECL) ++ value = RECUR (value); ++ else ++ { ++ value = lookup_label (DECL_NAME (value)); ++ gcc_assert (TREE_CODE (value) == LABEL_DECL); ++ TREE_USED (value) = 1; ++ } ++ } + chain = TREE_CHAIN (t); + if (chain && chain != void_type_node) + chain = RECUR (chain); Index: gcc/cp/semantics.c =================================================================== --- a/src/gcc/cp/semantics.c (revision @@ -1197,11 +1462,83 @@ && ! can_compare_p (code, mode, ccp_jump) /* Never split ORDERED and UNORDERED. These must be implemented. */ +Index: gcc/compare-elim.c +=================================================================== +--- a/src/gcc/compare-elim.c (revision ++++ b/src/gcc/compare-elim.c (revision +@@ -297,8 +297,11 @@ + src = conforming_compare (insn); + if (src) + { ++ enum machine_mode src_mode = GET_MODE (src); ++ + /* Eliminate a compare that's redundant with the previous. */ + if (last_cmp_valid ++ && src_mode == last_cmp->orig_mode + && rtx_equal_p (last_cmp->in_a, XEXP (src, 0)) + && rtx_equal_p (last_cmp->in_b, XEXP (src, 1))) + { +@@ -311,7 +314,7 @@ + last_cmp->prev_clobber = last_clobber; + last_cmp->in_a = XEXP (src, 0); + last_cmp->in_b = XEXP (src, 1); +- last_cmp->orig_mode = GET_MODE (SET_DEST (single_set (insn))); ++ last_cmp->orig_mode = src_mode; + VEC_safe_push (comparison_struct_p, heap, all_compares, last_cmp); + + /* It's unusual, but be prepared for comparison patterns that Index: gcc/dwarf2out.c =================================================================== --- a/src/gcc/dwarf2out.c (revision +++ b/src/gcc/dwarf2out.c (revision -@@ -11164,6 +11164,13 @@ +@@ -10410,6 +10410,32 @@ + return copy; + } + ++/* Like clone_tree, but additionally enter all the children into ++ the hash table decl_table. */ ++ ++static dw_die_ref ++clone_tree_hash (dw_die_ref die, htab_t decl_table) ++{ ++ dw_die_ref c; ++ dw_die_ref clone = clone_die (die); ++ struct decl_table_entry *entry; ++ void **slot = htab_find_slot_with_hash (decl_table, die, ++ htab_hash_pointer (die), INSERT); ++ /* Assert that DIE isn't in the hash table yet. If it would be there ++ before, the ancestors would be necessarily there as well, therefore ++ clone_tree_hash wouldn't be called. */ ++ gcc_assert (*slot == HTAB_EMPTY_ENTRY); ++ entry = XCNEW (struct decl_table_entry); ++ entry->orig = die; ++ entry->copy = clone; ++ *slot = entry; ++ ++ FOR_EACH_CHILD (die, c, ++ add_child_die (clone, clone_tree_hash (c, decl_table))); ++ ++ return clone; ++} ++ + /* Walk the DIE and its children, looking for references to incomplete + or trivial types that are unmarked (i.e., that are not in the current + type_unit). */ +@@ -10446,8 +10472,12 @@ + else + { + dw_die_ref parent = unit; +- dw_die_ref copy = clone_tree (targ); ++ dw_die_ref copy = clone_die (targ); + ++ FOR_EACH_CHILD (targ, c, ++ add_child_die (copy, ++ clone_tree_hash (c, decl_table))); ++ + /* Make sure the cloned tree is marked as part of the + type unit. */ + mark_dies (copy); +@@ -11164,6 +11194,13 @@ /* Don't output an entry that starts and ends at the same address. */ if (strcmp (curr->begin, curr->end) == 0) continue; @@ -1215,7 +1552,7 @@ if (!have_multiple_function_sections) { dw2_asm_output_delta (DWARF2_ADDR_SIZE, curr->begin, curr->section, -@@ -11182,7 +11189,6 @@ +@@ -11182,7 +11219,6 @@ "Location list end address (%s)", list_head->ll_symbol); } @@ -1279,6 +1616,34 @@ case REALPART_EXPR: /* The real part of the complex number is always first, therefore +Index: gcc/tree-parloops.c +=================================================================== +--- a/src/gcc/tree-parloops.c (revision ++++ b/src/gcc/tree-parloops.c (revision +@@ -2132,7 +2132,10 @@ + || loop_has_blocks_with_irreducible_flag (loop) + || (loop_preheader_edge (loop)->src->flags & BB_IRREDUCIBLE_LOOP) + /* FIXME: the check for vector phi nodes could be removed. */ +- || loop_has_vector_phi_nodes (loop)) ++ || loop_has_vector_phi_nodes (loop) ++ /* FIXME: transform_to_exit_first_loop does not handle not ++ header-copied loops correctly - see PR46886. */ ++ || !do_while_loop_p (loop)) + continue; + estimated = estimated_loop_iterations_int (loop, false); + /* FIXME: Bypass this check as graphite doesn't update the +Index: gcc/c-decl.c +=================================================================== +--- a/src/gcc/c-decl.c (revision ++++ b/src/gcc/c-decl.c (revision +@@ -2436,6 +2436,7 @@ + memcpy ((char *) olddecl + sizeof (struct tree_common), + (char *) newdecl + sizeof (struct tree_common), + sizeof (struct tree_decl_common) - sizeof (struct tree_common)); ++ DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl); + switch (TREE_CODE (olddecl)) + { + case FUNCTION_DECL: Index: gcc/fortran/trans-expr.c =================================================================== --- a/src/gcc/fortran/trans-expr.c (revision @@ -1592,6 +1957,24 @@ && (!has_zero_uses (a) || !SSA_NAME_IS_DEFAULT_DEF (a))) { tree *slot = (tree *) htab_find_slot (ssa_name_hash, a, INSERT); +Index: gcc/cselib.c +=================================================================== +--- a/src/gcc/cselib.c (revision ++++ b/src/gcc/cselib.c (revision +@@ -2489,8 +2489,11 @@ + fputs (" locs:", out); + do + { +- fprintf (out, "\n from insn %i ", +- INSN_UID (l->setting_insn)); ++ if (l->setting_insn) ++ fprintf (out, "\n from insn %i ", ++ INSN_UID (l->setting_insn)); ++ else ++ fprintf (out, "\n "); + print_inline_rtx (out, l->loc, 4); + } + while ((l = l->next)); Index: gcc/tree-mudflap.c =================================================================== --- a/src/gcc/tree-mudflap.c (revision @@ -1763,6 +2146,20 @@ XVECEXP (newpat, 0, --total_sets) = t; } +Index: gcc/tree-flow.h +=================================================================== +--- a/src/gcc/tree-flow.h (revision ++++ b/src/gcc/tree-flow.h (revision +@@ -611,6 +611,9 @@ + extern bool may_propagate_copy_into_stmt (gimple, tree); + extern bool may_propagate_copy_into_asm (tree); + ++/* In tree-ssa-loop-ch.c */ ++bool do_while_loop_p (struct loop *); ++ + /* Affine iv. */ + + typedef struct Index: gcc/c-parser.c =================================================================== --- a/src/gcc/c-parser.c (revision @@ -1783,6 +2180,90 @@ t = c_fully_fold (t, false, NULL); if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME) +Index: gcc/config/sparc/sol2-unwind.h +=================================================================== +--- a/src/gcc/config/sparc/sol2-unwind.h (revision ++++ b/src/gcc/config/sparc/sol2-unwind.h (revision +@@ -119,7 +119,12 @@ + unsigned int cuh_pattern + = *(unsigned int *)(*(unsigned long *)(cfa + 15*8) - 4); + +- if (cuh_pattern == 0xd25fa7ef) ++ if (cuh_pattern == 0x92100019) ++ /* This matches the call_user_handler pattern for Solaris 11. ++ This is the same setup as for Solaris 9, see below. */ ++ *nframes = 3; ++ ++ else if (cuh_pattern == 0xd25fa7ef) + { + /* This matches the call_user_handler pattern for Solaris 10. + There are 2 cases so we look for the return address of the +@@ -140,6 +145,7 @@ + */ + *nframes = 2; + } ++ + else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x94100013) + /* This matches the call_user_handler pattern for Solaris 9 and + for Solaris 8 running inside Solaris Containers respectively +@@ -152,7 +158,8 @@ + + */ + *nframes = 3; +- else ++ ++ else /* cuh_pattern == 0xe0272010 */ + /* This is the default Solaris 8 case. + We need to move up two frames: + +@@ -162,6 +169,7 @@ + + */ + *nframes = 2; ++ + return 1; + } + +@@ -287,7 +295,12 @@ + unsigned int cuh_pattern + = *(unsigned int *)(*(unsigned int *)(cfa + 15*4) - 4); + +- if (cuh_pattern == 0xd407a04c) ++ if (cuh_pattern == 0x92100019) ++ /* This matches the call_user_handler pattern for Solaris 11. ++ This is the same setup as for Solaris 9, see below. */ ++ *nframes = 3; ++ ++ else if (cuh_pattern == 0xd407a04c) + { + /* This matches the call_user_handler pattern for Solaris 10. + There are 2 cases so we look for the return address of the +@@ -308,6 +321,7 @@ + */ + *nframes = 2; + } ++ + else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x9410001b) + /* This matches the call_user_handler pattern for Solaris 9 and + for Solaris 8 running inside Solaris Containers respectively. +@@ -320,7 +334,8 @@ + + */ + *nframes = 3; +- else ++ ++ else /* cuh_pattern == 0x90100018 */ + /* This is the default Solaris 8 case. + We need to move up two frames: + +@@ -330,6 +345,7 @@ + + */ + *nframes = 2; ++ + return 1; + } + Index: gcc/config/i386/winnt-cxx.c =================================================================== --- a/src/gcc/config/i386/winnt-cxx.c (revision @@ -1838,6 +2319,39 @@ return; } +Index: gcc/config/arm/arm.c +=================================================================== +--- a/src/gcc/config/arm/arm.c (revision ++++ b/src/gcc/config/arm/arm.c (revision +@@ -3581,6 +3581,28 @@ + convert_optab_libfunc (sfix_optab, DImode, SFmode)); + add_libcall (libcall_htab, + convert_optab_libfunc (ufix_optab, DImode, SFmode)); ++ ++ /* Values from double-precision helper functions are returned in core ++ registers if the selected core only supports single-precision ++ arithmetic, even if we are using the hard-float ABI. The same is ++ true for single-precision helpers, but we will never be using the ++ hard-float ABI on a CPU which doesn't support single-precision ++ operations in hardware. */ ++ add_libcall (libcall_htab, optab_libfunc (add_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (sdiv_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (smul_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (neg_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (sub_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (eq_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (lt_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (le_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (ge_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (gt_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (unord_optab, DFmode)); ++ add_libcall (libcall_htab, convert_optab_libfunc (sext_optab, DFmode, ++ SFmode)); ++ add_libcall (libcall_htab, convert_optab_libfunc (trunc_optab, SFmode, ++ DFmode)); + } + + return libcall && htab_find (libcall_htab, libcall) != NULL; Index: gcc/config/arm/arm.md =================================================================== --- a/src/gcc/config/arm/arm.md (revision diff -u gcc-4.6-4.6.2/debian/patches/svn-updates.diff gcc-4.6-4.6.2/debian/patches/svn-updates.diff --- gcc-4.6-4.6.2/debian/patches/svn-updates.diff +++ gcc-4.6-4.6.2/debian/patches/svn-updates.diff @@ -1,10 +1,10 @@ -# DP: updates from the 4.6 branch upto 20120210 (r184105). +# DP: updates from the 4.6 branch upto 20120215 (r184282). last_updated() { cat > ${dir}LAST_UPDATED < ++ ++ Backport from mainline ++ 2012-02-08 Richard Guenther ++ ++ PR tree-optimization/46886 ++ * testsuite/libgomp.c/pr46886.c: New testcase. ++ +2011-11-20 Andreas Tobler + + * configure: Regenerate. @@ -214,6 +222,39 @@ 2011-10-26 Release Manager * GCC 4.6.2 released. +Index: libgomp/testsuite/libgomp.c/pr46886.c +=================================================================== +--- a/src/libgomp/testsuite/libgomp.c/pr46886.c (.../tags/gcc_4_6_2_release) ++++ b/src/libgomp/testsuite/libgomp.c/pr46886.c (.../branches/gcc-4_6-branch) +@@ -0,0 +1,28 @@ ++/* { dg-do run } */ ++/* { dg-options "-O -ftree-parallelize-loops=4 -fno-tree-ch -fno-tree-dominator-opts" } */ ++ ++void abort(void); ++ ++int d[1024], e[1024]; ++ ++int foo (void) ++{ ++ int s = 0; ++ int i; ++ for (i = 0; i < 1024; i++) ++ s += d[i] - e[i]; ++ return s; ++} ++ ++int main () ++{ ++ int i; ++ for (i = 0; i < 1024; i++) ++ { ++ d[i] = i * 2; ++ e[i] = i; ++ } ++ if (foo () != 1023 * 1024 / 2) ++ abort (); ++ return 0; ++} Index: libquadmath/configure =================================================================== --- a/src/libquadmath/configure (.../tags/gcc_4_6_2_release) @@ -415,6 +456,26 @@ /* Places where an lvalue, or modifiable lvalue, may be required. Used to select diagnostic messages in lvalue_error and +Index: gcc/gengtype.c +=================================================================== +--- a/src/gcc/gengtype.c (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/gengtype.c (.../branches/gcc-4_6-branch) +@@ -3594,14 +3594,13 @@ + int has_length, struct fileloc *line, const char *if_marked, + bool emit_pch, type_p field_type, const char *field_name) + { ++ struct pair newv; + /* If the field reference is relative to V, rather than to some + subcomponent of V, we can mark any subarrays with a single stride. + We're effectively treating the field as a global variable in its + own right. */ + if (v && type == v->type) + { +- struct pair newv; +- + newv = *v; + newv.type = field_type; + newv.name = ACONCAT ((v->name, ".", field_name, NULL)); Index: gcc/tree-loop-distribution.c =================================================================== --- a/src/gcc/tree-loop-distribution.c (.../tags/gcc_4_6_2_release) @@ -582,7 +643,20 @@ +++ b/src/gcc/DATESTAMP (.../branches/gcc-4_6-branch) @@ -1 +1 @@ -20111026 -+20120210 ++20120215 +Index: gcc/tree-ssa-loop-ch.c +=================================================================== +--- a/src/gcc/tree-ssa-loop-ch.c (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/tree-ssa-loop-ch.c (.../branches/gcc-4_6-branch) +@@ -104,7 +104,7 @@ + + /* Checks whether LOOP is a do-while style loop. */ + +-static bool ++bool + do_while_loop_p (struct loop *loop) + { + gimple stmt = last_stmt (loop->latch); Index: gcc/configure =================================================================== --- a/src/gcc/configure (.../tags/gcc_4_6_2_release) @@ -711,6 +785,20 @@ if (TREE_CODE_CLASS (code) != tcc_type && TREE_CODE_CLASS (code) != tcc_declaration && code != TREE_LIST +Index: gcc/omp-low.c +=================================================================== +--- a/src/gcc/omp-low.c (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/omp-low.c (.../branches/gcc-4_6-branch) +@@ -4618,6 +4618,9 @@ + { + int fn_index, start_ix, next_ix; + ++ if (fd.chunk_size == NULL ++ && fd.sched_kind == OMP_CLAUSE_SCHEDULE_STATIC) ++ fd.chunk_size = integer_zero_node; + gcc_assert (fd.sched_kind != OMP_CLAUSE_SCHEDULE_AUTO); + fn_index = (fd.sched_kind == OMP_CLAUSE_SCHEDULE_RUNTIME) + ? 3 : fd.sched_kind; Index: gcc/objc/objc-next-runtime-abi-01.c =================================================================== --- a/src/gcc/objc/objc-next-runtime-abi-01.c (.../tags/gcc_4_6_2_release) @@ -815,7 +903,69 @@ =================================================================== --- a/src/gcc/ChangeLog (.../tags/gcc_4_6_2_release) +++ b/src/gcc/ChangeLog (.../branches/gcc-4_6-branch) -@@ -1,3 +1,787 @@ +@@ -1,3 +1,849 @@ ++2012-02-15 Richard Guenther ++ ++ Backport from mainline ++ 2012-02-08 Richard Guenther ++ ++ PR tree-optimization/46886 ++ * tree-flow.h (do_while_loop_p): Declare. ++ * tree-ssa-loop-ch.c (do_while_loop_p): Export. ++ * tree-parloops.c (parallelize_loops): Only parallelize do-while ++ loops. ++ ++2012-02-15 Eric Botcazou ++ ++ PR target/51921 ++ PR target/52205 ++ * config/sparc/sol2-unwind.h (sparc64_is_sighandler): Add support for ++ Solaris 11 and slightly reformat. ++ (sparc_is_sighandler): Likewise. ++ ++2012-02-14 Jakub Jelinek ++ ++ Backported from mainline ++ 2012-02-14 Jakub Jelinek ++ ++ PR debug/51950 ++ * dwarf2out.c (clone_tree_hash): New function. ++ (copy_decls_walk): Use it instead of clone_tree. ++ ++ PR c/52181 ++ * c-decl.c (merge_decls): Copy DECL_USER_ALIGN bit from olddecl to ++ newdecl. ++ ++ 2012-02-13 Jakub Jelinek ++ ++ * cselib.c (dump_cselib_val): Don't assume l->setting_insn is ++ non-NULL. ++ ++ PR middle-end/52230 ++ * omp-low.c (expand_omp_for): If a static schedule without ++ chunk size has NULL region->cont, force fd.chunk_size to be ++ integer_zero_node. ++ ++ PR bootstrap/51969 ++ Backported from mainline ++ 2011-11-08 Michael Matz ++ ++ * gengtype.c (write_field_root): Avoid out-of-scope access of newv. ++ ++2012-02-14 Bin Cheng ++ ++ Backport from mainline. ++ 2011-06-08 Julian Brown ++ ++ * config/arm/arm.c (arm_libcall_uses_aapcs_base): Use correct ABI ++ for double-precision helper functions in hard-float mode if only ++ single-precision arithmetic is supported in hardware. ++ ++2012-02-11 Uros Bizjak ++ ++ * compare-elim.c (find_comparisons_in_bb): Eliminate only compares ++ having the same mode as previous compare. ++ +2012-02-09 Jack Howarth + + Backported from mainline @@ -905,7 +1055,7 @@ + +2012-02-09 Peter Bergner + -+ Backport from mainline ++ Backport from mainline + 2012-02-09 Peter Bergner + + PR middle-end/52140 @@ -913,7 +1063,7 @@ + +2012-02-09 Andrey Belevantsev + -+ Backport from mainline ++ Backport from mainline + 2012-01-20 Andrey Belevantsev + + PR target/51106 @@ -927,11 +1077,11 @@ + bit position to it (if any). + +2012-02-07 Kai Tietz -+ Dave Korn ++ Dave Korn + -+ PR target/40068 -+ * config/i386/winnt-cxx.c (i386_pe_adjust_class_at_definition): -+ Take care that typinfo gets dllexport-attribute. ++ PR target/40068 ++ * config/i386/winnt-cxx.c (i386_pe_adjust_class_at_definition): ++ Take care that typinfo gets dllexport-attribute. + +2012-02-07 Alan Modra + @@ -1603,7 +1753,7 @@ 2011-10-26 Release Manager * GCC 4.6.2 released. -@@ -144,8 +933,8 @@ +@@ -144,8 +995,8 @@ 2011-10-07 Bernd Schmidt @@ -1614,7 +1764,7 @@ 2011-10-06 Jakub Jelinek -@@ -252,7 +1041,7 @@ +@@ -252,7 +1103,7 @@ * config/rs6000/rs6000.md (probe_stack): Use explicit operand. * config/rs6000/rs6000.c (output_probe_stack_range): Likewise. @@ -4315,7 +4465,18 @@ =================================================================== --- a/src/gcc/testsuite/ChangeLog (.../tags/gcc_4_6_2_release) +++ b/src/gcc/testsuite/ChangeLog (.../branches/gcc-4_6-branch) -@@ -1,3 +1,508 @@ +@@ -1,3 +1,519 @@ ++2012-02-14 Jakub Jelinek ++ ++ Backported from mainline ++ 2012-02-14 Jakub Jelinek ++ ++ PR c++/52247 ++ * g++.dg/template/asmgoto1.C: New test. ++ ++ PR c/52181 ++ * c-c++-common/pr52181.c: New test. ++ +2012-02-09 Jakub Jelinek + + Backported from mainline @@ -4824,7 +4985,7 @@ 2011-10-26 Release Manager * GCC 4.6.2 released. -@@ -9,9 +514,9 @@ +@@ -9,9 +525,9 @@ 2011-10-20 Uros Bizjak @@ -5370,6 +5531,29 @@ + abort (); +} + +Index: gcc/testsuite/g++.dg/template/asmgoto1.C +=================================================================== +--- a/src/gcc/testsuite/g++.dg/template/asmgoto1.C (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/testsuite/g++.dg/template/asmgoto1.C (.../branches/gcc-4_6-branch) +@@ -0,0 +1,18 @@ ++// PR c++/52247 ++// { dg-do compile } ++ ++template ++bool ++bar () ++{ ++ __asm goto ("" : : : : lab); ++ return true; ++lab: ++ return false; ++} ++ ++bool ++foo () ++{ ++ return bar<0> (); ++} Index: gcc/testsuite/c-c++-common/pr51768.c =================================================================== --- a/src/gcc/testsuite/c-c++-common/pr51768.c (.../tags/gcc_4_6_2_release) @@ -5400,6 +5584,24 @@ + int x; + asm ("" : [lab] "=r" (x) : [lab] "r" (x)); /* { dg-error "duplicate asm operand name" } */ +} +Index: gcc/testsuite/c-c++-common/pr52181.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/pr52181.c (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/testsuite/c-c++-common/pr52181.c (.../branches/gcc-4_6-branch) +@@ -0,0 +1,13 @@ ++/* PR c/52181 */ ++/* { dg-do compile } */ ++ ++extern const int v1[]; ++const int __attribute__((aligned(16))) v1[] = { 1 }; ++extern const int __attribute__((aligned(16))) v2[]; ++const int v2[] = { 1 }; ++extern const int __attribute__((aligned(16))) v3[]; ++const int __attribute__((aligned(16))) v3[] = { 1 }; ++const int __attribute__((aligned(16))) v4[] = { 1 }; ++int test[(__alignof__ (v4) != __alignof__ (v1) /* { dg-bogus "is negative" } */ ++ || __alignof__ (v4) != __alignof__ (v2) ++ || __alignof__ (v4) != __alignof__ (v3)) ? -1 : 0]; Index: gcc/cp/typeck.c =================================================================== --- a/src/gcc/cp/typeck.c (.../tags/gcc_4_6_2_release) @@ -5525,7 +5727,21 @@ =================================================================== --- a/src/gcc/cp/decl.c (.../tags/gcc_4_6_2_release) +++ b/src/gcc/cp/decl.c (.../branches/gcc-4_6-branch) -@@ -11540,15 +11540,19 @@ +@@ -2154,7 +2154,12 @@ + SET_DECL_INIT_PRIORITY (olddecl, DECL_INIT_PRIORITY (newdecl)); + DECL_HAS_INIT_PRIORITY_P (olddecl) = 1; + } +- /* Likewise for DECL_USER_ALIGN and DECL_PACKED. */ ++ /* Likewise for DECL_ALIGN, DECL_USER_ALIGN and DECL_PACKED. */ ++ if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) ++ { ++ DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); ++ DECL_USER_ALIGN (newdecl) |= DECL_USER_ALIGN (olddecl); ++ } + DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl); + if (TREE_CODE (newdecl) == FIELD_DECL) + DECL_PACKED (olddecl) = DECL_PACKED (newdecl); +@@ -11540,15 +11545,19 @@ static void copy_type_enum (tree dst, tree src) { @@ -5554,7 +5770,7 @@ } /* Begin compiling the definition of an enumeration type. -@@ -11903,9 +11907,12 @@ +@@ -11903,9 +11912,12 @@ return; } @@ -5569,7 +5785,7 @@ } /* Build and install a CONST_DECL for an enumeration constant of the -@@ -13356,8 +13363,17 @@ +@@ -13356,8 +13368,17 @@ cleanup = call; } @@ -5591,7 +5807,20 @@ =================================================================== --- a/src/gcc/cp/ChangeLog (.../tags/gcc_4_6_2_release) +++ b/src/gcc/cp/ChangeLog (.../branches/gcc-4_6-branch) -@@ -1,3 +1,94 @@ +@@ -1,3 +1,107 @@ ++2012-02-14 Jakub Jelinek ++ ++ Backported from mainline ++ 2012-02-14 Jakub Jelinek ++ ++ PR c++/52247 ++ * pt.c (tsubst_copy_asm_operands): For LABEL_DECL values call ++ lookup_label on label's name and set TREE_USED. ++ ++ PR c/52181 ++ * decl.c (duplicate_decls): If olddecl has bigger DECL_ALIGN than ++ newdecl, copy DECL_ALIGN to newdecl and or DECL_USER_ALIGN bits. ++ +2012-02-09 Jakub Jelinek + + Backported from mainline @@ -5700,7 +5929,27 @@ case OVERLOAD: /* An OVERLOAD will always be a non-dependent overload set; an overload set from function scope will just be represented with an -@@ -12704,6 +12707,10 @@ +@@ -11883,8 +11886,17 @@ + if (purpose) + purpose = RECUR (purpose); + value = TREE_VALUE (t); +- if (value && TREE_CODE (value) != LABEL_DECL) +- value = RECUR (value); ++ if (value) ++ { ++ if (TREE_CODE (value) != LABEL_DECL) ++ value = RECUR (value); ++ else ++ { ++ value = lookup_label (DECL_NAME (value)); ++ gcc_assert (TREE_CODE (value) == LABEL_DECL); ++ TREE_USED (value) = 1; ++ } ++ } + chain = TREE_CHAIN (t); + if (chain && chain != void_type_node) + chain = RECUR (chain); +@@ -12704,6 +12716,10 @@ return build_x_unary_op (TREE_CODE (t), RECUR (TREE_OPERAND (t, 0)), complain); @@ -5711,7 +5960,7 @@ case ADDR_EXPR: op1 = TREE_OPERAND (t, 0); if (TREE_CODE (op1) == LABEL_DECL) -@@ -13179,7 +13186,9 @@ +@@ -13179,7 +13195,9 @@ if (member == error_mark_node) return error_mark_node; @@ -5864,6 +6113,31 @@ struct data_in *data_in; struct lto_input_block ib_main; unsigned int i; +Index: gcc/compare-elim.c +=================================================================== +--- a/src/gcc/compare-elim.c (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/compare-elim.c (.../branches/gcc-4_6-branch) +@@ -297,8 +297,11 @@ + src = conforming_compare (insn); + if (src) + { ++ enum machine_mode src_mode = GET_MODE (src); ++ + /* Eliminate a compare that's redundant with the previous. */ + if (last_cmp_valid ++ && src_mode == last_cmp->orig_mode + && rtx_equal_p (last_cmp->in_a, XEXP (src, 0)) + && rtx_equal_p (last_cmp->in_b, XEXP (src, 1))) + { +@@ -311,7 +314,7 @@ + last_cmp->prev_clobber = last_clobber; + last_cmp->in_a = XEXP (src, 0); + last_cmp->in_b = XEXP (src, 1); +- last_cmp->orig_mode = GET_MODE (SET_DEST (single_set (insn))); ++ last_cmp->orig_mode = src_mode; + VEC_safe_push (comparison_struct_p, heap, all_compares, last_cmp); + + /* It's unusual, but be prepared for comparison patterns that Index: gcc/lto-streamer-out.c =================================================================== --- a/src/gcc/lto-streamer-out.c (.../tags/gcc_4_6_2_release) @@ -5974,7 +6248,54 @@ /* Equate a DIE to a particular declaration. */ static void -@@ -11128,6 +11164,13 @@ +@@ -10374,6 +10410,32 @@ + return copy; + } + ++/* Like clone_tree, but additionally enter all the children into ++ the hash table decl_table. */ ++ ++static dw_die_ref ++clone_tree_hash (dw_die_ref die, htab_t decl_table) ++{ ++ dw_die_ref c; ++ dw_die_ref clone = clone_die (die); ++ struct decl_table_entry *entry; ++ void **slot = htab_find_slot_with_hash (decl_table, die, ++ htab_hash_pointer (die), INSERT); ++ /* Assert that DIE isn't in the hash table yet. If it would be there ++ before, the ancestors would be necessarily there as well, therefore ++ clone_tree_hash wouldn't be called. */ ++ gcc_assert (*slot == HTAB_EMPTY_ENTRY); ++ entry = XCNEW (struct decl_table_entry); ++ entry->orig = die; ++ entry->copy = clone; ++ *slot = entry; ++ ++ FOR_EACH_CHILD (die, c, ++ add_child_die (clone, clone_tree_hash (c, decl_table))); ++ ++ return clone; ++} ++ + /* Walk the DIE and its children, looking for references to incomplete + or trivial types that are unmarked (i.e., that are not in the current + type_unit). */ +@@ -10410,8 +10472,12 @@ + else + { + dw_die_ref parent = unit; +- dw_die_ref copy = clone_tree (targ); ++ dw_die_ref copy = clone_die (targ); + ++ FOR_EACH_CHILD (targ, c, ++ add_child_die (copy, ++ clone_tree_hash (c, decl_table))); ++ + /* Make sure the cloned tree is marked as part of the + type unit. */ + mark_dies (copy); +@@ -11128,6 +11194,13 @@ /* Don't output an entry that starts and ends at the same address. */ if (strcmp (curr->begin, curr->end) == 0) continue; @@ -5988,7 +6309,7 @@ if (!have_multiple_function_sections) { dw2_asm_output_delta (DWARF2_ADDR_SIZE, curr->begin, curr->section, -@@ -11146,7 +11189,6 @@ +@@ -11146,7 +11219,6 @@ "Location list end address (%s)", list_head->ll_symbol); } @@ -5996,7 +6317,7 @@ /* Output the block length for this list of location operations. */ gcc_assert (size <= 0xffff); -@@ -16995,15 +17037,22 @@ +@@ -16995,15 +17067,22 @@ these things can crop up in other ways also.) Note that one type of constant value which can be passed into an inlined function is a constant pointer. This can happen for example if an actual argument in an inlined @@ -6021,7 +6342,7 @@ if (TREE_CODE (decl) == ERROR_MARK) return false; -@@ -17040,7 +17089,33 @@ +@@ -17040,7 +17119,33 @@ && add_const_value_attribute (die, rtl)) return true; } @@ -6056,7 +6377,7 @@ if (list) { add_AT_location_description (die, attr, list); -@@ -18738,7 +18813,7 @@ +@@ -18738,7 +18843,7 @@ equate_decl_number_to_die (node, parm_die); if (! DECL_ABSTRACT (node_or_origin)) add_location_or_const_value_attribute (parm_die, node_or_origin, @@ -6065,7 +6386,7 @@ break; -@@ -18923,6 +18998,7 @@ +@@ -18923,6 +19028,7 @@ tree context; int was_abstract; htab_t old_decl_loc_table; @@ -6073,7 +6394,7 @@ /* Make sure we have the actual abstract inline, not a clone. */ decl = DECL_ORIGIN (decl); -@@ -18937,6 +19013,8 @@ +@@ -18937,6 +19043,8 @@ get locations in abstract instantces. */ old_decl_loc_table = decl_loc_table; decl_loc_table = NULL; @@ -6082,7 +6403,7 @@ /* Be sure we've emitted the in-class declaration DIE (if any) first, so we don't get confused by DECL_ABSTRACT. */ -@@ -18961,6 +19039,7 @@ +@@ -18961,6 +19069,7 @@ current_function_decl = save_fn; decl_loc_table = old_decl_loc_table; @@ -6090,7 +6411,7 @@ pop_cfun (); } -@@ -19745,9 +19824,8 @@ +@@ -19745,9 +19854,8 @@ && !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl_or_origin))) defer_location (decl_or_origin, var_die); else @@ -6102,7 +6423,7 @@ add_pubname (decl_or_origin, var_die); } else -@@ -21534,6 +21612,7 @@ +@@ -21534,6 +21642,7 @@ dwarf2out_decl (decl); htab_empty (decl_loc_table); @@ -6110,7 +6431,7 @@ } /* Output a marker (i.e. a label) for the beginning of the generated code for -@@ -22267,6 +22346,11 @@ +@@ -22267,6 +22376,11 @@ decl_loc_table = htab_create_ggc (10, decl_loc_table_hash, decl_loc_table_eq, NULL); @@ -6122,7 +6443,7 @@ /* Allocate the initial hunk of the decl_scope_table. */ decl_scope_table = VEC_alloc (tree, gc, 256); -@@ -22907,30 +22991,53 @@ +@@ -22907,30 +23021,53 @@ { dw_die_ref c; dw_attr_ref a; @@ -6187,7 +6508,7 @@ { remove_AT (die, a->dw_attr); ix--; -@@ -23359,6 +23466,7 @@ +@@ -23359,6 +23496,7 @@ add_location_or_const_value_attribute ( VEC_index (deferred_locations, deferred_locations_list, i)->die, VEC_index (deferred_locations, deferred_locations_list, i)->variable, @@ -6477,6 +6798,22 @@ /* Mark REG as holding a parameter for the next CALL_INSN. */ extern void use_reg (rtx *, rtx); +Index: gcc/tree-parloops.c +=================================================================== +--- a/src/gcc/tree-parloops.c (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/tree-parloops.c (.../branches/gcc-4_6-branch) +@@ -2132,7 +2132,10 @@ + || loop_has_blocks_with_irreducible_flag (loop) + || (loop_preheader_edge (loop)->src->flags & BB_IRREDUCIBLE_LOOP) + /* FIXME: the check for vector phi nodes could be removed. */ +- || loop_has_vector_phi_nodes (loop)) ++ || loop_has_vector_phi_nodes (loop) ++ /* FIXME: transform_to_exit_first_loop does not handle not ++ header-copied loops correctly - see PR46886. */ ++ || !do_while_loop_p (loop)) + continue; + estimated = estimated_loop_iterations_int (loop, false); + /* FIXME: Bypass this check as graphite doesn't update the Index: gcc/recog.c =================================================================== --- a/src/gcc/recog.c (.../tags/gcc_4_6_2_release) @@ -6894,7 +7231,15 @@ { /* For block local externs add a special DECL_EXTERNAL decl for debug info generation. */ -@@ -4261,7 +4261,7 @@ +@@ -2436,6 +2436,7 @@ + memcpy ((char *) olddecl + sizeof (struct tree_common), + (char *) newdecl + sizeof (struct tree_common), + sizeof (struct tree_decl_common) - sizeof (struct tree_common)); ++ DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl); + switch (TREE_CODE (olddecl)) + { + case FUNCTION_DECL: +@@ -4261,7 +4262,7 @@ if (DECL_INITIAL (decl)) TREE_TYPE (DECL_INITIAL (decl)) = type; @@ -6903,7 +7248,7 @@ } if (TREE_CODE (decl) == VAR_DECL) -@@ -9782,6 +9782,9 @@ +@@ -9782,6 +9783,9 @@ collect_source_ref (LOCATION_FILE (decl_sloc (decl, false))); } @@ -6913,7 +7258,7 @@ /* Collect all references relevant to SOURCE_FILE. */ static void -@@ -9792,6 +9795,8 @@ +@@ -9792,6 +9796,8 @@ FOR_EACH_VEC_ELT (tree, all_translation_units, i, t) collect_ada_nodes (BLOCK_VARS (DECL_INITIAL (t)), source_file); @@ -6922,7 +7267,7 @@ } /* Iterate over all global declarations and call CALLBACK. */ -@@ -9810,11 +9815,11 @@ +@@ -9810,11 +9816,11 @@ for (decl = BLOCK_VARS (decls); decl; decl = TREE_CHAIN (decl)) callback (decl); } @@ -8285,6 +8630,24 @@ return true; } +Index: gcc/cselib.c +=================================================================== +--- a/src/gcc/cselib.c (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/cselib.c (.../branches/gcc-4_6-branch) +@@ -2489,8 +2489,11 @@ + fputs (" locs:", out); + do + { +- fprintf (out, "\n from insn %i ", +- INSN_UID (l->setting_insn)); ++ if (l->setting_insn) ++ fprintf (out, "\n from insn %i ", ++ INSN_UID (l->setting_insn)); ++ else ++ fprintf (out, "\n "); + print_inline_rtx (out, l->loc, 4); + } + while ((l = l->next)); Index: gcc/tree-ssa-pre.c =================================================================== --- a/src/gcc/tree-ssa-pre.c (.../tags/gcc_4_6_2_release) @@ -10726,6 +11089,20 @@ if (src_mode != dest_mode) { +Index: gcc/tree-flow.h +=================================================================== +--- a/src/gcc/tree-flow.h (.../tags/gcc_4_6_2_release) ++++ b/src/gcc/tree-flow.h (.../branches/gcc-4_6-branch) +@@ -611,6 +611,9 @@ + extern bool may_propagate_copy_into_stmt (gimple, tree); + extern bool may_propagate_copy_into_asm (tree); + ++/* In tree-ssa-loop-ch.c */ ++bool do_while_loop_p (struct loop *); ++ + /* Affine iv. */ + + typedef struct Index: gcc/tree-ssa-structalias.c =================================================================== --- a/src/gcc/tree-ssa-structalias.c (.../tags/gcc_4_6_2_release) @@ -11168,7 +11545,7 @@ { if (/* Solaris 8 - single-threaded ---------------------------- -@@ -110,38 +110,58 @@ +@@ -110,38 +110,66 @@ && pc[ 0] == 0x81c7e008 && pc[ 1] == 0x81e80000) { @@ -11189,7 +11566,12 @@ - : st %l0, [ %i4 + 0x10 ] */ - savpc[-1] == 0xc826601c - || savpc[-1] == 0xe0272010) -+ if (cuh_pattern == 0xd25fa7ef) ++ if (cuh_pattern == 0x92100019) ++ /* This matches the call_user_handler pattern for Solaris 11. ++ This is the same setup as for Solaris 9, see below. */ ++ *nframes = 3; ++ ++ else if (cuh_pattern == 0xd25fa7ef) { - /* We need to move up three frames: + /* This matches the call_user_handler pattern for Solaris 10. @@ -11218,11 +11600,12 @@ - ---------------------------------------------------------- */ - { - /* We need to move up three frames: + + else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x94100013) + /* This matches the call_user_handler pattern for Solaris 9 and + for Solaris 8 running inside Solaris Containers respectively + We need to move up three frames: - ++ <-- context->cfa __sighndlr call_user_handler @@ -11233,7 +11616,8 @@ - } + */ + *nframes = 3; -+ else ++ ++ else /* cuh_pattern == 0xe0272010 */ + /* This is the default Solaris 8 case. + We need to move up two frames: + @@ -11243,10 +11627,11 @@ + + */ + *nframes = 2; ++ return 1; } -@@ -172,7 +192,7 @@ +@@ -172,7 +200,7 @@ #define IS_SIGHANDLER sparc_is_sighandler static int @@ -11255,7 +11640,7 @@ { if (/* Solaris 8, 9 - single-threaded ------------------------------- -@@ -200,7 +220,7 @@ +@@ -200,7 +228,7 @@ && pc[-1] == 0x9410001a && pc[ 0] == 0x80a62008) { @@ -11264,7 +11649,7 @@ <-- context->cfa sigacthandler -@@ -231,7 +251,7 @@ +@@ -231,7 +259,7 @@ && pc[ 1] == 0x81e80000 && pc[ 2] == 0x80a26000) { @@ -11273,7 +11658,7 @@ <-- context->cfa __libthread_segvhdlr -@@ -258,33 +278,58 @@ +@@ -258,33 +286,66 @@ && pc[ 0] == 0x81c7e008 && pc[ 1] == 0x81e80000) { @@ -11290,7 +11675,12 @@ + unsigned int cuh_pattern + = *(unsigned int *)(*(unsigned int *)(cfa + 15*4) - 4); + -+ if (cuh_pattern == 0xd407a04c) ++ if (cuh_pattern == 0x92100019) ++ /* This matches the call_user_handler pattern for Solaris 11. ++ This is the same setup as for Solaris 9, see below. */ ++ *nframes = 3; ++ ++ else if (cuh_pattern == 0xd407a04c) { - /* We need to move up two frames: + /* This matches the call_user_handler pattern for Solaris 10. @@ -11319,11 +11709,12 @@ - -------------------------------------------------- */ - { - /* We need to move up three frames: + + else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x9410001b) + /* This matches the call_user_handler pattern for Solaris 9 and + for Solaris 8 running inside Solaris Containers respectively. + We need to move up three frames: - ++ <-- context->cfa __sighndlr call_user_handler @@ -11334,7 +11725,8 @@ - } + */ + *nframes = 3; -+ else ++ ++ else /* cuh_pattern == 0x90100018 */ + /* This is the default Solaris 8 case. + We need to move up two frames: + @@ -11344,10 +11736,11 @@ + + */ + *nframes = 2; ++ return 1; } -@@ -322,7 +367,7 @@ +@@ -322,7 +383,7 @@ return _URC_NO_REASON; } @@ -12421,7 +12814,36 @@ convert_optab_libfunc (sfix_optab, DImode, DFmode)); add_libcall (libcall_htab, convert_optab_libfunc (ufix_optab, DImode, DFmode)); -@@ -5077,6 +5081,14 @@ +@@ -3577,6 +3581,28 @@ + convert_optab_libfunc (sfix_optab, DImode, SFmode)); + add_libcall (libcall_htab, + convert_optab_libfunc (ufix_optab, DImode, SFmode)); ++ ++ /* Values from double-precision helper functions are returned in core ++ registers if the selected core only supports single-precision ++ arithmetic, even if we are using the hard-float ABI. The same is ++ true for single-precision helpers, but we will never be using the ++ hard-float ABI on a CPU which doesn't support single-precision ++ operations in hardware. */ ++ add_libcall (libcall_htab, optab_libfunc (add_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (sdiv_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (smul_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (neg_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (sub_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (eq_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (lt_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (le_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (ge_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (gt_optab, DFmode)); ++ add_libcall (libcall_htab, optab_libfunc (unord_optab, DFmode)); ++ add_libcall (libcall_htab, convert_optab_libfunc (sext_optab, DFmode, ++ SFmode)); ++ add_libcall (libcall_htab, convert_optab_libfunc (trunc_optab, SFmode, ++ DFmode)); + } + + return libcall && htab_find (libcall_htab, libcall) != NULL; +@@ -5077,6 +5103,14 @@ if (IS_STACKALIGN (func_type)) return false; @@ -12436,7 +12858,7 @@ /* Everything else is ok. */ return true; } -@@ -5379,11 +5391,7 @@ +@@ -5379,11 +5413,7 @@ if (TARGET_32BIT) { @@ -12449,7 +12871,7 @@ } else /* TARGET_THUMB1 */ { -@@ -5396,10 +5404,10 @@ +@@ -5396,10 +5426,10 @@ thumb_find_work_register (saved_regs)); emit_insn (gen_pic_load_addr_thumb1 (pic_tmp, pic_rtx)); emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp)); @@ -12462,7 +12884,7 @@ } } -@@ -5429,20 +5437,7 @@ +@@ -5429,20 +5459,7 @@ UNSPEC_SYMBOL_OFFSET); offset_rtx = gen_rtx_CONST (Pmode, offset_rtx); @@ -12484,7 +12906,7 @@ return insn; } -@@ -5485,7 +5480,7 @@ +@@ -5485,7 +5502,7 @@ will_be_in_index_register (const_rtx x) { /* arm.md: calculate_pic_address will split this into a register. */ @@ -12493,7 +12915,7 @@ } /* Return nonzero if X is a valid ARM state address operand. */ -@@ -7233,6 +7228,15 @@ +@@ -7233,6 +7250,15 @@ *total = COSTS_N_INSNS (4); return true; @@ -12509,7 +12931,7 @@ default: *total = COSTS_N_INSNS (4); return false; -@@ -9426,7 +9430,8 @@ +@@ -9426,7 +9452,8 @@ arm_note_pic_base (rtx *x, void *date ATTRIBUTE_UNUSED) { if (GET_CODE (*x) == UNSPEC @@ -12519,7 +12941,7 @@ return 1; return 0; } -@@ -9812,6 +9817,9 @@ +@@ -9812,6 +9839,9 @@ rtx base_reg_rtx = NULL; int i, stm_case; @@ -12529,7 +12951,7 @@ /* Can only handle up to MAX_LDM_STM_OPS insns at present, though could be easily extended if required. */ gcc_assert (nops >= 2 && nops <= MAX_LDM_STM_OPS); -@@ -9869,7 +9877,9 @@ +@@ -9869,7 +9899,9 @@ /* If it isn't an integer register, then we can't do this. */ if (unsorted_regs[i] < 0 || (TARGET_THUMB1 && unsorted_regs[i] > LAST_LO_REGNUM) @@ -12540,7 +12962,7 @@ || (TARGET_THUMB2 && unsorted_regs[i] == SP_REGNUM) || unsorted_regs[i] > 14) return 0; -@@ -19571,39 +19581,34 @@ +@@ -19571,39 +19603,34 @@ emit_move_insn (mem, tmp2); } @@ -12600,7 +13022,7 @@ } /* Expand an expression EXP that calls a built-in function, -@@ -20859,6 +20864,8 @@ +@@ -20859,6 +20886,8 @@ gcc_assert (amount >= 0); if (amount) {