From: Simon Marchi Date: Mon, 19 Aug 2024 15:03:51 +0000 (+0000) Subject: Convert abbrevs to new hash table X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c2dfac7b848822a6382e85a0233f58433ce57dee;p=thirdparty%2Fbinutils-gdb.git Convert abbrevs to new hash table This converts the DWARF abbrevs themselves to use the new hash table. Change-Id: I0320a733ecefe2cffeb25c068f17322dd3ab23e2 Co-Authored-By: Tom Tromey --- diff --git a/gdb/dwarf2/abbrev.c b/gdb/dwarf2/abbrev.c index 359a0094872..cf523b11da7 100644 --- a/gdb/dwarf2/abbrev.c +++ b/gdb/dwarf2/abbrev.c @@ -29,52 +29,6 @@ #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. */ diff --git a/gdb/dwarf2/abbrev.h b/gdb/dwarf2/abbrev.h index 1fb90fdeafa..fb2e9ecc6d7 100644 --- a/gdb/dwarf2/abbrev.h +++ b/gdb/dwarf2/abbrev.h @@ -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 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 m_abbrevs; /* Storage for the abbrev table. */ auto_obstack m_abbrev_obstack;