aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/cppexp.c23
-rw-r--r--gcc/cpphash.c12
3 files changed, 35 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b4443a0..f61388a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2000-07-12 Zack Weinberg <zack@wolery.cumb.org>
+
+ * cppexp.c (LOGICAL): Delete macro.
+ (_cpp_parse_expr): Do not use UNARY for unary +. Implement ||
+ and && directly.
+
+ * cpphash.c (HASHSIZE): Increase to 4096.
+ (struct hashdummy): Add hash field.
+ (eq_HASHNODE): Compare unreduced hashes, then lengths, then
+ the string values using memcmp.
+ (cpp_lookup): Set dummy.hash.
+
Wed Jul 12 13:15:16 2000 Marc Espie <espie@openbsd.org>
* configure.in (m88k-openbsd): Express configuration using new fragment
diff --git a/gcc/cppexp.c b/gcc/cppexp.c
index e8ee20e..5f141e2c 100644
--- a/gcc/cppexp.c
+++ b/gcc/cppexp.c
@@ -706,10 +706,6 @@ op_to_prio[] =
top->value = OP v2; \
top->unsignedp = unsigned2; \
top->flags |= HAVE_VALUE;
-#define LOGICAL(OP, NEG) \
- top->value = v1 OP v2; \
- top->unsignedp = 0; \
- if (NEG v1) skip_evaluation--;
#define SHIFT(PSH, MSH) \
if (skip_evaluation) \
break; \
@@ -834,15 +830,18 @@ _cpp_parse_expr (pfile)
case CPP_AND: BITWISE(&); break;
case CPP_XOR: BITWISE(^); break;
case CPP_OR: BITWISE(|); break;
- case CPP_AND_AND: LOGICAL(&&,!); break;
- case CPP_OR_OR: LOGICAL(||,); break;
case CPP_LSHIFT: SHIFT(left_shift, right_shift); break;
case CPP_RSHIFT: SHIFT(right_shift, left_shift); break;
case CPP_PLUS:
if (!(top->flags & HAVE_VALUE))
{
- UNARY(/* + */); /* K+R C doesn't like unary + */
+ /* Can't use UNARY(+) because K+R C did not have unary
+ plus. Can't use UNARY() because some compilers object
+ to the empty argument. */
+ top->value = v2;
+ top->unsignedp = unsigned2;
+ top->flags |= HAVE_VALUE;
}
else
{
@@ -908,6 +907,16 @@ _cpp_parse_expr (pfile)
}
break;
+ case CPP_OR_OR:
+ top->value = v1 || v2;
+ top->unsignedp = 0;
+ if (v1) skip_evaluation--;
+ break;
+ case CPP_AND_AND:
+ top->value = v1 && v2;
+ top->unsignedp = 0;
+ if (!v1) skip_evaluation--;
+ break;
case CPP_COMMA:
if (CPP_PEDANTIC (pfile))
cpp_pedwarn (pfile, "comma operator in operand of #if");
diff --git a/gcc/cpphash.c b/gcc/cpphash.c
index c49ba81..d18a415 100644
--- a/gcc/cpphash.c
+++ b/gcc/cpphash.c
@@ -37,6 +37,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
struct hashdummy
{
const U_CHAR *name;
+ unsigned int hash;
unsigned short length;
};
@@ -49,7 +50,7 @@ struct macro_info
};
/* Initial hash table size. (It can grow if necessary - see hashtab.c.) */
-#define HASHSIZE 500
+#define HASHSIZE 4096
static unsigned int hash_HASHNODE PARAMS ((const void *));
static int eq_HASHNODE PARAMS ((const void *, const void *));
@@ -104,7 +105,7 @@ hash_HASHNODE (x)
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. */
+ the htab_find routines. */
static int
eq_HASHNODE (x, y)
const void *x;
@@ -113,8 +114,9 @@ eq_HASHNODE (x, y)
const cpp_hashnode *a = (const cpp_hashnode *)x;
const struct hashdummy *b = (const struct hashdummy *)y;
- return (a->length == b->length
- && !ustrncmp (a->name, b->name, a->length));
+ return (a->hash == b->hash
+ && a->length == b->length
+ && !memcmp (a->name, b->name, a->length));
}
/* Find the hash node for name "name", of length LEN. */
@@ -132,7 +134,7 @@ cpp_lookup (pfile, name, len)
dummy.name = name;
dummy.length = len;
- hash = _cpp_calc_hash (name, len);
+ dummy.hash = hash = _cpp_calc_hash (name, len);
slot = (cpp_hashnode **)
htab_find_slot_with_hash (pfile->hashtab, (void *)&dummy, hash, INSERT);