]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Convert abbrevs to new hash table
authorSimon Marchi <simon.marchi@efficios.com>
Mon, 19 Aug 2024 15:03:51 +0000 (15:03 +0000)
committerSimon Marchi <simon.marchi@efficios.com>
Fri, 23 Aug 2024 18:37:54 +0000 (14:37 -0400)
This converts the DWARF abbrevs themselves to use the new hash table.

Change-Id: I0320a733ecefe2cffeb25c068f17322dd3ab23e2
Co-Authored-By: Tom Tromey <tom@tromey.com>
gdb/dwarf2/abbrev.c
gdb/dwarf2/abbrev.h

index 359a0094872acc4443f7f500cdc917737b7c231a..cf523b11da7002190a7a0519428630f407e67812 100644 (file)
 #include "dwarf2/leb.h"
 #include "bfd.h"
 
-/* Hash function for an abbrev.  */
-
-static hashval_t
-hash_abbrev (const void *item)
-{
-  const struct abbrev_info *info = (const struct abbrev_info *) item;
-  /* Warning: if you change this next line, you must also update the
-     other code in this class using the _with_hash functions.  */
-  return info->number;
-}
-
-/* Comparison function for abbrevs.  */
-
-static int
-eq_abbrev (const void *lhs, const void *rhs)
-{
-  const struct abbrev_info *l_info = (const struct abbrev_info *) lhs;
-  const struct abbrev_info *r_info = (const struct abbrev_info *) rhs;
-  return l_info->number == r_info->number;
-}
-
-/* Abbreviation tables.
-
-   In DWARF version 2, the description of the debugging information is
-   stored in a separate .debug_abbrev section.  Before we read any
-   dies from a section we read in all abbreviations and install them
-   in a hash table.  */
-
-abbrev_table::abbrev_table (sect_offset off, struct dwarf2_section_info *sect)
-  : sect_off (off),
-    section (sect),
-    m_abbrevs (htab_create_alloc (20, hash_abbrev, eq_abbrev,
-                                 nullptr, xcalloc, xfree))
-{
-}
-
-/* Add an abbreviation to the table.  */
-
-void
-abbrev_table::add_abbrev (struct abbrev_info *abbrev)
-{
-  void **slot = htab_find_slot_with_hash (m_abbrevs.get (), abbrev,
-                                         abbrev->number, INSERT);
-  *slot = abbrev;
-}
-
 /* Helper function that returns true if a DIE with the given tag might
    plausibly be indexed.  */
 
index 1fb90fdeafa42ba4183b8e5a7c77d87a9542240d..fb2e9ecc6d758fa41a1f7a5c0213e758340ddb5b 100644 (file)
@@ -27,7 +27,7 @@
 #ifndef GDB_DWARF2_ABBREV_H
 #define GDB_DWARF2_ABBREV_H
 
-#include "hashtab.h"
+#include "gdbsupport/unordered_map.h"
 
 struct attr_abbrev
 {
@@ -60,7 +60,12 @@ struct abbrev_info
 struct abbrev_table;
 typedef std::unique_ptr<struct abbrev_table> abbrev_table_up;
 
-/* Top level data structure to contain an abbreviation table.  */
+/* Top level data structure to contain an abbreviation table.
+
+   In DWARF version 2, the description of the debugging information is
+   stored in a separate .debug_abbrev section.  Before we read any
+   dies from a section we read in all abbreviations and install them
+   in a hash table.  */
 
 struct abbrev_table
 {
@@ -76,12 +81,11 @@ struct abbrev_table
 
   const struct abbrev_info *lookup_abbrev (unsigned int abbrev_number) const
   {
-    struct abbrev_info search;
-    search.number = abbrev_number;
+    if (auto iter = m_abbrevs.find (abbrev_number);
+       iter != m_abbrevs.end ())
+      return iter->second;
 
-    return (struct abbrev_info *) htab_find_with_hash (m_abbrevs.get (),
-                                                      &search,
-                                                      abbrev_number);
+    return nullptr;
   }
 
   /* Where the abbrev table came from.
@@ -92,15 +96,20 @@ struct abbrev_table
 
 private:
 
-  abbrev_table (sect_offset off, struct dwarf2_section_info *sect);
+  abbrev_table (sect_offset off, struct dwarf2_section_info *sect)
+    : sect_off (off),
+      section (sect)
+  {
+  }
 
   DISABLE_COPY_AND_ASSIGN (abbrev_table);
 
   /* Add an abbreviation to the table.  */
-  void add_abbrev (struct abbrev_info *abbrev);
+  void add_abbrev (struct abbrev_info *abbrev)
+  { m_abbrevs.emplace (abbrev->number, abbrev); }
 
   /* Hash table of abbrevs.  */
-  htab_up m_abbrevs;
+  gdb::unordered_map<int, abbrev_info *> m_abbrevs;
 
   /* Storage for the abbrev table.  */
   auto_obstack m_abbrev_obstack;