This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

cpplib: make hash nodes a bit smaller


This patch shrinks the hash node by one pointer, and replaces a
dereference with an offset.

It relies on some poorly documented characteristics of hashtab.c - you
don't have to make the struct you pass to htab_find_slot be the same
as the struct you store in the slot returned, as long as you always
explicitly provide the hash value and never use htab_remove_elt.
cpplib doesn't do either.

Bootstrapped i686-linux.

zw

	* cpphash.h (struct hashnode): Use struct hack for name
	member.
	* cpphash.c (struct hashdummy): New.
	(eq_HASHNODE): Second argument is a hashdummy, not a HASHNODE.
	(make_HASHNODE): No need to set ->name pointer.  Correct
	setting of p.
	(cpp_lookup): Make 'dummy' a struct hashdummy.  Tidy up a bit.

===================================================================
Index: cpphash.h
--- cpphash.h	2000/05/06 20:00:03	1.48
+++ cpphash.h	2000/05/10 19:04:42
@@ -67,7 +67,7 @@ struct hashnode
     struct hashnode *aschain;		/* #assert */
   } value;
 
-  const U_CHAR *name;
+  const U_CHAR name[1];			/* name[length] */
 };
 
 /* List of directories to look for include files in. */
===================================================================
Index: cpphash.c
--- cpphash.c	2000/05/04 04:38:00	1.86
+++ cpphash.c	2000/05/10 19:04:44
@@ -100,6 +100,13 @@ struct funct_defn
   int col;
 };
 
+/* This is the second argument to eq_HASHNODE.  */
+struct hashdummy
+{
+  const U_CHAR *name;
+  unsigned short length;
+};
+
 static unsigned int hash_HASHNODE PARAMS ((const void *));
 static int eq_HASHNODE		  PARAMS ((const void *, const void *));
 static void del_HASHNODE	  PARAMS ((void *));
@@ -147,7 +154,6 @@ struct arglist
   int argc;
 };
 
-
 static struct object_defn *
 collect_objlike_expansion PARAMS ((cpp_reader *, cpp_toklist *));
 static struct funct_defn *
@@ -215,14 +221,19 @@ hash_HASHNODE (x)
   return h->hash;
 }
 
-/* Compare two HASHNODE structures.  */
+/* Compare a HASHNODE structure (already in the table) with a
+   hashdummy structure (not yet in the table).  This relies on the
+   rule that the existing entry is the first argument, the potential
+   entry the second.  It also relies on the comparison function never
+   being called except as a direct consequence of a call to
+   htab_find(_slot)_with_hash.  */
 static int
 eq_HASHNODE (x, y)
      const void *x;
      const void *y;
 {
   const HASHNODE *a = (const HASHNODE *)x;
-  const HASHNODE *b = (const HASHNODE *)y;
+  const struct hashdummy *b = (const struct hashdummy *)y;
 
   return (a->length == b->length
 	  && !ustrncmp (a->name, b->name, a->length));
@@ -249,12 +260,11 @@ make_HASHNODE (name, len, type, hash)
      enum node_type type;
      unsigned int hash;
 {
-  HASHNODE *hp = (HASHNODE *) xmalloc (sizeof (HASHNODE) + len + 1);
-  U_CHAR *p = (U_CHAR *)hp + sizeof (HASHNODE);
+  HASHNODE *hp = (HASHNODE *) xmalloc (sizeof (HASHNODE) + len);
+  U_CHAR *p = (U_CHAR *)hp + offsetof (HASHNODE, name);
 
   hp->type = type;
   hp->length = len;
-  hp->name = p;
   hp->hash = hash;
   hp->disabled = 0;
 
@@ -272,20 +282,20 @@ _cpp_lookup (pfile, name, len)
      const U_CHAR *name;
      int len;
 {
-  HASHNODE dummy;
+  struct hashdummy dummy;
   HASHNODE *new, **slot;
+  unsigned int hash;
 
   dummy.name = name;
   dummy.length = len;
-  dummy.hash = _cpp_calc_hash (name, len);
+  hash = _cpp_calc_hash (name, len);
 
   slot = (HASHNODE **)
-    htab_find_slot_with_hash (pfile->hashtab, (void *)&dummy,
-			      dummy.hash, INSERT);
+    htab_find_slot_with_hash (pfile->hashtab, (void *)&dummy, hash, INSERT);
   if (*slot)
     return *slot;
 
-  new = make_HASHNODE (name, len, T_VOID, dummy.hash);
+  new = make_HASHNODE (name, len, T_VOID, hash);
   new->value.cpval = NULL;
   *slot = new;
   return new;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]