]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/symtab] Fix qualified name for cooked index dump
authorTom de Vries <tdevries@suse.de>
Thu, 17 Oct 2024 22:15:57 +0000 (00:15 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 17 Oct 2024 22:15:57 +0000 (00:15 +0200)
While looking at the cooked index entry for local variable l4 of function test
in test-case gdb.fortran/logical.exp:
...
$ gdb -q -batch outputs/gdb.fortran/logical/logical \
  -ex "maint print objfiles"
  ...
    [9] ((cooked_index_entry *) 0x7fc6e0003010)
    name:       l4
    canonical:  l4
    qualified:  l4
    DWARF tag:  DW_TAG_variable
    flags:      0x2 [IS_STATIC]
    DIE offset: 0x17c
    parent:     ((cooked_index_entry *) 0x7fc6e0002f20) [test]
...
I noticed that while the entry does have a parent, that's not reflected in the
qualified name.

This makes it harder to write test-cases that check the parent of a cooked
index entry.

This is due to the implementation of full_name, which skips printing
parents if the language does not specify an appropriate separator.

Fix this by using "::" as default separator, getting us instead:
...
    [9] ((cooked_index_entry *) 0x7f94ec0040c0)
    name:       l4
    canonical:  l4
    qualified:  test::l4
    DWARF tag:  DW_TAG_variable
    flags:      0x2 [IS_STATIC]
    DIE offset: 0x17c
    parent:     ((cooked_index_entry *) 0x7f94ec003fd0) [test]
...

Tested on x86_64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
gdb/dwarf2/cooked-index.c
gdb/dwarf2/cooked-index.h

index 4073c924890d6aec22989aa1c321a4fd00173a33..46b1c2d1b1249583cd1a2deb168471296cd6ffc0 100644 (file)
@@ -215,14 +215,15 @@ cooked_index_entry::matches (domain_search_flags kind) const
 /* See cooked-index.h.  */
 
 const char *
-cooked_index_entry::full_name (struct obstack *storage, bool for_main) const
+cooked_index_entry::full_name (struct obstack *storage, bool for_main,
+                              const char *default_sep) const
 {
   const char *local_name = for_main ? name : canonical;
 
   if ((flags & IS_LINKAGE) != 0 || get_parent () == nullptr)
     return local_name;
 
-  const char *sep = nullptr;
+  const char *sep = default_sep;
   switch (lang)
     {
     case language_cplus:
@@ -237,7 +238,9 @@ cooked_index_entry::full_name (struct obstack *storage, bool for_main) const
       break;
 
     default:
-      return local_name;
+      if (sep == nullptr)
+       return local_name;
+      break;
     }
 
   get_parent ()->write_scope (storage, sep, for_main);
@@ -799,7 +802,8 @@ cooked_index::dump (gdbarch *arch)
       gdb_printf ("    [%zu] ((cooked_index_entry *) %p)\n", i++, entry);
       gdb_printf ("    name:       %s\n", entry->name);
       gdb_printf ("    canonical:  %s\n", entry->canonical);
-      gdb_printf ("    qualified:  %s\n", entry->full_name (&temp_storage, false));
+      gdb_printf ("    qualified:  %s\n",
+                 entry->full_name (&temp_storage, false, "::"));
       gdb_printf ("    DWARF tag:  %s\n", dwarf_tag_name (entry->tag));
       gdb_printf ("    flags:      %s\n", to_string (entry->flags).c_str ());
       gdb_printf ("    DIE offset: %s\n", sect_offset_str (entry->die_offset));
index 0873e7dce1d1e02b7eb4f8ae5bbda2a389f37410..2807f5c3b4ab4ed705b5bcb885f04f2e5933449e 100644 (file)
@@ -140,8 +140,11 @@ struct cooked_index_entry : public allocate_on_obstack<cooked_index_entry>
      STORAGE.  FOR_MAIN is true if we are computing the name of the
      "main" entry -- one marked DW_AT_main_subprogram.  This matters
      for avoiding name canonicalization and also a related race (if
-     "main" computation is done during finalization).  */
-  const char *full_name (struct obstack *storage, bool for_main = false) const;
+     "main" computation is done during finalization).  If the language
+     doesn't prescribe a separator, one can be specified using
+     DEFAULT_SEP.  */
+  const char *full_name (struct obstack *storage, bool for_main = false,
+                        const char *default_sep = nullptr) const;
 
   /* Comparison modes for the 'compare' function.  See the function
      for a description.  */