diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2024-08-19 15:03:51 +0000 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2024-08-23 14:37:54 -0400 |
commit | c2dfac7b848822a6382e85a0233f58433ce57dee (patch) | |
tree | f7ce1ad98226d593c4704a74ae7512ff5990dcba | |
parent | 5dafb0e289b73c65dda1c25e3906e039b315818e (diff) | |
download | gdb-c2dfac7b848822a6382e85a0233f58433ce57dee.zip gdb-c2dfac7b848822a6382e85a0233f58433ce57dee.tar.gz gdb-c2dfac7b848822a6382e85a0233f58433ce57dee.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>
-rw-r--r-- | gdb/dwarf2/abbrev.c | 46 | ||||
-rw-r--r-- | gdb/dwarf2/abbrev.h | 29 |
2 files changed, 19 insertions, 56 deletions
diff --git a/gdb/dwarf2/abbrev.c b/gdb/dwarf2/abbrev.c index 359a009..cf523b1 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 1fb90fd..fb2e9ec 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<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; |