aboutsummaryrefslogtreecommitdiff
path: root/gas/macro.h
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-08-15 19:47:01 +0200
committerAlan Modra <amodra@gmail.com>2020-08-20 10:53:40 +0930
commit2b272f449e8664977d0aafba82c416b27b5f2d6f (patch)
tree7ea3e404d7c0b07aeac6fb4f3ae2e142d23fd534 /gas/macro.h
parentabebb03c3af215d7542f5e6b71d78823b15220d5 (diff)
downloadbinutils-2b272f449e8664977d0aafba82c416b27b5f2d6f.zip
binutils-2b272f449e8664977d0aafba82c416b27b5f2d6f.tar.gz
binutils-2b272f449e8664977d0aafba82c416b27b5f2d6f.tar.bz2
Use libiberty hash in gas/macro.c.
* config/tc-iq2000.c (iq2000_add_macro): Use htab hash table. * macro.c (struct hash_control): Use htab. (macro_init): Likewise. (do_formals): Likewise. (free_macro): Likewise. (define_macro): Likewise. (sub_actual): Likewise. (macro_expand_body): Likewise. (macro_expand): Likewise. (check_macro): Likewise. (delete_macro): Likewise. (expand_irp): Likewise. * macro.h (struct macro_hash_entry): New struct. (hash_macro_entry): New. (eq_macro_entry): Likewise. (macro_entry_alloc): Likewise. (macro_entry_find): Likewise. (struct formal_hash_entry): Likewise. (hash_formal_entry): Likewise. (eq_formal_entry): Likewise. (formal_entry_alloc): Likewise. (formal_entry_find): Likewise.
Diffstat (limited to 'gas/macro.h')
-rw-r--r--gas/macro.h94
1 files changed, 92 insertions, 2 deletions
diff --git a/gas/macro.h b/gas/macro.h
index e9bd9e1..532642e 100644
--- a/gas/macro.h
+++ b/gas/macro.h
@@ -63,7 +63,7 @@ typedef struct macro_struct
sb sub; /* Substitution text. */
int formal_count; /* Number of formal args. */
formal_entry *formals; /* Pointer to list of formal_structs. */
- struct hash_control *formal_hash; /* Hash table of formals. */
+ struct htab *formal_hash; /* Hash table of formals. */
const char *name; /* Macro name. */
const char *file; /* File the macro was defined in. */
unsigned int line; /* Line number of definition. */
@@ -79,7 +79,97 @@ extern int macro_nest;
/* The macro hash table. */
-extern struct hash_control *macro_hash;
+extern struct htab *macro_hash;
+
+struct macro_hash_entry
+{
+ const char *name;
+ macro_entry *macro;
+};
+
+typedef struct macro_hash_entry macro_hash_entry_t;
+
+/* Hash function for a macro_hash_entry. */
+
+static inline hashval_t
+hash_macro_entry (const void *e)
+{
+ const macro_hash_entry_t *entry = (const macro_hash_entry_t *) e;
+ return htab_hash_string (entry->name);
+}
+
+/* Equality function for a macro_hash_entry. */
+
+static inline int
+eq_macro_entry (const void *a, const void *b)
+{
+ const macro_hash_entry_t *ea = (const macro_hash_entry_t *) a;
+ const macro_hash_entry_t *eb = (const macro_hash_entry_t *) b;
+
+ return strcmp (ea->name, eb->name) == 0;
+}
+
+static inline macro_hash_entry_t *
+macro_entry_alloc (const char *name, macro_entry *macro)
+{
+ macro_hash_entry_t *entry = XNEW (macro_hash_entry_t);
+ entry->name = name;
+ entry->macro = macro;
+ return entry;
+}
+
+static inline macro_entry *
+macro_entry_find (htab_t table, const char *name)
+{
+ macro_hash_entry_t needle = { name, NULL };
+ macro_hash_entry_t *entry = htab_find (table, &needle);
+ return entry != NULL ? entry->macro : NULL;
+}
+
+struct formal_hash_entry
+{
+ const char *name;
+ formal_entry *formal;
+};
+
+typedef struct formal_hash_entry formal_hash_entry_t;
+
+/* Hash function for a macro_hash_entry. */
+
+static inline hashval_t
+hash_formal_entry (const void *e)
+{
+ const formal_hash_entry_t *entry = (const formal_hash_entry_t *) e;
+ return htab_hash_string (entry->name);
+}
+
+/* Equality function for a formal_hash_entry. */
+
+static inline int
+eq_formal_entry (const void *a, const void *b)
+{
+ const formal_hash_entry_t *ea = (const formal_hash_entry_t *) a;
+ const formal_hash_entry_t *eb = (const formal_hash_entry_t *) b;
+
+ return strcmp (ea->name, eb->name) == 0;
+}
+
+static inline formal_hash_entry_t *
+formal_entry_alloc (const char *name, formal_entry *formal)
+{
+ formal_hash_entry_t *entry = XNEW (formal_hash_entry_t);
+ entry->name = name;
+ entry->formal = formal;
+ return entry;
+}
+
+static inline formal_entry *
+formal_entry_find (htab_t table, const char *name)
+{
+ formal_hash_entry_t needle = { name, NULL };
+ formal_hash_entry_t *entry = htab_find (table, &needle);
+ return entry != NULL ? entry->formal : NULL;
+}
extern int buffer_and_nest (const char *, const char *, sb *,
size_t (*) (sb *));