overhead pruning on the hashtable lookups
Zack Weinberg
zack@wolery.cumb.org
Sun Apr 30 10:10:00 GMT 2000
This patch removes a special case from the hashtable-lookup code that
was used (by mistake) in only one place. You must now always provide
the length of the token. Also, for slot lookups you must provide the
hash value, rather than have it be passed back in a pointer. Finally,
we now carry around only an int for hash values, not a long, matching
the library interface.
zw
* cppfiles.c (redundant_include_p): Provide length of token to
cpp_defined.
* cpphash.c (_cpp_make_hashnode, _cpp_lookup_slot): Hash
values are unsigned int.
(_cpp_lookup, _cpp_lookup_slot): Do not calculate the length.
(_cpp_lookup_slot): Do not calculate the hash, either.
* cpphash.h: Update prototypes.
* cpplib.c (do_define, do_undef, do_pragma_poison, do_assert):
Hashes are unsigned int. Calculate hash here, pass by value
to _cpp_lookup_slot.
===================================================================
Index: cppfiles.c
--- cppfiles.c 2000/04/18 22:34:09 1.57
+++ cppfiles.c 2000/04/30 17:05:08
@@ -132,7 +132,8 @@ redundant_include_p (pfile, ihash, ilist
included again if the string is the name of a defined macro. */
return (i->control_macro
&& (i->control_macro[0] == '\0'
- || cpp_defined (pfile, i->control_macro, -1)))
+ || cpp_defined (pfile, i->control_macro,
+ strlen (i->control_macro))))
? (IHASH *)-1 : i;
return 0;
===================================================================
Index: cpphash.c
--- cpphash.c 2000/04/30 01:34:00 1.79
+++ cpphash.c 2000/04/30 17:05:09
@@ -246,7 +246,7 @@ _cpp_make_hashnode (name, len, type, has
const U_CHAR *name;
size_t len;
enum node_type type;
- unsigned long hash;
+ unsigned int hash;
{
HASHNODE *hp = (HASHNODE *) xmalloc (sizeof (HASHNODE));
U_CHAR *p = xmalloc (len + 1);
@@ -263,12 +263,8 @@ _cpp_make_hashnode (name, len, type, has
return hp;
}
-/* Find the hash node for name "name", which ends at the first
- non-identifier char.
+/* Find the hash node for name "name", of length LEN. */
- If LEN is >= 0, it is the length of the name.
- Otherwise, compute the length now. */
-
HASHNODE *
_cpp_lookup (pfile, name, len)
cpp_reader *pfile;
@@ -278,12 +274,6 @@ _cpp_lookup (pfile, name, len)
const U_CHAR *bp;
HASHNODE dummy;
- if (len < 0)
- {
- for (bp = name; is_idchar (*bp); bp++);
- len = bp - name;
- }
-
dummy.name = name;
dummy.length = len;
dummy.hash = _cpp_calc_hash (name, len);
@@ -300,30 +290,18 @@ _cpp_lookup_slot (pfile, name, len, inse
const U_CHAR *name;
int len;
enum insert_option insert;
- unsigned long *hash;
+ unsigned int hash;
{
const U_CHAR *bp;
HASHNODE dummy;
- HASHNODE **slot;
-
- if (len < 0)
- {
- for (bp = name; is_idchar (*bp); bp++)
- ;
- len = bp - name;
- }
-
dummy.name = name;
dummy.length = len;
- dummy.hash = _cpp_calc_hash (name, len);
+ dummy.hash = hash;
- slot = (HASHNODE **) htab_find_slot_with_hash (pfile->hashtab,
+ return (HASHNODE **) htab_find_slot_with_hash (pfile->hashtab,
(void *) &dummy,
dummy.hash, insert);
- if (insert)
- *hash = dummy.hash;
- return slot;
}
/* Init the hash table. In here so it can see the hash and eq functions. */
===================================================================
Index: cpphash.h
--- cpphash.h 2000/04/30 01:34:00 1.42
+++ cpphash.h 2000/04/30 17:05:09
@@ -103,7 +103,7 @@ struct ihash
Used for include_next */
struct file_name_list *foundhere;
- unsigned long hash; /* save hash value for future reference */
+ unsigned int hash; /* save hash value for future reference */
const char *nshort; /* name of file as referenced in #include;
points into name[] */
const U_CHAR *control_macro; /* macro, if any, preventing reinclusion -
@@ -212,14 +212,14 @@ extern unsigned char _cpp_IStable[256];
/* In cpphash.c */
extern HASHNODE *_cpp_make_hashnode PARAMS ((const U_CHAR *, size_t,
enum node_type,
- unsigned long));
+ unsigned int));
extern unsigned int _cpp_calc_hash PARAMS ((const U_CHAR *, size_t));
extern HASHNODE *_cpp_lookup PARAMS ((cpp_reader *,
const U_CHAR *, int));
extern HASHNODE **_cpp_lookup_slot PARAMS ((cpp_reader *,
const U_CHAR *, int,
enum insert_option,
- unsigned long *));
+ unsigned int));
extern void _cpp_free_definition PARAMS ((HASHNODE *));
extern int _cpp_create_definition PARAMS ((cpp_reader *,
cpp_toklist *, HASHNODE *));
===================================================================
Index: cpplib.c
--- cpplib.c 2000/04/30 01:34:00 1.158
+++ cpplib.c 2000/04/30 17:05:09
@@ -339,7 +339,7 @@ do_define (pfile)
cpp_reader *pfile;
{
HASHNODE **slot;
- unsigned long hash;
+ unsigned int hash;
int len;
U_CHAR *sym;
cpp_toklist *list = &pfile->directbuf;
@@ -371,7 +371,8 @@ do_define (pfile)
goto out;
}
- slot = _cpp_lookup_slot (pfile, sym, len, INSERT, &hash);
+ hash = _cpp_calc_hash (sym, len);
+ slot = _cpp_lookup_slot (pfile, sym, len, INSERT, hash);
if (*slot)
{
/* Check for poisoned identifiers now. All other checks
@@ -686,6 +687,7 @@ do_undef (pfile)
cpp_reader *pfile;
{
int len;
+ unsigned int hash;
HASHNODE **slot;
U_CHAR *name;
long here = CPP_WRITTEN (pfile);
@@ -713,7 +715,8 @@ do_undef (pfile)
name = pfile->token_buffer + here;
CPP_SET_WRITTEN (pfile, here);
- slot = _cpp_lookup_slot (pfile, name, len, NO_INSERT, 0);
+ hash = _cpp_calc_hash (name, len);
+ slot = _cpp_lookup_slot (pfile, name, len, NO_INSERT, hash);
if (slot)
{
HASHNODE *hp = *slot;
@@ -949,7 +952,7 @@ do_pragma_poison (pfile)
size_t len;
enum cpp_ttype token;
int writeit;
- unsigned long hash;
+ unsigned int hash;
/* As a rule, don't include #pragma poison commands in output,
unless the user asks for them. */
@@ -972,7 +975,8 @@ do_pragma_poison (pfile)
p = pfile->token_buffer + written;
len = CPP_PWRITTEN (pfile) - p;
- slot = _cpp_lookup_slot (pfile, p, len, INSERT, &hash);
+ hash = _cpp_calc_hash (p, len);
+ slot = _cpp_lookup_slot (pfile, p, len, INSERT, hash);
if (*slot)
{
HASHNODE *hp = *slot;
@@ -1507,7 +1511,7 @@ do_assert (pfile)
HASHNODE *base, *this;
HASHNODE **bslot, **tslot;
size_t blen, tlen;
- unsigned long bhash, thash;
+ unsigned int bhash, thash;
old_written = CPP_WRITTEN (pfile); /* remember where it starts */
ret = _cpp_parse_assertion (pfile);
@@ -1528,14 +1532,16 @@ do_assert (pfile)
sym = pfile->token_buffer + old_written;
blen = (U_CHAR *) strchr (sym, '(') - sym;
- tslot = _cpp_lookup_slot (pfile, sym, tlen, INSERT, &thash);
+ thash = _cpp_calc_hash (sym, tlen);
+ tslot = _cpp_lookup_slot (pfile, sym, tlen, INSERT, thash);
if (*tslot)
{
cpp_warning (pfile, "%s re-asserted", sym);
goto error;
}
- bslot = _cpp_lookup_slot (pfile, sym, blen, INSERT, &bhash);
+ bhash = _cpp_calc_hash (sym, blen);
+ bslot = _cpp_lookup_slot (pfile, sym, blen, INSERT, bhash);
if (! *bslot)
{
*bslot = base = _cpp_make_hashnode (sym, blen, T_ASSERT, bhash);
More information about the Gcc-patches
mailing list