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