[arch-commits] Commit in gcc-multilib/trunk (PKGBUILD PR82155.patch)

Jan Steffens heftig at archlinux.org
Mon Oct 23 11:35:45 UTC 2017


    Date: Monday, October 23, 2017 @ 11:35:44
  Author: heftig
Revision: 264050

7.2.0-3

Added:
  gcc-multilib/trunk/PR82155.patch
Modified:
  gcc-multilib/trunk/PKGBUILD

---------------+
 PKGBUILD      |   44 ++++++++++++--------
 PR82155.patch |  119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 146 insertions(+), 17 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2017-10-23 09:27:18 UTC (rev 264049)
+++ PKGBUILD	2017-10-23 11:35:44 UTC (rev 264050)
@@ -9,7 +9,7 @@
 pkgver=7.2.0
 _pkgver=${pkgver:0:1}
 _islver=0.18
-pkgrel=1
+pkgrel=3
 _commit=1bd23ca8c30f4827c4bea23deedf7ca33a86ffb5
 pkgdesc="The GNU Compiler Collection for multilib"
 arch=('x86_64')
@@ -21,10 +21,12 @@
 options=('!emptydirs')
 source=(git+https://gcc.gnu.org/git/gcc.git#commit=${_commit}
         http://isl.gforge.inria.fr/isl-${_islver}.tar.bz2
-        Revert-eeb6872bf.patch)
+        Revert-eeb6872bf.patch
+        PR82155.patch)
 md5sums=('SKIP'
          '11436d6b205e516635b666090b94ab32'
-         'e4c9c8b498b04c0f51d219d025ca8407')
+         'e4c9c8b498b04c0f51d219d025ca8407'
+         'e77419f7d25aad0980c765012dc8c417')
 
 _libdir="usr/lib/gcc/$CHOST/$pkgver"
 
@@ -46,6 +48,9 @@
   # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80717
   git apply ../Revert-eeb6872bf.patch
 
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82155
+  patch -p1 -i ../PR82155.patch
+
   mkdir ${srcdir}/gcc-build
 }
 
@@ -138,8 +143,8 @@
   rm -r ${pkgdir}/usr/lib
 
   # Install Runtime Library Exception
-  install -Dm644 ${srcdir}/gcc/COPYING.RUNTIME \
-    ${pkgdir}/usr/share/licenses/lib32-gcc-libs/RUNTIME.LIBRARY.EXCEPTION
+  install -Dm644 "$srcdir/gcc/COPYING.RUNTIME" \
+    "$pkgdir/usr/share/licenses/lib32-gcc-libs/RUNTIME.LIBRARY.EXCEPTION"
 }
 
 package_gcc-libs-multilib()
@@ -188,8 +193,8 @@
   rm -r ${pkgdir}/usr/lib32
 
   # Install Runtime Library Exception
-  install -Dm644 ${srcdir}/gcc/COPYING.RUNTIME \
-    ${pkgdir}/usr/share/licenses/gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION
+  install -Dm644 "$srcdir/gcc/COPYING.RUNTIME" \
+    "$pkgdir/usr/share/licenses/gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION"
 }
 
 package_gcc-multilib()
@@ -298,8 +303,9 @@
   make -C $CHOST/libstdc++-v3/doc DESTDIR=$pkgdir doc-install-man
 
   # Install Runtime Library Exception
-  install -d ${pkgdir}/usr/share/licenses/gcc-multilib/
-  ln -s ../gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION ${pkgdir}/usr/share/licenses/gcc-multilib/
+  install -d "$pkgdir/usr/share/licenses/$pkgname/"
+  ln -s /usr/share/licenses/gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION \
+    "$pkgdir/usr/share/licenses/$pkgname/"
 }
 
 package_gcc-fortran-multilib()
@@ -322,8 +328,9 @@
   ln -s gfortran ${pkgdir}/usr/bin/f95
 
   # Install Runtime Library Exception
-  install -d ${pkgdir}/usr/share/licenses/gcc-fortran-multilib/
-  ln -s ../gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION ${pkgdir}/usr/share/licenses/gcc-fortran-multilib/
+  install -d "$pkgdir/usr/share/licenses/$pkgname/"
+  ln -s /usr/share/licenses/gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION \
+    "$pkgdir/usr/share/licenses/$pkgname/"
 }
 
 package_gcc-objc-multilib()
@@ -339,8 +346,9 @@
   install -m755 gcc/cc1obj{,plus} $pkgdir/${_libdir}/
 
   # Install Runtime Library Exception
-  install -d ${pkgdir}/usr/share/licenses/gcc-objc-multilib/
-  ln -s ../gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION ${pkgdir}/usr/share/licenses/gcc-objc-multilib/
+  install -d "$pkgdir/usr/share/licenses/$pkgname/"
+  ln -s /usr/share/licenses/gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION \
+    "$pkgdir/usr/share/licenses/$pkgname/"
 }
 
 package_gcc-ada-multilib()
@@ -374,8 +382,9 @@
   rm ${pkgdir}/${_libdir}/32/adalib/libgna{rl,t}.so
 
   # Install Runtime Library Exception
-  install -d ${pkgdir}/usr/share/licenses/gcc-ada-multilib/
-  ln -s ../gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION ${pkgdir}/usr/share/licenses/gcc-ada-multilib/
+  install -d "$pkgdir/usr/share/licenses/$pkgname/"
+  ln -s /usr/share/licenses/gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION \
+    "$pkgdir/usr/share/licenses/$pkgname/"
 }
 
 package_gcc-go-multilib()
@@ -396,6 +405,7 @@
   make DESTDIR=${pkgdir} install-gotools
 
   # Install Runtime Library Exception
-  install -d ${pkgdir}/usr/share/licenses/gcc-go-multilib/
-  ln -s ../gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION ${pkgdir}/usr/share/licenses/gcc-go-multilib/
+  install -d "$pkgdir/usr/share/licenses/$pkgname/"
+  ln -s /usr/share/licenses/gcc-libs-multilib/RUNTIME.LIBRARY.EXCEPTION \
+    "$pkgdir/usr/share/licenses/$pkgname/"
 }

Added: PR82155.patch
===================================================================
--- PR82155.patch	                        (rev 0)
+++ PR82155.patch	2017-10-23 11:35:44 UTC (rev 264050)
@@ -0,0 +1,119 @@
+From: Pierre-Marie de Rodat <derodat at adacore dot com>
+To: gcc-patches at gcc dot gnu dot org
+Cc: Pierre-Marie de Rodat <derodat at adacore dot com>
+Subject: [PATCH] [PR82155] Fix crash in dwarf2out_abstract_function
+Date: Tue, 12 Sep 2017 08:00:03 +0200
+Message-Id: <20170912060003.32378-1-derodat at adacore.com>
+X-IsSubscribed: yes
+
+Hello,
+
+This patch is an attempt to fix the crash reported in PR82155.
+
+When generating a C++ class method for a class that is itself nested in
+a class method, dwarf2out_early_global_decl currently leaves the
+existing context DIE as it is if it already exists.  However, it is
+possible that this call happens at a point where this context DIE is
+just a declaration that is itself not located in its own context.
+
+>From there, if dwarf2out_early_global_decl is not called on any of the
+FUNCTION_DECL in the context chain, DIEs will be left badly scoped and
+some (such as the nested method) will be removed by the type pruning
+machinery.  As a consequence, dwarf2out_abstract_function will will
+crash when called on the corresponding DECL because it asserts that the
+DECL has a DIE.
+
+This patch fixes this crash making dwarf2out_early_global_decl process
+context DIEs the same way we process abstract origins for FUNCTION_DECL:
+if the corresponding DIE exists but is only a declaration, call
+dwarf2out_decl anyway on it so that it is turned into a more complete
+DIE and so that it is relocated in the proper context.
+
+Bootstrapped and regtested on x86_64-linux.  The crash this addresses is
+present both on trunk and on the gcc-7 branch: I suggest we commit this
+patch on both branches.  Ok to commit? Thank you in advance!
+
+gcc/
+
+	PR debug/82155
+	* dwarf2out.c (dwarf2out_early_global_decl): Call dwarf2out_decl
+	on the FUNCTION_DECL function context if it has a DIE that is a
+	declaration.
+
+gcc/testsuite/
+
+	* g++.dg/pr82155.C: New testcase.
+---
+ gcc/dwarf2out.c                | 10 ++++++++--
+ gcc/testsuite/g++.dg/pr82155.C | 36 ++++++++++++++++++++++++++++++++++++
+ 2 files changed, 44 insertions(+), 2 deletions(-)
+ create mode 100644 gcc/testsuite/g++.dg/pr82155.C
+
+diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
+index 00d6d951ba3..4cfc9c186af 100644
+--- a/gcc/dwarf2out.c
++++ b/gcc/dwarf2out.c
+@@ -25500,10 +25500,16 @@ dwarf2out_early_global_decl (tree decl)
+ 	     so that all nested DIEs are generated at the proper scope in the
+ 	     first shot.  */
+ 	  tree context = decl_function_context (decl);
+-	  if (context != NULL && lookup_decl_die (context) == NULL)
++	  if (context != NULL)
+ 	    {
++	      dw_die_ref context_die = lookup_decl_die (context);
+ 	      current_function_decl = context;
+-	      dwarf2out_decl (context);
++
++	      /* Avoid emitting DIEs multiple times, but still process CONTEXT
++		 enough so that it lands in its own context.  This avoids type
++		 pruning issues later on.  */
++	      if (context_die == NULL || is_declaration_die (context_die))
++		dwarf2out_decl (context);
+ 	    }
+ 
+ 	  /* Emit an abstract origin of a function first.  This happens
+diff --git a/gcc/testsuite/g++.dg/pr82155.C b/gcc/testsuite/g++.dg/pr82155.C
+new file mode 100644
+index 00000000000..75d9b615f39
+--- /dev/null
++++ b/gcc/testsuite/g++.dg/pr82155.C
+@@ -0,0 +1,36 @@
++/* { dg-do compile { target c++11 } } */
++/* { dg-options "-g -O2" } */
++
++template <typename a> struct b { a c; };
++template <typename d> struct e { d *operator->(); };
++template <typename d> class h {
++public:
++  typedef e<d> ag;
++};
++class i {
++protected:
++  i(int);
++};
++class j {
++  virtual void k(int) = 0;
++
++public:
++  int f;
++  void l() { k(f); }
++};
++struct m : i {
++  int cn;
++  m() : i(cn) {
++    struct n : j {
++      n() {}
++      void k(int) {}
++    };
++  }
++};
++struct o {
++  o() {
++    for (h<b<b<j *>>>::ag g;;)
++      g->c.c->l();
++  }
++};
++void fn1() { o(); }
+-- 
+2.14.1
+



More information about the arch-commits mailing list