mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
This changes the internal representation of string_tuple.value from a void* to an intptr_t, removing any concerns that code wanting to store an integer value will use values that are trap encodings or suchlike for a pointer. The ISO C standard says any void* can be converted to intptr_t and back again and will compare equal to the original pointer. It does *not* say any intptr_t can be converted to void* and back again to get the original integer.. Two new functions, str_hash_find_int and str_hash_insert_int are provided for handling integer values. str_hash_find_int returns (intptr_t) -1 on failing to find the key string. Most target code need minimal changes to use the new interface, but some simplification is possible since now a zero can be stored and differentiated from the NULL "can't find" return. (Yes, that means (intptr_t) -1 can't be stored.) I've changed the avr_no_sreg_hash dummy value to zero, and the loongarch register numbers don't need to be incremented. loongarch also doesn't need to store an empty key string (if it ever did).
120 lines
3.3 KiB
C
120 lines
3.3 KiB
C
/* hash.h -- header file for gas hash table routines
|
|
Copyright (C) 1987-2025 Free Software Foundation, Inc.
|
|
|
|
This file is part of GAS, the GNU Assembler.
|
|
|
|
GAS is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3, or (at your option)
|
|
any later version.
|
|
|
|
GAS is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GAS; see the file COPYING. If not, write to the Free
|
|
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
|
|
02110-1301, USA. */
|
|
|
|
#ifndef HASH_H
|
|
#define HASH_H
|
|
|
|
struct string_tuple
|
|
{
|
|
const char *key;
|
|
intptr_t value;
|
|
};
|
|
|
|
typedef struct string_tuple string_tuple_t;
|
|
|
|
/* Hash function for a string_tuple. */
|
|
|
|
extern hashval_t hash_string_tuple (const void *);
|
|
|
|
/* Equality function for a string_tuple. */
|
|
|
|
extern int eq_string_tuple (const void *, const void *);
|
|
|
|
/* Insert ELEMENT into HTAB. If REPLACE is non-zero existing elements
|
|
are overwritten. If ELEMENT already exists, a pointer to the slot
|
|
is returned. Otherwise NULL is returned. */
|
|
|
|
extern void **htab_insert (htab_t, void * /* element */, int /* replace */);
|
|
|
|
/* Print statistics about a hash table. */
|
|
|
|
extern void htab_print_statistics (FILE *f, const char *name, htab_t table);
|
|
|
|
/* Inline string hash table functions. */
|
|
|
|
static inline string_tuple_t *
|
|
string_tuple_alloc (htab_t table, const char *key, intptr_t value)
|
|
{
|
|
string_tuple_t *tuple = table->alloc_f (1, sizeof (*tuple));
|
|
tuple->key = key;
|
|
tuple->value = value;
|
|
return tuple;
|
|
}
|
|
|
|
static inline void *
|
|
str_hash_find (htab_t table, const char *key)
|
|
{
|
|
string_tuple_t needle = { key, 0 };
|
|
string_tuple_t *tuple = htab_find (table, &needle);
|
|
return tuple != NULL ? (void *) tuple->value : NULL;
|
|
}
|
|
|
|
static inline intptr_t
|
|
str_hash_find_int (htab_t table, const char *key)
|
|
{
|
|
string_tuple_t needle = { key, 0 };
|
|
string_tuple_t *tuple = htab_find (table, &needle);
|
|
return tuple != NULL ? tuple->value : -1;
|
|
}
|
|
|
|
static inline void *
|
|
str_hash_find_n (htab_t table, const char *key, size_t n)
|
|
{
|
|
char *tmp = XNEWVEC (char, n + 1);
|
|
memcpy (tmp, key, n);
|
|
tmp[n] = '\0';
|
|
string_tuple_t needle = { tmp, 0 };
|
|
string_tuple_t *tuple = htab_find (table, &needle);
|
|
free (tmp);
|
|
return tuple != NULL ? (void *) tuple->value : NULL;
|
|
}
|
|
|
|
static inline void
|
|
str_hash_delete (htab_t table, const char *key)
|
|
{
|
|
string_tuple_t needle = { key, 0 };
|
|
htab_remove_elt (table, &needle);
|
|
}
|
|
|
|
static inline void **
|
|
str_hash_insert_int (htab_t table, const char *key, intptr_t value, int replace)
|
|
{
|
|
string_tuple_t *elt = string_tuple_alloc (table, key, value);
|
|
void **slot = htab_insert (table, elt, replace);
|
|
if (slot && !replace && table->free_f)
|
|
table->free_f (elt);
|
|
return slot;
|
|
}
|
|
|
|
static inline void **
|
|
str_hash_insert (htab_t table, const char *key, const void *value, int replace)
|
|
{
|
|
return str_hash_insert_int (table, key, (intptr_t) value, replace);
|
|
}
|
|
|
|
static inline htab_t
|
|
str_htab_create (void)
|
|
{
|
|
return htab_create_alloc (16, hash_string_tuple, eq_string_tuple,
|
|
NULL, notes_calloc, NULL);
|
|
}
|
|
|
|
#endif /* HASH_H */
|