Blame SOURCES/binutils-ppc-hash-insert.patch

b7afb1
diff -rup binutils.orig/gas/config/tc-ppc.c binutils-2.35/gas/config/tc-ppc.c
b7afb1
--- binutils.orig/gas/config/tc-ppc.c	2022-02-03 11:10:42.835719394 +0000
b7afb1
+++ binutils-2.35/gas/config/tc-ppc.c	2022-02-03 11:13:04.298724661 +0000
b7afb1
@@ -1738,12 +1738,12 @@ ppc_setup_opcodes (void)
b7afb1
 
b7afb1
       if ((ppc_cpu & op->flags) != 0
b7afb1
 	  && !(ppc_cpu & op->deprecated))
b7afb1
-	str_hash_insert (ppc_hash, op->name, (void *) op);
b7afb1
+	str_hash_insert_or_replace (ppc_hash, op->name, (void *) op, 0);
b7afb1
     }
b7afb1
 
b7afb1
   if ((ppc_cpu & PPC_OPCODE_ANY) != 0)
b7afb1
     for (op = powerpc_opcodes; op < op_end; op++)
b7afb1
-      str_hash_insert (ppc_hash, op->name, (void *) op);
b7afb1
+      str_hash_insert_or_replace (ppc_hash, op->name, (void *) op, 0);
b7afb1
 
b7afb1
   op_end = prefix_opcodes + prefix_num_opcodes;
b7afb1
   for (op = prefix_opcodes; op < op_end; op++)
b7afb1
@@ -1772,12 +1772,12 @@ ppc_setup_opcodes (void)
b7afb1
 
b7afb1
       if ((ppc_cpu & op->flags) != 0
b7afb1
 	  && !(ppc_cpu & op->deprecated))
b7afb1
-	str_hash_insert (ppc_hash, op->name, (void *) op);
b7afb1
+	str_hash_insert_or_replace (ppc_hash, op->name, (void *) op, 0);
b7afb1
     }
b7afb1
 
b7afb1
   if ((ppc_cpu & PPC_OPCODE_ANY) != 0)
b7afb1
     for (op = prefix_opcodes; op < op_end; op++)
b7afb1
-      str_hash_insert (ppc_hash, op->name, (void *) op);
b7afb1
+      str_hash_insert_or_replace (ppc_hash, op->name, (void *) op, 0);
b7afb1
 
b7afb1
   op_end = vle_opcodes + vle_num_opcodes;
b7afb1
   for (op = vle_opcodes; op < op_end; op++)
b7afb1
@@ -1807,7 +1807,7 @@ ppc_setup_opcodes (void)
b7afb1
 
b7afb1
       if ((ppc_cpu & op->flags) != 0
b7afb1
 	  && !(ppc_cpu & op->deprecated))
b7afb1
-	str_hash_insert (ppc_hash, op->name, (void *) op);
b7afb1
+	str_hash_insert_or_replace (ppc_hash, op->name, (void *) op, 0);
b7afb1
     }
b7afb1
 
b7afb1
   /* SPE2 instructions */
b7afb1
@@ -1841,11 +1841,11 @@ ppc_setup_opcodes (void)
b7afb1
 	    }
b7afb1
 
b7afb1
 	  if ((ppc_cpu & op->flags) != 0 && !(ppc_cpu & op->deprecated))
b7afb1
-	    str_hash_insert (ppc_hash, op->name, (void *) op);
b7afb1
+	    str_hash_insert_or_replace (ppc_hash, op->name, (void *) op, 0);
b7afb1
 	}
b7afb1
 
b7afb1
       for (op = spe2_opcodes; op < op_end; op++)
b7afb1
-	str_hash_insert (ppc_hash, op->name, (void *) op);
b7afb1
+	str_hash_insert_or_replace (ppc_hash, op->name, (void *) op, 0);
b7afb1
     }
b7afb1
 
b7afb1
   /* Insert the macros into a hash table.  */
b7afb1
diff -rup binutils.orig/gas/hash.c binutils-2.35/gas/hash.c
b7afb1
--- binutils.orig/gas/hash.c	2022-02-03 11:10:42.827719448 +0000
b7afb1
+++ binutils-2.35/gas/hash.c	2022-02-03 11:12:00.506175797 +0000
b7afb1
@@ -32,6 +32,24 @@ htab_insert (htab_t htab, PTR element)
b7afb1
   *slot = element;
b7afb1
 }
b7afb1
 
b7afb1
+void **
b7afb1
+htab_insert_or_replace (htab_t htab, void *element, int replace)
b7afb1
+{
b7afb1
+  void **slot = htab_find_slot (htab, element, INSERT);
b7afb1
+  if (*slot != NULL)
b7afb1
+    {
b7afb1
+      if (replace)
b7afb1
+	{
b7afb1
+	  if (htab->del_f)
b7afb1
+	    (*htab->del_f) (*slot);
b7afb1
+	  *slot = element;
b7afb1
+	}
b7afb1
+      return slot;
b7afb1
+    }
b7afb1
+  *slot = element;
b7afb1
+  return NULL;
b7afb1
+}
b7afb1
+
b7afb1
 /* Print statistics about a hash table.  */
b7afb1
 
b7afb1
 void
b7afb1
diff -rup binutils.orig/gas/hash.h binutils-2.35/gas/hash.h
b7afb1
--- binutils.orig/gas/hash.h	2022-02-03 11:10:42.830719428 +0000
b7afb1
+++ binutils-2.35/gas/hash.h	2022-02-03 11:12:25.002002561 +0000
b7afb1
@@ -103,6 +103,19 @@ str_hash_insert (htab_t table, const cha
b7afb1
   htab_insert (table, string_tuple_alloc (key, value));
b7afb1
 }
b7afb1
 
b7afb1
+extern void ** htab_insert_or_replace (htab_t, void *, int);
b7afb1
+
b7afb1
+static inline void **
b7afb1
+str_hash_insert_or_replace (htab_t table, const char *key, void *value, int replace)
b7afb1
+{
b7afb1
+  string_tuple_t *elt = string_tuple_alloc (key, value);
b7afb1
+  void **slot = htab_insert_or_replace (table, elt, replace);
b7afb1
+  if (slot && !replace)
b7afb1
+    free (elt);
b7afb1
+  return slot;
b7afb1
+}
b7afb1
+
b7afb1
+
b7afb1
 static inline htab_t
b7afb1
 str_htab_create (void)
b7afb1
 {