]> code.ossystems Code Review - openembedded-core.git/commitdiff
gcc-7.3: Backport fixes for std::pair high memory usage
authorJoel Stanley <joel@jms.id.au>
Mon, 30 Jul 2018 05:10:29 +0000 (14:40 +0930)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Tue, 31 Jul 2018 21:55:31 +0000 (22:55 +0100)
C++ applications that contain a specfic use of std::pair with tempates
cause the build to require many gigabytes of RAM to build.

This is a fix that was applied to the upstream GCC 7 branch.

Change-Id: I213f96d1d6332e2dce5765482ff3413f1abd7ff8
Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Ross Burton <ross.burton@intel.com>
meta/recipes-devtools/gcc/gcc-7.3.inc
meta/recipes-devtools/gcc/gcc-7.3/0001-PR-c-80290-memory-hog-with-std-pair.patch [new file with mode: 0644]

index 81320dc52a59b3405ad0c5c60efda4b09de19677..c7c88f12e499be1327f7e10680ba0e7766f7fe63 100644 (file)
@@ -80,6 +80,7 @@ BACKPORTS = "\
            file://0001-Fix-internal-compiler-error-in-testcase.patch \
            file://0001-PR-rtl-optimization-83030.patch \
            file://0001-Fix-ppc64le-build-Partial-backport-r256656.patch \
+           file://0001-PR-c-80290-memory-hog-with-std-pair.patch \
 "
 
 SRC_URI[md5sum] = "be2da21680f27624f3a87055c4ba5af2"
diff --git a/meta/recipes-devtools/gcc/gcc-7.3/0001-PR-c-80290-memory-hog-with-std-pair.patch b/meta/recipes-devtools/gcc/gcc-7.3/0001-PR-c-80290-memory-hog-with-std-pair.patch
new file mode 100644 (file)
index 0000000..603a29a
--- /dev/null
@@ -0,0 +1,58 @@
+From 8c014bceeca6a558519e86b16a8142accc41e94f Mon Sep 17 00:00:00 2001
+From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Thu, 28 Jun 2018 00:25:21 +0000
+Subject: [PATCH]       PR c++/80290 - memory-hog with std::pair.
+
+       * pt.c (type_unification_real): Skip non-dependent conversion
+       check for a nested list argument.
+       (braced_init_depth): New.
+
+Upstream-Status: Backport
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ gcc/cp/pt.c      | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
+index 79cfd0129226..71077a3b0498 100644
+--- a/gcc/cp/pt.c
++++ b/gcc/cp/pt.c
+@@ -19242,6 +19242,24 @@ try_array_deduction (tree tparms, tree targs, tree parm)
+                         /*nondeduced*/false, array_deduction_r);
+ }
++/* Returns how many levels of { } INIT contains.  */
++
++static int
++braced_init_depth (tree init)
++{
++  if (!init || !BRACE_ENCLOSED_INITIALIZER_P (init))
++    return 0;
++  unsigned i; tree val;
++  unsigned max = 0;
++  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (init), i, val)
++    {
++      unsigned elt_d = braced_init_depth (val);
++      if (elt_d > max)
++      max = elt_d;
++    }
++  return max + 1;
++}
++
+ /* Most parms like fn_type_unification.
+    If SUBR is 1, we're being called recursively (to unify the
+@@ -19478,6 +19496,10 @@ type_unification_real (tree tparms,
+           if (uses_template_parms (parm))
+             continue;
++          /* Workaround for c++/80290: avoid combinatorial explosion on
++             deeply nested braced init-lists.  */
++          if (braced_init_depth (arg) > 2)
++            continue;
+           if (check_non_deducible_conversion (parm, arg, strict, flags,
+                                               explain_p))
+             return 1;
+-- 
+2.17.1
+