Allow "info address" of a template parameter
authorTom Tromey <tom@tromey.com>
Thu, 19 Jul 2018 17:24:49 +0000 (11:24 -0600)
committerTom Tromey <tom@tromey.com>
Thu, 2 Aug 2018 22:12:42 +0000 (16:12 -0600)
PR symtab/16842 shows that gdb will crash when the user tries to
invoke "info address" of a template parameter.

The bug here is that dwarf2read.c does not set the symtab on the
template parameter symbols.  This is pedantically correct, given that
the template symbols do not appear in a symtab.  However, gdb
primarily uses the symtab backlink to find the symbol's objfile.  So,
this patch simply sets the symtab on these symbols.

Tested by the buildbot.

gdb/ChangeLog
2018-08-02  Tom Tromey  <tom@tromey.com>

PR symtab/16842.
* dwarf2read.c (read_func_scope): Set symtab on template parameter
symbols.
(process_structure_scope): Likewise.

gdb/testsuite/ChangeLog
2018-08-02  Tom Tromey  <tom@tromey.com>

PR symtab/16842.
* gdb.cp/temargs.exp: Test "info address" of a template
parameter.

gdb/ChangeLog
gdb/dwarf2read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/temargs.exp

index 661ad166e0f8c925bdb6400265a32087bb212abe..227e3ff74f626ba246261de83d0ecb14b0842a2d 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-02  Tom Tromey  <tom@tromey.com>
+
+       PR symtab/16842.
+       * dwarf2read.c (read_func_scope): Set symtab on template parameter
+       symbols.
+       (process_structure_scope): Likewise.
+
 2018-08-02  Xavier Roirand  <roirand@adacore.com>
 
        PR gdb/22629:
index 2c82d813b16cb8ac1d460a70ec0e18d1f6b8c894..a75821228956b9aef1268debd7fc3cb60f55b1b4 100644 (file)
@@ -13753,6 +13753,13 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
       memcpy (templ_func->template_arguments,
              template_args.data (),
              (templ_func->n_template_arguments * sizeof (struct symbol *)));
+
+      /* 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 (struct symbol *sym : template_args)
+       symbol_set_symtab (sym, symbol_symtab (templ_func));
     }
 
   /* In C++, we can have functions nested inside functions (e.g., when
@@ -15873,6 +15880,7 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
      discriminant_info.  */
   bool is_variant_part = TYPE_FLAG_DISCRIMINATED_UNION (type);
   sect_offset discr_offset;
+  bool has_template_parameters = false;
 
   if (is_variant_part)
     {
@@ -15920,6 +15928,7 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
       /* Attach template arguments to type.  */
       if (!template_args.empty ())
        {
+         has_template_parameters = true;
          ALLOCATE_CPLUS_STRUCT_TYPE (type);
          TYPE_N_TEMPLATE_ARGUMENTS (type) = template_args.size ();
          TYPE_TEMPLATE_ARGUMENTS (type)
@@ -16069,7 +16078,20 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
      attribute, and a declaration attribute.  */
   if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL
       || !die_is_declaration (die, cu))
-    new_symbol (die, type, cu);
+    {
+      struct symbol *sym = new_symbol (die, type, 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));
+       }
+    }
 }
 
 /* Assuming DIE is an enumeration type, and TYPE is its associated type,
index 8011ff1c70ff798acf7fdc0ea44881eb5d7b48fd..4f4d8a262e0c3a62ce9c65c52f33dbba3cacf82a 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-02  Tom Tromey  <tom@tromey.com>
+
+       PR symtab/16842.
+       * gdb.cp/temargs.exp: Test "info address" of a template
+       parameter.
+
 2018-07-31  Jan Vrany  <jan.vrany@fit.cvut.cz>
 
        * gdb.python/py-mi-var-info-path-expression.c: New file.
index 8c87872225e8ccf186b26970c03128d58bad12b2..5a109102d75842375603091c6245584dd6b21eec 100644 (file)
@@ -133,6 +133,10 @@ gdb_test "ptype T" "unsigned char" "test type of T in func"
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print I" " = 91" "test value of I in func"
 
+# PR symtab/16842 - gdb used to crash here.
+if $have_older_template_gcc { setup_xfail "*-*-*" }
+gdb_test "info addr I" "Symbol \"I\" is constant." "test address of I in templ_m"
+
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print P == &a_global" " = true" "test value of P in func"
 
@@ -151,6 +155,10 @@ gdb_test "ptype T" "double" "test type of T in templ_m"
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print I" " = 23" "test value of I in templ_m"
 
+# PR symtab/16842 - gdb used to crash here.
+if $have_older_template_gcc { setup_xfail "*-*-*" }
+gdb_test "info addr I" "Symbol \"I\" is constant." "test address of I in templ_m"
+
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print P == &a_global" " = true" "test value of P in templ_m"