This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/binutils-2_28-branch] MIPS16/GAS: Fix forced size suffixes with argumentless instructions


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9053e57b9eece4751c8637766ab0b62f83493b1b

commit 9053e57b9eece4751c8637766ab0b62f83493b1b
Author: Maciej W. Rozycki <macro@imgtec.com>
Date:   Fri Dec 23 12:38:35 2016 +0000

    MIPS16/GAS: Fix forced size suffixes with argumentless instructions
    
    Correct the handling of `.e' and `.t' instruction size suffixes with
    instruction mnemonics which are not followed by any text on the same
    line, such as arguments or white space, e.g.:
    
    $ cat test.s
    	.set	mips16
    foo:
    	entry.t		# comment
    	entry.t
    	exit.t		# comment
    	exit.t
    	nop.t		# comment
    	nop.t
    $ as -32 -o test.o test.s
    test.s: Assembler messages:
    test.s:4: Error: unrecognized opcode `entry.t'
    test.s:6: Error: unrecognized opcode `exit.t'
    test.s:8: Error: unrecognized opcode `nop.t'
    $
    
    	gas/
    	* config/tc-mips.c (mips16_ip): Handle `.e' and `.t' instruction
    	suffixes followed by a null character rather than a space too.
    	* testsuite/gas/mips/mips16-insn-length-noargs.d: New test.
    	* testsuite/gas/mips/mips16-insn-length-noargs.s: New test
    	source.
    	* testsuite/gas/mips/mips.exp: Run the new test.
    
    (cherry picked from commit 3fb49709438e204177373646585a76116caf23fb)

Diff:
---
 gas/ChangeLog                                      |  9 ++++++++
 gas/config/tc-mips.c                               | 25 +++++++++++++---------
 gas/testsuite/gas/mips/mips.exp                    |  1 +
 gas/testsuite/gas/mips/mips16-insn-length-noargs.d | 14 ++++++++++++
 gas/testsuite/gas/mips/mips16-insn-length-noargs.s | 12 +++++++++++
 5 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 53fa952..feac41e 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,14 @@
 2016-12-23  Maciej W. Rozycki  <macro@imgtec.com>
 
+	* config/tc-mips.c (mips16_ip): Handle `.e' and `.t' instruction
+	suffixes followed by a null character rather than a space too.
+	* testsuite/gas/mips/mips16-insn-length-noargs.d: New test.
+	* testsuite/gas/mips/mips16-insn-length-noargs.s: New test
+	source.
+	* testsuite/gas/mips/mips.exp: Run the new test.
+
+2016-12-23  Maciej W. Rozycki  <macro@imgtec.com>
+
 	* testsuite/gas/mips/mips16-extend-swap.d: New test.
 	* testsuite/gas/mips/mips16-extend-swap.s: New test source.
 	* testsuite/gas/mips/mips.exp: Run the new test.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index a68e267..7536a5b 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -13857,13 +13857,14 @@ mips16_ip (char *str, struct mips_cl_insn *insn)
   char *end, *s, c;
   struct mips_opcode *first;
   struct mips_operand_token *tokens;
-
-  forced_insn_length = 0;
+  unsigned int l;
 
   for (s = str; ISLOWER (*s); ++s)
     ;
   end = s;
   c = *end;
+
+  l = 0;
   switch (c)
     {
     case '\0':
@@ -13874,23 +13875,27 @@ mips16_ip (char *str, struct mips_cl_insn *insn)
       break;
 
     case '.':
-      if (s[1] == 't' && s[2] == ' ')
+      s++;
+      if (*s == 't')
 	{
-	  forced_insn_length = 2;
-	  s += 3;
-	  break;
+	  l = 2;
+	  s++;
 	}
-      else if (s[1] == 'e' && s[2] == ' ')
+      else if (*s == 'e')
 	{
-	  forced_insn_length = 4;
-	  s += 3;
-	  break;
+	  l = 4;
+	  s++;
 	}
+      if (*s == '\0')
+	break;
+      else if (*s++ == ' ')
+	break;
       /* Fall through.  */
     default:
       set_insn_error (0, _("unrecognized opcode"));
       return;
     }
+  forced_insn_length = l;
 
   *end = 0;
   first = (struct mips_opcode *) hash_find (mips16_op_hash, str);
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index c16891a..a5c722c 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -1344,6 +1344,7 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "mips16-extend-swap"
     run_dump_test "mips16-sprel-swap"
     run_dump_test "mips16-sdrasp"
+    run_dump_test "mips16-insn-length-noargs"
 
     run_dump_test "mips16-branch-unextended-1"
     run_dump_test "mips16-branch-unextended-2"
diff --git a/gas/testsuite/gas/mips/mips16-insn-length-noargs.d b/gas/testsuite/gas/mips/mips16-insn-length-noargs.d
new file mode 100644
index 0000000..1804795
--- /dev/null
+++ b/gas/testsuite/gas/mips/mips16-insn-length-noargs.d
@@ -0,0 +1,14 @@
+#objdump: -d --prefix-addresses --show-raw-insn
+#name: MIPS16 argumentless instruction size override
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> e809      	entry
+[0-9a-f]+ <[^>]*> e809      	entry
+[0-9a-f]+ <[^>]*> ef09      	exit
+[0-9a-f]+ <[^>]*> ef09      	exit
+[0-9a-f]+ <[^>]*> 6500      	nop
+[0-9a-f]+ <[^>]*> 6500      	nop
+	\.\.\.
diff --git a/gas/testsuite/gas/mips/mips16-insn-length-noargs.s b/gas/testsuite/gas/mips/mips16-insn-length-noargs.s
new file mode 100644
index 0000000..b24ff85
--- /dev/null
+++ b/gas/testsuite/gas/mips/mips16-insn-length-noargs.s
@@ -0,0 +1,12 @@
+	.set	mips16
+foo:
+	entry.t		# comment
+	entry.t
+	exit.t		# comment
+	exit.t
+	nop.t		# comment
+	nop.t
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]