From 0f94f4c86713deaeb50b72807d88c79849a690e1 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 17 Jun 1999 02:13:18 +0000 Subject: Detect illegal use of hash symbols in assembler mnemonics. --- gas/ChangeLog | 8 ++++++++ gas/config/tc-d10v.c | 24 +++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) (limited to 'gas') diff --git a/gas/ChangeLog b/gas/ChangeLog index c35020f..fd30072 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +1999-06-17 Nick Clifton + + * 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 From K. Richard Pixley : diff --git a/gas/config/tc-d10v.c b/gas/config/tc-d10v.c index bb8ace8..6080258 100644 --- a/gas/config/tc-d10v.c +++ b/gas/config/tc-d10v.c @@ -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); -- cgit v1.1