Commit 437b9337 by Richard Stallman

(reg_names): Make it static. Use DEBUG_REGISTER_NAMES if that's defined.

(DEBUG_PRINT_REG): Define if not defined.
(print_rtx): Use DEBUG_PRINT_REG for hard regs.

(reg_name): Moved here.
Get rid of RCS headers.  Fix up whitespace and comments.
Make key field and corresponding args `const void *'.
Don't use assert.
Get rid of spurious array-level in node_table field; make it void **.
Declare module_hash_table, class_hash_table.
(hash_int): Divide by sizeof (void *), not by 2**that minus 1.

From-SVN: r2455
parent 584322a4
/* Copyright (C) 1989, 1992 Free Software Foundation, Inc. /* Hash tables for Objective C method dispatch.
Copyright (C) 1992 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -22,64 +23,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -22,64 +23,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
This exception does not however invalidate any other reasons why This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License. */ the executable file might be covered by the GNU General Public License. */
/*
$Header: /home/fsf/rms/c-runtime/dispatch/RCS/hash.h,v 0.12 1992/09/02 01:59:40 rms Exp rms $
$Author: rms $
$Date: 1992/09/02 01:59:40 $
$Log: hash.h,v $
* Revision 0.12 1992/09/02 01:59:40 rms
* Changed the format of various sections to conform with GNU standard.
* Deleted dependencies on some header files.
* Replaced the use of the functions from memory.h with funtions like bzero.
* Changed the include format.
*
* Revision 0.11 1992/08/31 21:15:02 dglattin
* minor documentation changes.
*
* Revision 0.10 1992/08/18 04:46:58 dglattin
* Saving a working version before release.
*
* Revision 0.9 1992/04/13 11:43:08 dennisg
* Check in after array version of run-time works.
* Expect more changes as hash version and other changes are made.
*
* Revision 0.8 1991/12/10 12:05:28 dennisg
* Cleaned up file format for a distribution.
*
* Revision 0.7 1991/12/03 02:01:23 dennisg
* fixed assert macro.
* added memory allocation adjustment macro for hash size allocation.
*
* Revision 0.6 1991/11/24 01:20:02 dennisg
* changed shorts back to ints.
* the efficiency gained didn't out weight the grossness of the code.
*
* Revision 0.5 1991/11/23 22:19:21 dennisg
* converted some entries in the hash structure from ints to shorts.
* this was done to use a less expensive division instruction
* in the hashIndex routine.
*
* Revision 0.4 1991/11/21 22:25:19 dennisg
* deleted hash mask information from hash struct.
* changed hashing algorithm. those values are no longer needed.
*
* Revision 0.3 1991/11/07 23:23:40 dennisg
* implemented hash table expansion as suggested by rms.
*
* Revision 0.2 1991/11/07 22:30:54 dennisg
* added copyleft
*
* Revision 0.1 1991/10/24 00:45:39 dennisg
* Initial check in. Preliminary development stage.
*
*/
#ifndef _hash_INCLUDE_GNU #ifndef __hash_INCLUDE_GNU
#define _hash_INCLUDE_GNU #define __hash_INCLUDE_GNU
#include "assert.h"
#include "mutex.h" #include "mutex.h"
...@@ -88,12 +35,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -88,12 +35,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
* stored in a hash table. Each node holds * stored in a hash table. Each node holds
* a key/value pair. * a key/value pair.
* *
* Items in the cache are really of type void*. * Items in the cache are really of type void *.
*/ */
typedef struct cache_node { typedef struct cache_node
{
struct cache_node *next; /* Pointer to next entry on the list. struct cache_node *next; /* Pointer to next entry on the list.
NULL indicates end of list. */ NULL indicates end of list. */
void *key; /* Key used to locate the value. Used const void *key; /* Key used to locate the value. Used
to locate value when more than one to locate value when more than one
key computes the same hash key computes the same hash
value. */ value. */
...@@ -110,7 +58,7 @@ typedef struct cache_node { ...@@ -110,7 +58,7 @@ typedef struct cache_node {
* typedef. Therefore, to remove compiler warnings the functions passed to * typedef. Therefore, to remove compiler warnings the functions passed to
* hash_new will have to be casted to this type. * hash_new will have to be casted to this type.
*/ */
typedef unsigned int (*hash_func_type)(void*, void*); typedef unsigned int (*hash_func_type)(void *, const void *);
/* /*
* This data type is the function that compares two hash keys and returns an * This data type is the function that compares two hash keys and returns an
...@@ -119,7 +67,7 @@ typedef unsigned int (*hash_func_type)(void*, void*); ...@@ -119,7 +67,7 @@ typedef unsigned int (*hash_func_type)(void*, void*);
* second. * second.
*/ */
typedef int (*compare_func_type)(void*, void*); typedef int (*compare_func_type)(const void *, const void *);
/* /*
...@@ -128,9 +76,10 @@ typedef int (*compare_func_type)(void*, void*); ...@@ -128,9 +76,10 @@ typedef int (*compare_func_type)(void*, void*);
* It must be passed to all of the hashing routines * It must be passed to all of the hashing routines
* (except for new). * (except for new).
*/ */
typedef struct cache { typedef struct cache
{
/* Variables used to implement the hash itself. */ /* Variables used to implement the hash itself. */
node_ptr (*node_table)[]; /* Pointer to an array of hash nodes. */ node_ptr *node_table; /* Pointer to an array of hash nodes. */
/* Variables used to track the size of the hash table so to determine /* Variables used to track the size of the hash table so to determine
when to resize it. */ when to resize it. */
unsigned int size; /* Number of buckets allocated for the hash table unsigned int size; /* Number of buckets allocated for the hash table
...@@ -151,10 +100,14 @@ typedef struct cache { ...@@ -151,10 +100,14 @@ typedef struct cache {
} *cache_ptr; } *cache_ptr;
/* Two important hash tables. */
extern cache_ptr module_hash_table, class_hash_table;
/* Allocate and initialize a hash table. */ /* Allocate and initialize a hash table. */
cache_ptr hash_new (unsigned int size, cache_ptr hash_new (unsigned int size,
hash_func_type hash_func, compare_func_type compare_func); hash_func_type hash_func,
compare_func_type compare_func);
/* Deallocate all of the hash nodes and the cache itself. */ /* Deallocate all of the hash nodes and the cache itself. */
...@@ -165,12 +118,12 @@ void hash_delete (cache_ptr cache); ...@@ -165,12 +118,12 @@ void hash_delete (cache_ptr cache);
assert if the key is already in the hash. */ assert if the key is already in the hash. */
void hash_add (cache_ptr *cachep, void *key, void *value); void hash_add (cache_ptr *cachep, const void *key, void *value);
/* Remove the key/value pair from the hash table. /* Remove the key/value pair from the hash table.
assert if the key isn't in the table. */ assert if the key isn't in the table. */
void hash_remove (cache_ptr cache, void *key); void hash_remove (cache_ptr cache, const void *key);
/* Used to index through the hash table. Start with NULL /* Used to index through the hash table. Start with NULL
to get the first entry. to get the first entry.
...@@ -185,7 +138,7 @@ node_ptr hash_next (cache_ptr cache, node_ptr node); ...@@ -185,7 +138,7 @@ node_ptr hash_next (cache_ptr cache, node_ptr node);
/* Used to return a value from a hash table using a given key. */ /* Used to return a value from a hash table using a given key. */
void *hash_value_for_key (cache_ptr cache, void *key); void *hash_value_for_key (cache_ptr cache, const void *key);
/************************************************ /************************************************
...@@ -197,20 +150,20 @@ void *hash_value_for_key (cache_ptr cache, void *key); ...@@ -197,20 +150,20 @@ void *hash_value_for_key (cache_ptr cache, void *key);
************************************************/ ************************************************/
/* Calculate a hash code by performing some /* Calculate a hash code by performing some
manipulation of the key pointer. */ manipulation of the key pointer. (Use the lowest bits
except for those likely to be 0 due to alignment.) */
static inline unsigned int static inline unsigned int
hash_int (cache_ptr cache, void *key) hash_int (cache_ptr cache, const void *key)
{ {
assert (sizeof (unsigned int) == sizeof (key)); return ((unsigned int)key / sizeof (void *)) & cache->mask;
return ((unsigned int)key >> (sizeof (void *) - 1)) & cache->mask;
} }
/* Calculate a hash code by iterating over a NULL /* Calculate a hash code by iterating over a NULL
terminate string. */ terminate string. */
static inline unsigned int static inline unsigned int
hash_string (cache_ptr cache, void *key) hash_string (cache_ptr cache, const void *key)
{ {
unsigned int ret = 0; unsigned int ret = 0;
unsigned int ctr = 0; unsigned int ctr = 0;
...@@ -227,7 +180,7 @@ hash_string (cache_ptr cache, void *key) ...@@ -227,7 +180,7 @@ hash_string (cache_ptr cache, void *key)
/* Compare two integers. */ /* Compare two integers. */
static inline int static inline int
compare_ints (void *k1, void *k2) compare_ints (const void *k1, const void *k2)
{ {
return !((int)k1 - (int)k2); return !((int)k1 - (int)k2);
} }
...@@ -235,10 +188,10 @@ compare_ints (void *k1, void *k2) ...@@ -235,10 +188,10 @@ compare_ints (void *k1, void *k2)
/* Compare two strings. */ /* Compare two strings. */
static inline int static inline int
compare_strings (void *k1, void *k2) compare_strings (const void *k1, const void *k2)
{ {
return !strcmp (k1, k2); return !strcmp (k1, k2);
} }
#endif /* _hash_INCLUDE_GNU */ #endif /* not __hash_INCLUDE_GNU */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment