aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>1999-06-17 02:13:18 +0000
committerNick Clifton <nickc@redhat.com>1999-06-17 02:13:18 +0000
commit0f94f4c86713deaeb50b72807d88c79849a690e1 (patch)
tree3bd2a98f4ae947deebaf12892b313adff91cf5a2
parentdf75f1af9c34ff86ef6b18e9f7b5ed81bd4cb21f (diff)
downloadgdb-0f94f4c86713deaeb50b72807d88c79849a690e1.zip
gdb-0f94f4c86713deaeb50b72807d88c79849a690e1.tar.gz
gdb-0f94f4c86713deaeb50b72807d88c79849a690e1.tar.bz2
Detect illegal use of hash symbols in assembler mnemonics.
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-d10v.c24
2 files changed, 29 insertions, 3 deletions
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 <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>:
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);