Detect illegal use of hash symbols in assembler mnemonics.
authorNick Clifton <nickc@redhat.com>
Thu, 17 Jun 1999 02:13:18 +0000 (02:13 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 17 Jun 1999 02:13:18 +0000 (02:13 +0000)
gas/ChangeLog
gas/config/tc-d10v.c

index c35020fbc93f90b4408c3c251ce47b4c051cae6e..fd30072bcc2500eff8808fd0430d4b4c299dc3c9 100644 (file)
@@ -1,3 +1,11 @@
+1999-06-17  Nick Clifton  <nickc@cygnus.com>
+
+       * config/tc-d10v.c (do_not_ignore_hash): New variable.
+       (get_operands): When parsing an expression after an '@' symbol
+       has been detected, do not ignore '#' symbols.
+       (md_operand): Only ignore '#' symbols if do_not_ignore_hash is
+       false. 
+
 1999-06-13  Ian Lance Taylor  <ian@zembu.com>
 
        From K. Richard Pixley <rich@noir.com>:
index bb8ace8230dad81fcfca53deefc75122ccbba18d..6080258b6fb3ffe9b006e2932d701bba2907a0de 100644 (file)
@@ -63,6 +63,8 @@ typedef struct _fixups
 static Fixups FixUps[2];
 static Fixups *fixups;
 
+static int do_not_ignore_hash = 0;
+
 /* True if instruction swapping warnings should be inhibited.  */
 static unsigned char flag_warn_suppress_instructionswap; /* --nowarnswap */
 
@@ -393,7 +395,8 @@ get_operands (exp)
   char *p = input_line_pointer;
   int numops = 0;
   int post = 0;
-
+  int uses_at = 0;
+  
   while (*p)  
     {
       while (*p == ' ' || *p == '\t' || *p == ',') 
@@ -403,6 +406,8 @@ get_operands (exp)
       
       if (*p == '@') 
        {
+         uses_at = 1;
+         
          p++;
          exp[numops].X_op = O_absent;
          if (*p == '(') 
@@ -437,7 +442,20 @@ get_operands (exp)
       if (!register_name (&exp[numops]))
        {
          /* parse as an expression */
-         expression (&exp[numops]);
+         if (uses_at)
+           {
+             /* Any expression that involves the indirect addressing
+                cannot also involve immediate addressing.  Therefore
+                the use of the hash character is illegal.  */
+             int save = do_not_ignore_hash;
+             do_not_ignore_hash = 1;
+             
+             expression (&exp[numops]);
+             
+             do_not_ignore_hash = save;
+           }
+         else
+           expression (&exp[numops]);
        }
 
       if (strncasecmp (input_line_pointer, "@word", 5) == 0)
@@ -1595,7 +1613,7 @@ void
 md_operand (expressionP)
      expressionS *expressionP;
 {
-  if (*input_line_pointer == '#')
+  if (*input_line_pointer == '#' && ! do_not_ignore_hash)
     {
       input_line_pointer++;
       expression (expressionP);