public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] Fix crash in dwarf2read.c with template parameters
@ 2019-04-30 13:27 Tom Tromey
  0 siblings, 0 replies; only message in thread
From: Tom Tromey @ 2019-04-30 13:27 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a776957c8c3a9177345ee7ca91077234ed7f508e

commit a776957c8c3a9177345ee7ca91077234ed7f508e
Author: Tom Tromey <tromey@adacore.com>
Date:   Mon Apr 22 11:46:47 2019 -0600

    Fix crash in dwarf2read.c with template parameters
    
    PR c++/24470 concerns a crash in dwarf2read.c that occurs with a
    particular test case.
    
    The issue turns out to be that process_structure_scope will pass NULL
    to symbol_symtab.  This happens because new_symbol decided not to
    create a symbol for the particular DIE.
    
    This patch fixes the problem by finding another reasonably-appropriate
    symtab to use instead; issuing a complaint if one cannot be found for
    some reason.
    
    As mentioned in the bug, I think there are other bugs here.  For
    example, when using "ptype" on the "l" object in the test case, I
    think I would expect to see the template parameter.  I didn't research
    this too closely, since it seemed more important to fix the crash.
    
    Tested on x86-64 Fedora 29.
    
    I'd like to check this in to the 8.3 branch as well.
    
    2019-04-30  Tom Tromey  <tromey@adacore.com>
    
    	PR c++/24470:
    	* dwarf2read.c (process_structure_scope): Handle case where type
    	has template parameters but no symbol was created.
    
    gdb/testsuite/ChangeLog
    2019-04-30  Tom Tromey  <tromey@adacore.com>
    
    	PR c++/24470:
    	* gdb.cp/temargs.cc: Add test code from PR.

Diff:
---
 gdb/ChangeLog                   |  6 ++++++
 gdb/dwarf2read.c                | 35 ++++++++++++++++++++++++++++-------
 gdb/testsuite/ChangeLog         |  5 +++++
 gdb/testsuite/gdb.cp/temargs.cc | 23 +++++++++++++++++++++++
 4 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f4a50e1..1e2f0eb 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2019-04-30  Tom Tromey  <tromey@adacore.com>
+
+	PR c++/24470:
+	* dwarf2read.c (process_structure_scope): Handle case where type
+	has template parameters but no symbol was created.
+
 2019-04-30  Andrew Burgess  <andrew.burgess@embecosm.com>
 	    Chris January  <chris.january@arm.com>
 
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 571fe1e..751c59c3 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -16212,13 +16212,34 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
 
       if (has_template_parameters)
 	{
-	  /* Make sure that the symtab is set on the new symbols.
-	     Even though they don't appear in this symtab directly,
-	     other parts of gdb assume that symbols do, and this is
-	     reasonably true.  */
-	  for (int i = 0; i < TYPE_N_TEMPLATE_ARGUMENTS (type); ++i)
-	    symbol_set_symtab (TYPE_TEMPLATE_ARGUMENT (type, i),
-			       symbol_symtab (sym));
+	  struct symtab *symtab;
+	  if (sym != nullptr)
+	    symtab = symbol_symtab (sym);
+	  else if (cu->line_header != nullptr)
+	    {
+	      /* Any related symtab will do.  */
+	      symtab
+		= cu->line_header->file_name_at (file_name_index (1))->symtab;
+	    }
+	  else
+	    {
+	      symtab = nullptr;
+	      complaint (_("could not find suitable "
+			   "symtab for template parameter"
+			   " - DIE at %s [in module %s]"),
+			 sect_offset_str (die->sect_off),
+			 objfile_name (objfile));
+	    }
+
+	  if (symtab != nullptr)
+	    {
+	      /* Make sure that the symtab is set on the new symbols.
+		 Even though they don't appear in this symtab directly,
+		 other parts of gdb assume that symbols do, and this is
+		 reasonably true.  */
+	      for (int i = 0; i < TYPE_N_TEMPLATE_ARGUMENTS (type); ++i)
+		symbol_set_symtab (TYPE_TEMPLATE_ARGUMENT (type, i), symtab);
+	    }
 	}
     }
 }
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index d3be74d..41aae07 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-04-30  Tom Tromey  <tromey@adacore.com>
+
+	PR c++/24470:
+	* gdb.cp/temargs.cc: Add test code from PR.
+
 2019-04-30  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* gdb.fortran/vla-datatypes.exp: Update expected results.
diff --git a/gdb/testsuite/gdb.cp/temargs.cc b/gdb/testsuite/gdb.cp/temargs.cc
index dc06165..d2a85f9 100644
--- a/gdb/testsuite/gdb.cp/temargs.cc
+++ b/gdb/testsuite/gdb.cp/temargs.cc
@@ -80,6 +80,29 @@ struct K3
   }
 };
 
+namespace pr24470
+{
+// From PR c++/24470
+// This caused a gdb crash during startup.
+
+template <int a> struct b {};
+template <typename, typename> struct c {
+  template <long d> using e = b<d>;
+  void k(e<0>);
+};
+template <typename, template <typename, typename> class, unsigned long...>
+struct m;
+template <typename g, template <typename, typename> class h, unsigned long i>
+struct m<g, h, i> {
+  using j = b<i>;
+};
+struct n {
+  template <typename g> using f = typename m<g, c, 0>::j;
+};
+
+n::f<int> l;
+}
+
 int main ()
 {
   Base<double, 23, &a_global, &S::f> base;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-04-30 13:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-30 13:27 [binutils-gdb] Fix crash in dwarf2read.c with template parameters Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).