Use libiberty hash in gas/read.c.

* read.c (struct po_entry): New.
	(hash_po_entry): Likewise.
	(eq_po_entry): Likewise.
	(po_entry_alloc): Likewise.
	(po_entry_find): Likewise.
	(pop_insert): Likewise.
	(pobegin): Use htab hash table.
	(read_a_source_file): Likewise.
	(s_macro): Likewise.
	(read_print_statistics): Likewise.
	* config/tc-m68k.c (m68k_conditional_pseudoop): Add const qualifier.
	* config/tc-m68k.h (m68k_conditional_pseudoop): Likewise.
This commit is contained in:
Martin Liska
2020-08-15 19:47:35 +02:00
committed by Alan Modra
parent 2b272f449e
commit 32e4c1c2d7
4 changed files with 77 additions and 15 deletions

View File

@ -1,3 +1,18 @@
2020-08-20 Martin Liska <mliska@suse.cz>
* read.c (struct po_entry): New.
(hash_po_entry): Likewise.
(eq_po_entry): Likewise.
(po_entry_alloc): Likewise.
(po_entry_find): Likewise.
(pop_insert): Likewise.
(pobegin): Use htab hash table.
(read_a_source_file): Likewise.
(s_macro): Likewise.
(read_print_statistics): Likewise.
* config/tc-m68k.c (m68k_conditional_pseudoop): Add const qualifier.
* config/tc-m68k.h (m68k_conditional_pseudoop): Likewise.
2020-08-20 Martin Liska <mliska@suse.cz> 2020-08-20 Martin Liska <mliska@suse.cz>
* config/tc-iq2000.c (iq2000_add_macro): Use htab hash table. * config/tc-iq2000.c (iq2000_add_macro): Use htab hash table.

View File

@ -5560,7 +5560,7 @@ s_proc (int ignore ATTRIBUTE_UNUSED)
alignment is needed. */ alignment is needed. */
int int
m68k_conditional_pseudoop (pseudo_typeS *pop) m68k_conditional_pseudoop (const pseudo_typeS *pop)
{ {
return (pop->poc_handler == s_mri_if return (pop->poc_handler == s_mri_if
|| pop->poc_handler == s_mri_else); || pop->poc_handler == s_mri_else);

View File

@ -47,7 +47,7 @@ extern const char *m68k_comment_chars;
extern void m68k_mri_mode_change (int); extern void m68k_mri_mode_change (int);
#define MRI_MODE_CHANGE(i) m68k_mri_mode_change (i) #define MRI_MODE_CHANGE(i) m68k_mri_mode_change (i)
extern int m68k_conditional_pseudoop (pseudo_typeS *); extern int m68k_conditional_pseudoop (const pseudo_typeS *);
#define tc_conditional_pseudoop(pop) m68k_conditional_pseudoop (pop) #define tc_conditional_pseudoop(pop) m68k_conditional_pseudoop (pop)
extern void m68k_frob_label (symbolS *); extern void m68k_frob_label (symbolS *);

View File

@ -295,7 +295,53 @@ address_bytes (void)
/* Set up pseudo-op tables. */ /* Set up pseudo-op tables. */
static struct hash_control *po_hash; struct po_entry
{
const char *poc_name;
const pseudo_typeS *pop;
};
typedef struct po_entry po_entry_t;
/* Hash function for a po_entry. */
static hashval_t
hash_po_entry (const void *e)
{
const po_entry_t *entry = (const po_entry_t *) e;
return htab_hash_string (entry->poc_name);
}
/* Equality function for a po_entry. */
static int
eq_po_entry (const void *a, const void *b)
{
const po_entry_t *ea = (const po_entry_t *) a;
const po_entry_t *eb = (const po_entry_t *) b;
return strcmp (ea->poc_name, eb->poc_name) == 0;
}
static po_entry_t *
po_entry_alloc (const char *poc_name, const pseudo_typeS *pop)
{
po_entry_t *entry = XNEW (po_entry_t);
entry->poc_name = poc_name;
entry->pop = pop;
return entry;
}
static const pseudo_typeS *
po_entry_find (htab_t table, const char *poc_name)
{
po_entry_t needle = { poc_name, NULL };
po_entry_t *entry = htab_find (table, &needle);
return entry != NULL ? entry->pop : NULL;
}
static struct htab *po_hash;
static const pseudo_typeS potable[] = { static const pseudo_typeS potable[] = {
{"abort", s_abort, 0}, {"abort", s_abort, 0},
@ -514,14 +560,14 @@ static const char *pop_table_name;
void void
pop_insert (const pseudo_typeS *table) pop_insert (const pseudo_typeS *table)
{ {
const char *errtxt;
const pseudo_typeS *pop; const pseudo_typeS *pop;
for (pop = table; pop->poc_name; pop++) for (pop = table; pop->poc_name; pop++)
{ {
errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop); int exists = po_entry_find (po_hash, pop->poc_name) != NULL;
if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists"))) if (!pop_override_ok && exists)
as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name, as_fatal (_("error constructing %s pseudo-op table"), pop_table_name);
errtxt); else if (!exists)
htab_insert (po_hash, po_entry_alloc (pop->poc_name, pop));
} }
} }
@ -540,7 +586,8 @@ pop_insert (const pseudo_typeS *table)
static void static void
pobegin (void) pobegin (void)
{ {
po_hash = hash_new (); po_hash = htab_create_alloc (16, hash_po_entry, eq_po_entry, NULL,
xcalloc, xfree);
/* Do the target-specific pseudo ops. */ /* Do the target-specific pseudo ops. */
pop_table_name = "md"; pop_table_name = "md";
@ -819,7 +866,7 @@ read_a_source_file (const char *name)
char next_char; char next_char;
char *s; /* String of symbol, '\0' appended. */ char *s; /* String of symbol, '\0' appended. */
long temp; long temp;
pseudo_typeS *pop; const pseudo_typeS *pop;
#ifdef WARN_COMMENTS #ifdef WARN_COMMENTS
found_comment = 0; found_comment = 0;
@ -1069,7 +1116,7 @@ read_a_source_file (const char *name)
{ {
/* The MRI assembler uses pseudo-ops without /* The MRI assembler uses pseudo-ops without
a period. */ a period. */
pop = (pseudo_typeS *) hash_find (po_hash, s); pop = po_entry_find (po_hash, s);
if (pop != NULL && pop->poc_handler == NULL) if (pop != NULL && pop->poc_handler == NULL)
pop = NULL; pop = NULL;
} }
@ -1084,7 +1131,7 @@ read_a_source_file (const char *name)
already know that the pseudo-op begins with a '.'. */ already know that the pseudo-op begins with a '.'. */
if (pop == NULL) if (pop == NULL)
pop = (pseudo_typeS *) hash_find (po_hash, s + 1); pop = po_entry_find (po_hash, s + 1);
if (pop && !pop->poc_handler) if (pop && !pop->poc_handler)
pop = NULL; pop = NULL;
@ -2739,10 +2786,10 @@ s_macro (int ignore ATTRIBUTE_UNUSED)
} }
if (((NO_PSEUDO_DOT || flag_m68k_mri) if (((NO_PSEUDO_DOT || flag_m68k_mri)
&& hash_find (po_hash, name) != NULL) && po_entry_find (po_hash, name) != NULL)
|| (!flag_m68k_mri || (!flag_m68k_mri
&& *name == '.' && *name == '.'
&& hash_find (po_hash, name + 1) != NULL)) && po_entry_find (po_hash, name + 1) != NULL))
as_warn_where (file, as_warn_where (file,
line, line,
_("attempt to redefine pseudo-op `%s' ignored"), _("attempt to redefine pseudo-op `%s' ignored"),
@ -6128,7 +6175,7 @@ s_ignore (int arg ATTRIBUTE_UNUSED)
void void
read_print_statistics (FILE *file) read_print_statistics (FILE *file)
{ {
hash_print_statistics (file, "pseudo-op table", po_hash); htab_print_statistics (file, "pseudo-op table", po_hash);
} }
/* Inserts the given line into the input stream. /* Inserts the given line into the input stream.