diff --git a/include/ChangeLog b/include/ChangeLog
index e415afaaf9b5c4860f13fdb4535be33675797e91..4e26bce3b63af6e6512d4cea1aa37573e119333c 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2004-04-13  Jeff Law  <law@redhat.com>
+
+        * hashtab.h (htab_remove_elt_with_hash): Prototype new function.
+
 2004-03-30  Zack Weinberg  <zack@codesourcery.com>
 
 	* hashtab.h, splay-tree.h: Use new shorter form of GTY markers.
diff --git a/include/hashtab.h b/include/hashtab.h
index 1af7368d338bd44cdc462b7ecdb31784c8e70b6b..a2ef32c36ae20de469d2d834924171a6ed026705 100644
--- a/include/hashtab.h
+++ b/include/hashtab.h
@@ -166,6 +166,7 @@ extern PTR     *htab_find_slot_with_hash  PARAMS ((htab_t, const void *,
 						   enum insert_option));
 extern void	htab_clear_slot	PARAMS ((htab_t, void **));
 extern void	htab_remove_elt	PARAMS ((htab_t, void *));
+extern void	htab_remove_elt_with_hash PARAMS ((htab_t, void *, hashval_t));
 
 extern void	htab_traverse	PARAMS ((htab_t, htab_trav, void *));
 extern void	htab_traverse_noresize	PARAMS ((htab_t, htab_trav, void *));
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 661ca4b45b98deb813acfa5236cbcaeaf96d373e..7da2d46d60820fe3385af408385ffa5ca433cbc8 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,8 @@
+2004-04-13  Jeff Law  <law@redhat.com>
+
+	* hashtab.c (htab_remove_elt_with_hash): New function.
+	(htab_remove_elt): Implement in terms of htab_remove_elt_with_hash.
+
 2004-03-31  Richard Henderson  <rth@redhat.com>
 
 	* hashtab.c (htab_size): Move to top of file; mark inline.
diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c
index f7751664f04fd8e83e5db54bf1b05c4d49ac2162..2639428df9c6f9b43162e599d4fad6833d81f991 100644
--- a/libiberty/hashtab.c
+++ b/libiberty/hashtab.c
@@ -599,18 +599,32 @@ htab_find_slot (htab, element, insert)
 				   insert);
 }
 
+/* This function deletes an element with the given value from hash
+   table (the hash is computed from the element).  If there is no matching
+   element in the hash table, this function does nothing.  */
+
+void
+htab_remove_elt (htab, element)
+     htab_t htab;
+     PTR element;
+{
+  htab_remove_elt_with_hash (htab, element, (*htab->hash_f) (element));
+}
+
+
 /* This function deletes an element with the given value from hash
    table.  If there is no matching element in the hash table, this
    function does nothing.  */
 
 void
-htab_remove_elt (htab, element)
+htab_remove_elt_with_hash (htab, element, hash)
      htab_t htab;
      PTR element;
+     hashval_t hash;
 {
   PTR *slot;
 
-  slot = htab_find_slot (htab, element, NO_INSERT);
+  slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT);
   if (*slot == EMPTY_ENTRY)
     return;