Use libiberty hash in gas/read.c.
authorMartin Liska <mliska@suse.cz>
Sat, 15 Aug 2020 17:47:35 +0000 (19:47 +0200)
committerAlan Modra <amodra@gmail.com>
Thu, 20 Aug 2020 01:26:07 +0000 (10:56 +0930)
* 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.

gas/ChangeLog
gas/config/tc-m68k.c
gas/config/tc-m68k.h
gas/read.c

index e474edd12e489abc10c61b424c90de9bb80b6640..a2da4f987c06d2bc11fe583ffa26eb2b5011bc50 100644 (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>
 
        * config/tc-iq2000.c (iq2000_add_macro): Use htab hash table.
index 6ffc9432855ec080606b182eb40e3d4c09355bc5..6fe3f4a867998bd29bdddbdc85078d69112bb790 100644 (file)
@@ -5560,7 +5560,7 @@ s_proc (int ignore ATTRIBUTE_UNUSED)
    alignment is needed.  */
 
 int
-m68k_conditional_pseudoop (pseudo_typeS *pop)
+m68k_conditional_pseudoop (const pseudo_typeS *pop)
 {
   return (pop->poc_handler == s_mri_if
          || pop->poc_handler == s_mri_else);
index e586eca35c920ab82fcb0a9ba4f430507078fa66..89bf0460f0f8b19235f3eaad8a57839e4a7df1bc 100644 (file)
@@ -47,7 +47,7 @@ extern const char *m68k_comment_chars;
 extern void m68k_mri_mode_change (int);
 #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)
 
 extern void m68k_frob_label (symbolS *);
index cb41cc068524b033a6cd5bb77e5cb6f5e1006d91..a65e56d16f99854ee6e49e96889ab36caaed0e0f 100644 (file)
@@ -295,7 +295,53 @@ address_bytes (void)
 
 /* 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[] = {
   {"abort", s_abort, 0},
@@ -514,14 +560,14 @@ static const char *pop_table_name;
 void
 pop_insert (const pseudo_typeS *table)
 {
-  const char *errtxt;
   const pseudo_typeS *pop;
   for (pop = table; pop->poc_name; pop++)
     {
-      errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
-      if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
-       as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name,
-                 errtxt);
+      int exists = po_entry_find (po_hash, pop->poc_name) != NULL;
+      if (!pop_override_ok && exists)
+       as_fatal (_("error constructing %s pseudo-op table"), pop_table_name);
+      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
 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.  */
   pop_table_name = "md";
@@ -819,7 +866,7 @@ read_a_source_file (const char *name)
   char next_char;
   char *s;             /* String of symbol, '\0' appended.  */
   long temp;
-  pseudo_typeS *pop;
+  const pseudo_typeS *pop;
 
 #ifdef WARN_COMMENTS
   found_comment = 0;
@@ -1069,7 +1116,7 @@ read_a_source_file (const char *name)
                    {
                      /* The MRI assembler uses pseudo-ops without
                         a period.  */
-                     pop = (pseudo_typeS *) hash_find (po_hash, s);
+                     pop = po_entry_find (po_hash, s);
                      if (pop != NULL && pop->poc_handler == NULL)
                        pop = NULL;
                    }
@@ -1084,7 +1131,7 @@ read_a_source_file (const char *name)
                         already know that the pseudo-op begins with a '.'.  */
 
                      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)
                        pop = NULL;
 
@@ -2739,10 +2786,10 @@ s_macro (int ignore ATTRIBUTE_UNUSED)
        }
 
       if (((NO_PSEUDO_DOT || flag_m68k_mri)
-          && hash_find (po_hash, name) != NULL)
+          && po_entry_find (po_hash, name) != NULL)
          || (!flag_m68k_mri
              && *name == '.'
-             && hash_find (po_hash, name + 1) != NULL))
+             && po_entry_find (po_hash, name + 1) != NULL))
        as_warn_where (file,
                 line,
                 _("attempt to redefine pseudo-op `%s' ignored"),
@@ -6128,7 +6175,7 @@ s_ignore (int arg ATTRIBUTE_UNUSED)
 void
 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.