* expr.h (struct expressionS): Revert last change; widen X_op.
authorRichard Henderson <rth@redhat.com>
Mon, 7 Jun 1999 10:23:47 +0000 (10:23 +0000)
committerRichard Henderson <rth@redhat.com>
Mon, 7 Jun 1999 10:23:47 +0000 (10:23 +0000)
        * config/tc-alpha.c (md_begin): Check the field is wide enough.

gas/ChangeLog
gas/config/tc-alpha.c
gas/expr.h

index d14befe..48c2228 100644 (file)
@@ -1,3 +1,8 @@
+Mon Jun  7 10:22:16 1999  Richard Henderson  <rth@cygnus.com>
+
+       * expr.h (struct expressionS): Revert last change; widen X_op.
+       * config/tc-alpha.c (md_begin): Check the field is wide enough.
+
 Mon Jun  7 11:25:16 1999  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>
 
        * Makefile.am (TARGET_CPU_CFILES): Add config/tc-fr30.c.
index 791f15d..e55a9bc 100644 (file)
@@ -96,8 +96,9 @@ struct alpha_macro
 /* Two extra symbols we want to see in our input.  This is a blatent
    misuse of the expressionS.X_op field.  */
 
-#define O_pregister    (O_max+1)       /* O_register, but in parentheses */
-#define O_cpregister   (O_pregister+1) /* + a leading comma */
+#define O_pregister  ((operatorT) (O_max+1)) /* O_register, in parentheses */
+#define O_cpregister ((operatorT) (O_pregister+1)) /* + a leading comma */
+#define O_alpha_max  ((operatorT) (O_cpregister+1))
 
 /* Macros for extracting the type and number of encoded register tokens */
 
@@ -709,6 +710,13 @@ md_begin ()
 {
   unsigned int i;
 
+  /* Verify that X_op field is wide enough.  */
+  {
+    expressionS e;
+    e.X_op = O_alpha_max;
+    assert (e.X_op == O_alpha_max);
+  }
+
   /* Create the opcode hash table */
 
   alpha_opcode_hash = hash_new ();
index 32a1661..e376409 100644 (file)
@@ -116,8 +116,14 @@ typedef struct expressionS
   symbolS *X_op_symbol;
   /* A number to add.  */
   offsetT X_add_number;
-  /* The type of the expression.  */
-  operatorT X_op;
+  /* The type of the expression.  We can't assume that an arbitrary
+     compiler can handle a bitfield of enum type.  FIXME: We could
+     check this using autoconf.  */
+#ifdef __GNUC__
+  operatorT X_op : 7;
+#else
+  unsigned X_op : 7;
+#endif
   /* Non-zero if X_add_number should be regarded as unsigned.  This is
      only valid for O_constant expressions.  It is only used when an
      O_constant must be extended into a bignum (i.e., it is not used