diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cppexp.c | 23 | ||||
-rw-r--r-- | gcc/cpphash.c | 12 |
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); |