diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2024-11-04 13:27:49 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2024-11-25 22:07:04 -0500 |
commit | cd1a05c76fcad3766d3802b98d245e663a988497 (patch) | |
tree | 2aad47c9eacf3338eb13d24d76576318d7f5a0ed | |
parent | 345009bbfb23c5d3f30956dbdd08134935a6279c (diff) | |
download | binutils-cd1a05c76fcad3766d3802b98d245e663a988497.zip binutils-cd1a05c76fcad3766d3802b98d245e663a988497.tar.gz binutils-cd1a05c76fcad3766d3802b98d245e663a988497.tar.bz2 |
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 <tom@tromey.com>
Approved-By: Tom Tromey <tom@tromey.com>
-rw-r--r-- | gdb/dwarf2/abbrev.c | 46 | ||||
-rw-r--r-- | gdb/dwarf2/abbrev.h | 61 |
2 files changed, 48 insertions, 59 deletions
diff --git a/gdb/dwarf2/abbrev.c b/gdb/dwarf2/abbrev.c index c30db1e..9f7ead8 100644 --- a/gdb/dwarf2/abbrev.c +++ b/gdb/dwarf2/abbrev.c @@ -29,52 +29,6 @@ #include "dwarf2/section.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 7eda951..93e3b90 100644 --- a/gdb/dwarf2/abbrev.h +++ b/gdb/dwarf2/abbrev.h @@ -28,9 +28,8 @@ #define GDB_DWARF2_ABBREV_H #include "dwarf2.h" -#include "gdbsupport/gdb-hashtab.h" #include "gdbsupport/gdb_obstack.h" -#include "hashtab.h" +#include "gdbsupport/unordered_set.h" #include "types.h" struct attr_abbrev @@ -64,7 +63,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 { @@ -78,14 +82,13 @@ struct abbrev_table /* Look up an abbrev in the table. Returns NULL if the abbrev is not found. */ - const struct abbrev_info *lookup_abbrev (unsigned int abbrev_number) const + const 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; - return (struct abbrev_info *) htab_find_with_hash (m_abbrevs.get (), - &search, - abbrev_number); + return nullptr; } /* Where the abbrev table came from. @@ -96,15 +99,47 @@ 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 (const abbrev_info *abbrev) + { m_abbrevs.emplace (abbrev); } + + struct abbrev_info_number_eq + { + using is_transparent = void; + + bool operator() (unsigned int number, + const abbrev_info *abbrev) const noexcept + { return number == abbrev->number; } + + bool operator() (const abbrev_info *lhs, + const abbrev_info *rhs) const noexcept + { return (*this) (lhs->number, rhs); } + }; + + struct abbrev_info_number_hash + { + using is_transparent = void; + + std::size_t operator() (unsigned int number) const noexcept + { return std::hash<unsigned int> () (number); } + + std::size_t operator() (const abbrev_info *abbrev) const noexcept + { return (*this) (abbrev->number); } + + }; - /* Hash table of abbrevs. */ - htab_up m_abbrevs; + /* Hash table of abbrev, identified by their number. */ + gdb::unordered_set<const abbrev_info *, + abbrev_info_number_hash, + abbrev_info_number_eq> + m_abbrevs; /* Storage for the abbrev table. */ auto_obstack m_abbrev_obstack; |