On Mon, Aug 17, 2020 at 7:06 AM Martin Liška <mli...@suse.cz> wrote: > > Adding libiberty maintainer to CC.
I guess I'm not sure why either of these belong in libiberty. htab_insert can be written elsewhere as needed. And while perhaps some sort of stats API would be reasonable, I don't think it should be something that prints values to a FILE. Ian > On 8/17/20 4:03 PM, Martin Liška wrote: > > Hey. > > > > I'm working on bintuils where I would like to port a hash table > > implementation in gas/hash.[ch] to libiberty one. > > > > But it would be handy for me to add 2 new functions. > > > > Thoughts? > > Thanks, > > Martin > > > > include/ChangeLog: > > > > * hashtab.h (htab_insert): New function. > > (htab_print_statistics): Likewise. > > > > libiberty/ChangeLog: > > > > * hashtab.c (htab_insert): New function. > > (htab_print_statistics): Likewise. > > --- > > include/hashtab.h | 6 ++++++ > > libiberty/hashtab.c | 23 +++++++++++++++++++++++ > > 2 files changed, 29 insertions(+) > > > > diff --git a/include/hashtab.h b/include/hashtab.h > > index 6cca342b989..bcaee909bcf 100644 > > --- a/include/hashtab.h > > +++ b/include/hashtab.h > > @@ -37,6 +37,7 @@ extern "C" { > > #endif /* __cplusplus */ > > > > #include "ansidecl.h" > > +#include <stdio.h> > > > > /* The type for a hash code. */ > > typedef unsigned int hashval_t; > > @@ -172,6 +173,7 @@ extern void ** htab_find_slot (htab_t, const void *, > > enum insert_option); > > extern void * htab_find_with_hash (htab_t, const void *, hashval_t); > > extern void ** htab_find_slot_with_hash (htab_t, const void *, > > hashval_t, enum insert_option); > > +extern void htab_insert (htab_t, void *); > > extern void htab_clear_slot (htab_t, void **); > > extern void htab_remove_elt (htab_t, const void *); > > extern void htab_remove_elt_with_hash (htab_t, const void *, > > hashval_t); > > @@ -183,6 +185,10 @@ extern size_t htab_size (htab_t); > > extern size_t htab_elements (htab_t); > > extern double htab_collisions (htab_t); > > > > +extern void htab_print_statistics (FILE *f, htab_t table, > > + const char *name, > > + const char *prefix); > > + > > /* A hash function for pointers. */ > > extern htab_hash htab_hash_pointer; > > > > diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c > > index 225e9e540a7..fb3152ec9c6 100644 > > --- a/libiberty/hashtab.c > > +++ b/libiberty/hashtab.c > > @@ -704,6 +704,15 @@ htab_find_slot (htab_t htab, const PTR element, enum > > insert_option insert) > > insert); > > } > > > > +/* Insert ELEMENT into HTAB. If the element exists, it is overwritten. */ > > + > > +void > > +htab_insert (htab_t htab, PTR element) > > +{ > > + void **slot = htab_find_slot (htab, element, INSERT); > > + *slot = element; > > +} > > + > > /* 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. */ > > @@ -803,6 +812,20 @@ htab_collisions (htab_t htab) > > return (double) htab->collisions / (double) htab->searches; > > } > > > > +/* Print statistics about a hash table. */ > > + > > +void > > +htab_print_statistics (FILE *f, htab_t table, const char *name, > > + const char *prefix) > > +{ > > + fprintf (f, "%s hash statistics:\n", name); > > + fprintf (f, "%s%u searches\n", prefix, table->searches); > > + fprintf (f, "%s%lu elements\n", prefix, htab_elements (table)); > > + fprintf (f, "%s%lu table size\n", prefix, htab_size (table)); > > + fprintf (f, "%s%.2f collisions per search\n", > > + prefix, htab_collisions (table)); > > +} > > + > > /* Hash P as a null-terminated string. > > > > Copied from gcc/hashtable.c. Zack had the following to say with > > respect >