public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "Maciej W. Rozycki" <macro@codesourcery.com>
To: Richard Sandiford <rdsandiford@googlemail.com>
Cc: Catherine Moore <clm@codesourcery.com>, binutils@sourceware.org
Subject: [PATCH 13/20] MIPS/GAS: Improve instruction's mnemonic processing
Date: Thu, 02 Dec 2010 19:21:00 -0000	[thread overview]
Message-ID: <alpine.DEB.1.10.1012020129260.14129@tp.orcam.me.uk> (raw)

Hi Richard,

 Following your earlier comment addressing microMIPS code:

On Sun, 23 May 2010, Richard Sandiford wrote:

> Message-ID: <87y6fa9u3t.fsf@firetop.home>

> You could use alloca to create an opcode without the "16" or "32",
> which would make the error-reporting code simpler.  It's best not
> to change the user's source line if we can help it.

I have made a complementing adjustment to original code currently present 
in mips_ip(), making the whole piece much simpler and less fragile.

2010-12-02  Maciej W. Rozycki  <macro@codesourcery.com>

	gas/
	* config/tc-mips.c (mips_ip): Make a copy of the instruction's
	mnemonic and use it for further processing.

 OK to apply?

  Maciej

binutils-gas-mips-ip-insn-copy.diff
Index: binutils-fsf-trunk-quilt/gas/config/tc-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/config/tc-mips.c	2010-12-02 01:48:16.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/config/tc-mips.c	2010-12-02 01:49:28.000000000 +0000
@@ -8642,67 +8642,54 @@ mips_ip (char *str, struct mips_cl_insn 
   unsigned int lastpos = 0;
   unsigned int limlo, limhi;
   char *s_reset;
-  char save_c = 0;
   offsetT min_range, max_range;
+  char *name;
   int argnum;
   unsigned int rtype;
+  char *dot;
+  long end;
 
   insn_error = NULL;
 
+  insn = NULL;
+
   /* If the instruction contains a '.', we first try to match an instruction
      including the '.'.  Then we try again without the '.'.  */
-  insn = NULL;
-  for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
+  for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
     continue;
 
-  /* If we stopped on whitespace, then replace the whitespace with null for
-     the call to hash_find.  Save the character we replaced just in case we
-     have to re-parse the instruction.  */
-  if (ISSPACE (*s))
+  /* Make a copy of the instruction so that we can fiddle with it.  */
+  name = alloca (end + 1);
+  memcpy (name, str, end);
+  name[end] = '\0';
+
+  for (;;)
     {
-      save_c = *s;
-      *s++ = '\0';
-    }
+      insn = (struct mips_opcode *) hash_find (op_hash, name);
 
-  insn = (struct mips_opcode *) hash_find (op_hash, str);
+      if (insn != NULL)
+	break;
 
-  /* If we didn't find the instruction in the opcode table, try again, but
-     this time with just the instruction up to, but not including the
-     first '.'.  */
+      /* If we didn't find the instruction in the opcode table, try again,
+         but this time with just the instruction up to, but not including
+         the first '.'.  */
+      dot = strchr (name, '.');
+      if (dot == NULL)
+	break;
+      *dot = '\0';
+    }
   if (insn == NULL)
     {
-      /* Restore the character we overwrite above (if any).  */
-      if (save_c)
-	*(--s) = save_c;
-
-      /* Scan up to the first '.' or whitespace.  */
-      for (s = str;
-	   *s != '\0' && *s != '.' && !ISSPACE (*s);
-	   ++s)
-	continue;
-
-      /* If we did not find a '.', then we can quit now.  */
-      if (*s != '.')
-	{
-	  insn_error = _("Unrecognized opcode");
-	  return;
-	}
-
-      /* Lookup the instruction in the hash table.  */
-      *s++ = '\0';
-      if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
-	{
-	  insn_error = _("Unrecognized opcode");
-	  return;
-	}
+      insn_error = _("Unrecognized opcode");
+      return;
     }
 
-  argsStart = s;
+  argsStart = s = str + end;
   for (;;)
     {
       bfd_boolean ok;
 
-      gas_assert (strcmp (insn->name, str) == 0);
+      gas_assert (strcmp (insn->name, name) == 0);
 
       ok = is_opcode_valid (insn);
       if (! ok)
@@ -8724,8 +8711,6 @@ mips_ip (char *str, struct mips_cl_insn 
 			   mips_cpu_info_from_isa (mips_opts.isa)->name);
 		  insn_error = buf;
 		}
-	      if (save_c)
-		*(--s) = save_c;
 	      return;
 	    }
 	}
@@ -10114,8 +10099,6 @@ mips_ip (char *str, struct mips_cl_insn 
 	  insn_error = _("Illegal operands");
 	  continue;
 	}
-      if (save_c)
-	*(--argsStart) = save_c;
       insn_error = _("Illegal operands");
       return;
     }

             reply	other threads:[~2010-12-02 19:21 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-02 19:21 Maciej W. Rozycki [this message]
2010-12-07 11:05 ` Richard Sandiford
2010-12-10 18:48   ` Maciej W. Rozycki
2010-12-11 10:36     ` Richard Sandiford
2010-12-11 12:53       ` Maciej W. Rozycki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.1.10.1012020129260.14129@tp.orcam.me.uk \
    --to=macro@codesourcery.com \
    --cc=binutils@sourceware.org \
    --cc=clm@codesourcery.com \
    --cc=rdsandiford@googlemail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).