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:
parent
86de1d91ac
commit
1d33d811c7
@ -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.
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user