commit e337843c58d1d5b0e91134c6d3173c97708cb291
parent 9c3251a4af2a09de43b0745569f011101cc5246e
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Mon, 20 Feb 2017 08:43:54 +0100
[cc1] Move labels to a different hash table
Diffstat:
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/cc1/symbol.c b/cc1/symbol.c
@@ -11,13 +11,16 @@ static char sccsid[] = "@(#) ./cc1/symbol.c";
 #include "cc1.h"
 
 #define NR_SYM_HASH 64
+#define NR_CPP_HASH 32
+#define NR_LBL_HASH 16
 
 unsigned curctx;
 static unsigned short counterid;
 
 static Symbol *head, *labels;
 static Symbol *htab[NR_SYM_HASH];
-static Symbol *htabcpp[NR_SYM_HASH];
+static Symbol *htabcpp[NR_CPP_HASH];
+static Symbol *htablbl[NR_LBL_HASH];
 
 #ifndef NDEBUG
 void
@@ -54,15 +57,27 @@ dumpstab(Symbol **tbl, char *msg)
 static Symbol **
 hash(char *s, int ns)
 {
-	unsigned c, h;
+	unsigned c, h, size;
 	Symbol **tab;
 
 	for (h = 0; c = *s; ++s)
 		h = h*33 ^ c;
-	h &= NR_SYM_HASH-1;
 
-	tab = (ns == NS_CPP) ? htabcpp : htab;
-	return &tab[h];
+	switch (ns) {
+	case NS_CPP:
+		tab = htabcpp;
+		size = NR_CPP_HASH-1;
+		break;
+	case NS_LABEL:
+		tab = htablbl;
+		size = NR_LBL_HASH-1;
+		break;
+	default:
+		tab = htab;
+		size = NR_SYM_HASH-1;
+		break;
+	}
+	return &tab[h & size];
 }
 
 static void