Use htab_up in abbrev_table

This changes abbrev_table to use an htab_up rather than an ad hoc,
bucket-based hash table.

2020-02-08  Tom Tromey  <tom@tromey.com>

	* dwarf2/abbrev.c (abbrev_table): Move constructor from header.
	Rewrite.
	(abbrev_table::add_abbrev, abbrev_table::lookup_abbrev): Rewrite.
	* dwarf2/abbrev.h (struct abbrev_info) <next>: Remove.
	(abbrev_table::abbrev_table): No longer inline.
	(ABBREV_HASH_SIZE): Remove.
	(abbrev_table::m_abbrevs): Now an htab_up.

Change-Id: Icbaa8e49501f9c43218d6a81a7e8c4d3a77d65dc
This commit is contained in:
Tom Tromey 2020-02-08 13:40:54 -07:00
parent 86de1d91ac
commit 1d33d811c7
3 changed files with 44 additions and 33 deletions

View File

@ -1,3 +1,13 @@
2020-02-08 Tom Tromey <tom@tromey.com>
* dwarf2/abbrev.c (abbrev_table): Move constructor from header.
Rewrite.
(abbrev_table::add_abbrev, abbrev_table::lookup_abbrev): Rewrite.
* dwarf2/abbrev.h (struct abbrev_info) <next>: Remove.
(abbrev_table::abbrev_table): No longer inline.
(ABBREV_HASH_SIZE): Remove.
(abbrev_table::m_abbrevs): Now an htab_up.
2020-02-08 Tom Tromey <tom@tromey.com>
* dwarf2/read.c (read_cutu_die_from_dwo): Update.

View File

@ -30,6 +30,25 @@
#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;
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
@ -37,6 +56,13 @@
dies from a section we read in all abbreviations and install them
in a hash table. */
abbrev_table::abbrev_table (sect_offset off)
: sect_off (off),
m_abbrevs (htab_create_alloc (20, hash_abbrev, eq_abbrev,
nullptr, xcalloc, xfree))
{
}
/* Allocate space for a struct abbrev_info object in ABBREV_TABLE. */
struct abbrev_info *
@ -56,11 +82,8 @@ void
abbrev_table::add_abbrev (unsigned int abbrev_number,
struct abbrev_info *abbrev)
{
unsigned int hash_number;
hash_number = abbrev_number % ABBREV_HASH_SIZE;
abbrev->next = m_abbrevs[hash_number];
m_abbrevs[hash_number] = abbrev;
void **slot = htab_find_slot (m_abbrevs.get (), abbrev, INSERT);
*slot = abbrev;
}
/* Look up an abbrev in the table.
@ -69,19 +92,10 @@ abbrev_table::add_abbrev (unsigned int abbrev_number,
struct abbrev_info *
abbrev_table::lookup_abbrev (unsigned int abbrev_number)
{
unsigned int hash_number;
struct abbrev_info *abbrev;
struct abbrev_info search;
search.number = abbrev_number;
hash_number = abbrev_number % ABBREV_HASH_SIZE;
abbrev = m_abbrevs[hash_number];
while (abbrev)
{
if (abbrev->number == abbrev_number)
return abbrev;
abbrev = abbrev->next;
}
return NULL;
return (struct abbrev_info *) htab_find (m_abbrevs.get (), &search);
}
/* Read in an abbrev table. */

View File

@ -35,7 +35,6 @@ struct abbrev_info
unsigned short has_children; /* boolean */
unsigned short num_attrs; /* number of attributes */
struct attr_abbrev *attrs; /* an array of attribute descriptions */
struct abbrev_info *next; /* next in chain */
};
struct attr_abbrev
@ -47,9 +46,6 @@ struct attr_abbrev
LONGEST implicit_const;
};
/* Size of abbrev_table.abbrev_hash_table. */
#define ABBREV_HASH_SIZE 121
struct abbrev_table;
typedef std::unique_ptr<struct abbrev_table> abbrev_table_up;
@ -73,13 +69,7 @@ struct abbrev_table
private:
explicit abbrev_table (sect_offset off)
: sect_off (off)
{
m_abbrevs =
XOBNEWVEC (&m_abbrev_obstack, struct abbrev_info *, ABBREV_HASH_SIZE);
memset (m_abbrevs, 0, ABBREV_HASH_SIZE * sizeof (struct abbrev_info *));
}
explicit abbrev_table (sect_offset off);
DISABLE_COPY_AND_ASSIGN (abbrev_table);
@ -90,11 +80,8 @@ private:
/* Add an abbreviation to the table. */
void add_abbrev (unsigned int abbrev_number, struct abbrev_info *abbrev);
/* Hash table of abbrevs.
This is an array of size ABBREV_HASH_SIZE allocated in abbrev_obstack.
It could be statically allocated, but the previous code didn't so we
don't either. */
struct abbrev_info **m_abbrevs;
/* Hash table of abbrevs. */
htab_up m_abbrevs;
/* Storage for the abbrev table. */
auto_obstack m_abbrev_obstack;