aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2024-11-04 13:27:49 -0500
committerSimon Marchi <simon.marchi@polymtl.ca>2024-11-25 22:07:04 -0500
commitcd1a05c76fcad3766d3802b98d245e663a988497 (patch)
tree2aad47c9eacf3338eb13d24d76576318d7f5a0ed
parent345009bbfb23c5d3f30956dbdd08134935a6279c (diff)
downloadbinutils-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.c46
-rw-r--r--gdb/dwarf2/abbrev.h61
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;