Only clear the minsym array when necessary
authorChristian Biesinger <cbiesinger@google.com>
Tue, 29 Oct 2019 22:14:48 +0000 (17:14 -0500)
committerChristian Biesinger <cbiesinger@google.com>
Wed, 30 Oct 2019 16:05:02 +0000 (11:05 -0500)
The array starts out initialized to zero:
  minimal_symbol *msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE] {};

So we only need to explicitly clear it if there were previous minsyms
added to it. This patch does that.

gdb/ChangeLog:

2019-10-30  Christian Biesinger  <cbiesinger@google.com>

* minsyms.c (clear_minimal_symbol_hash_tables): New function.
(build_minimal_symbol_hash_tables): Code to clear the table moved
to clear_minimal_symbol_hash_tables.
(minimal_symbol_reader::install): Call clear_minimal_symbol_hash_tables
when needed.

Change-Id: I7da994fe6747f67714e7efe9fdbb0dbc4d6ea532

gdb/ChangeLog
gdb/minsyms.c

index 7338ec3e91c489cc36ee16b461b884ba5eb223d5..0382082a92dfc050f4fc76e38e6effe118270634 100644 (file)
@@ -1,3 +1,11 @@
+2019-10-30  Christian Biesinger  <cbiesinger@google.com>
+
+       * minsyms.c (clear_minimal_symbol_hash_tables): New function.
+       (build_minimal_symbol_hash_tables): Code to clear the table moved
+       to clear_minimal_symbol_hash_tables.
+       (minimal_symbol_reader::install): Call clear_minimal_symbol_hash_tables
+       when needed.
+
 2019-10-29  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * infcmd.c: Remove includes.
index db3e546ae1aa80429ccbfa7732f6b356f7467e71..78cb15b5677358e3aa08649dd262135da964732b 100644 (file)
@@ -1238,6 +1238,16 @@ compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
   return (mcount);
 }
 
+static void
+clear_minimal_symbol_hash_tables (struct objfile *objfile)
+{
+  for (size_t i = 0; i < MINIMAL_SYMBOL_HASH_SIZE; i++)
+    {
+      objfile->per_bfd->msymbol_hash[i] = 0;
+      objfile->per_bfd->msymbol_demangled_hash[i] = 0;
+    }
+}
+
 /* Build (or rebuild) the minimal symbol hash tables.  This is necessary
    after compacting or sorting the table since the entries move around
    thus causing the internal minimal_symbol pointers to become jumbled.  */
@@ -1248,14 +1258,7 @@ build_minimal_symbol_hash_tables (struct objfile *objfile)
   int i;
   struct minimal_symbol *msym;
 
-  /* Clear the hash tables.  */
-  for (i = 0; i < MINIMAL_SYMBOL_HASH_SIZE; i++)
-    {
-      objfile->per_bfd->msymbol_hash[i] = 0;
-      objfile->per_bfd->msymbol_demangled_hash[i] = 0;
-    }
-
-  /* Now, (re)insert the actual entries.  */
+  /* (Re)insert the actual entries.  */
   for ((i = objfile->per_bfd->minimal_symbol_count,
        msym = objfile->per_bfd->msymbols.get ());
        i > 0;
@@ -1345,6 +1348,9 @@ minimal_symbol_reader::install ()
          The strings themselves are also located in the storage_obstack
          of this objfile.  */
 
+      if (m_objfile->per_bfd->minimal_symbol_count != 0)
+       clear_minimal_symbol_hash_tables (m_objfile);
+
       m_objfile->per_bfd->minimal_symbol_count = mcount;
       m_objfile->per_bfd->msymbols = std::move (msym_holder);