[gcc] 4.7.2-7
Jakub Jelinek
jakub at fedoraproject.org
Mon Nov 5 16:21:08 UTC 2012
commit 747298b1492470868256ab72bcdf217e4ade8e1f
Author: Jakub Jelinek <jakub at redhat.com>
Date: Mon Nov 5 17:21:03 2012 +0100
4.7.2-7
.gitignore | 1 +
gcc.spec | 22 +++++-
gcc47-c++-new-check-opt.patch | 176 +++++++++++++++++++++++++++++++++++++++++
sources | 2 +-
4 files changed, 197 insertions(+), 4 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 4038c66..83b4ef6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,3 +45,4 @@
/gcc-4.7.2-20121001.tar.bz2
/gcc-4.7.2-20121009.tar.bz2
/gcc-4.7.2-20121015.tar.bz2
+/gcc-4.7.2-20121105.tar.bz2
diff --git a/gcc.spec b/gcc.spec
index d3646b3..302c6d0 100644
--- a/gcc.spec
+++ b/gcc.spec
@@ -1,9 +1,9 @@
-%global DATE 20121015
-%global SVNREV 192447
+%global DATE 20121105
+%global SVNREV 193167
%global gcc_version 4.7.2
# Note, gcc_release must be integer, if you want to add suffixes to
# %{release}, append them after %{gcc_release} on Release: line.
-%global gcc_release 6
+%global gcc_release 7
%global _unpackaged_files_terminate_build 0
%global multilib_64_archs sparc64 ppc64 s390x x86_64
%ifarch %{ix86} x86_64 ia64 ppc ppc64 alpha
@@ -185,6 +185,7 @@ Patch14: gcc47-ppl-0.10.patch
Patch15: gcc47-libitm-fno-exceptions.patch
Patch16: gcc47-rh837630.patch
Patch17: gcc47-arm-hfp-ldso.patch
+Patch18: gcc47-c++-new-check-opt.patch
Patch1000: fastjar-0.97-segfault.patch
Patch1001: fastjar-0.97-len1.patch
@@ -689,6 +690,7 @@ package or when debugging this package.
%if 0%{?fedora} >= 18 || 0%{?rhel} >= 7
%patch17 -p0 -b .arm-hfp-ldso~
%endif
+%patch18 -p0 -b .c++-new-check-opt~
%if 0%{?_enable_debug_packages}
cat > split-debuginfo.sh <<\EOF
@@ -2662,6 +2664,20 @@ fi
%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/plugin
%changelog
+* Mon Nov 5 2012 Jakub Jelinek <jakub at redhat.com> 4.7.2-7
+- update from the 4.7 branch
+ - PRs c++/54984, c++/54988, debug/54828, libstdc++/55047, libstdc++/55123,
+ libstdc++/55169, middle-end/54945, rtl-optimization/53701,
+ rtl-optimization/54870, target/53975, target/54892, target/55019,
+ target/55175, tree-optimization/53708, tree-optimization/54146,
+ tree-optimization/54877, tree-optimization/54902,
+ tree-optimization/54920, tree-optimization/54985
+- backported s390{,x} zEC12 enablement (#805114)
+- backport of selected debug info quality improvements
+ - PRs debug/54402, debug/54693, debug/54953, debug/54970, debug/54971
+- optimize away overflow checking for new char[n]; and similar cases
+ where n is multiplied by 1
+
* Mon Oct 15 2012 Jon Ciesla <limburgher at gmail.com> 4.7.2-6
- Provides: bundled(libiberty)
diff --git a/gcc47-c++-new-check-opt.patch b/gcc47-c++-new-check-opt.patch
new file mode 100644
index 0000000..9454141
--- /dev/null
+++ b/gcc47-c++-new-check-opt.patch
@@ -0,0 +1,176 @@
+2012-10-31 Florian Weimer <fweimer at redhat.com>
+
+ * init.c (build_new_1): Do not check for arithmetic overflow if
+ inner array size is 1.
+
+ * g++.dg/init/new40.C: New.
+
+--- gcc/cp/init.c (revision 193033)
++++ gcc/cp/init.c (working copy)
+@@ -2176,6 +2176,8 @@ build_new_1 (VEC(tree,gc) **placement, t
+ double_int inner_nelts_count = double_int_one;
+ tree inner_nelts = NULL_TREE;
+ tree alloc_call, alloc_expr;
++ /* Size of the inner array elements. */
++ double_int inner_size;
+ /* The address returned by the call to "operator new". This node is
+ a VAR_DECL and is therefore reusable. */
+ tree alloc_node;
+@@ -2318,8 +2320,6 @@ build_new_1 (VEC(tree,gc) **placement, t
+ double_int max_size
+ = double_int_lshift (double_int_one, TYPE_PRECISION (sizetype) - 1,
+ HOST_BITS_PER_DOUBLE_INT, false);
+- /* Size of the inner array elements. */
+- double_int inner_size;
+ /* Maximum number of outer elements which can be allocated. */
+ double_int max_outer_nelts;
+ tree max_outer_nelts_tree;
+@@ -2438,7 +2438,15 @@ build_new_1 (VEC(tree,gc) **placement, t
+ if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
+ size = size_binop (PLUS_EXPR, size, cookie_size);
+ else
+- cookie_size = NULL_TREE;
++ {
++ cookie_size = NULL_TREE;
++ /* No size arithmetic necessary, so the size check is
++ not needed. */
++ if (outer_nelts_check != NULL
++ && double_int_one_p (inner_size)
++ && inner_nelts == NULL_TREE)
++ outer_nelts_check = NULL_TREE;
++ }
+ /* Perform the overflow check. */
+ if (outer_nelts_check != NULL_TREE)
+ size = fold_build3 (COND_EXPR, sizetype, outer_nelts_check,
+@@ -2474,7 +2482,15 @@ build_new_1 (VEC(tree,gc) **placement, t
+ /* Use a global operator new. */
+ /* See if a cookie might be required. */
+ if (!(array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type)))
+- cookie_size = NULL_TREE;
++ {
++ cookie_size = NULL_TREE;
++ /* No size arithmetic necessary, so the size check is
++ not needed. */
++ if (outer_nelts_check != NULL
++ && double_int_one_p (inner_size)
++ && inner_nelts == NULL_TREE)
++ outer_nelts_check = NULL_TREE;
++ }
+
+ alloc_call = build_operator_new_call (fnname, placement,
+ &size, &cookie_size,
+--- gcc/testsuite/g++.dg/init/new40.C (revision 0)
++++ gcc/testsuite/g++.dg/init/new40.C (working copy)
+@@ -0,0 +1,112 @@
++// Testcase for overflow handling in operator new[].
++// Optimization of unnecessary overflow checks.
++// { dg-do run }
++
++#include <assert.h>
++#include <stdlib.h>
++#include <stdexcept>
++
++static size_t magic_allocation_size
++ = 1 + (size_t (1) << (sizeof (size_t) * 8 - 1));
++
++struct exc : std::bad_alloc {
++};
++
++static size_t expected_size;
++
++struct pod_with_new {
++ char ch;
++ void *operator new[] (size_t sz)
++ {
++ if (sz != expected_size)
++ abort ();
++ throw exc ();
++ }
++};
++
++struct with_new {
++ char ch;
++ with_new () { }
++ ~with_new () { }
++ void *operator new[] (size_t sz)
++ {
++ if (sz != size_t (-1))
++ abort ();
++ throw exc ();
++ }
++};
++
++struct non_pod {
++ char ch;
++ non_pod () { }
++ ~non_pod () { }
++};
++
++void *
++operator new (size_t sz) _GLIBCXX_THROW (std::bad_alloc)
++{
++ if (sz != expected_size)
++ abort ();
++ throw exc ();
++}
++
++int
++main ()
++{
++ if (sizeof (pod_with_new) == 1)
++ expected_size = magic_allocation_size;
++ else
++ expected_size = -1;
++
++ try {
++ new pod_with_new[magic_allocation_size];
++ abort ();
++ } catch (exc &) {
++ }
++
++ if (sizeof (with_new) == 1)
++ expected_size = magic_allocation_size;
++ else
++ expected_size = -1;
++
++ try {
++ new with_new[magic_allocation_size];
++ abort ();
++ } catch (exc &) {
++ }
++
++ expected_size = magic_allocation_size;
++ try {
++ new char[magic_allocation_size];
++ abort ();
++ } catch (exc &) {
++ }
++
++ expected_size = -1;
++
++ try {
++ new pod_with_new[magic_allocation_size][2];
++ abort ();
++ } catch (exc &) {
++ }
++
++ try {
++ new with_new[magic_allocation_size][2];
++ abort ();
++ } catch (exc &) {
++ }
++
++ try {
++ new char[magic_allocation_size][2];
++ abort ();
++ } catch (exc &) {
++ }
++
++ try {
++ new non_pod[magic_allocation_size];
++ abort ();
++ } catch (exc &) {
++ }
++
++ return 0;
++}
diff --git a/sources b/sources
index f92fea9..7684c64 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
2659f09c2e43ef8b7d4406321753f1b2 fastjar-0.97.tar.gz
-2891991f350ae9f513b8070beab43611 gcc-4.7.2-20121015.tar.bz2
+2dfb5b278c94d6859782bbf649f0b8e7 gcc-4.7.2-20121105.tar.bz2
More information about the scm-commits
mailing list