aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@orcam.me.uk>2025-02-10 22:11:25 +0000
committerMaciej W. Rozycki <macro@orcam.me.uk>2025-02-10 22:11:25 +0000
commit04e94ec07306efebec091e8f2c9a0dfd7ea5613c (patch)
tree9f743474eb71248bd9743c2fb36cace74c0ab707
parent86fec8673dfcc4acba38f7ee6158a3ba72902a3b (diff)
downloadbinutils-04e94ec07306efebec091e8f2c9a0dfd7ea5613c.zip
binutils-04e94ec07306efebec091e8f2c9a0dfd7ea5613c.tar.gz
binutils-04e94ec07306efebec091e8f2c9a0dfd7ea5613c.tar.bz2
MIPS16/GAS: Reject instructions that end with a dot
Fix a regression from commit 3fb49709438e ("MIPS16/GAS: Fix forced size suffixes with argumentless instructions") and reject MIPS16 instructions that end with a dot and no forced size suffix following, e.g.: $ cat test.s .set mips16 foo: break. entry. addiu. $2, 0x7fff addiu. $3, $2, 0 .align 8, 0 $ as -32 -o test.o test.s $ objdump -d test.o test.o: file format elf32-tradbigmips Disassembly of section .text: 00000000 <foo>: 0: e805 break 2: e809 entry 4: f7ef 4a1f addiu v0,32767 8: 4260 addiu v1,v0,0 ... $ Add a test accordingly, also verifying invalid forced size suffixes.
-rw-r--r--gas/config/tc-mips.c11
-rw-r--r--gas/testsuite/gas/mips/mips.exp2
-rw-r--r--gas/testsuite/gas/mips/mips16-insn-length-bad.d3
-rw-r--r--gas/testsuite/gas/mips/mips16-insn-length-bad.l11
-rw-r--r--gas/testsuite/gas/mips/mips16-insn-length-bad.s16
5 files changed, 39 insertions, 4 deletions
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 91be392..c5d36c2 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -14416,10 +14416,13 @@ mips16_ip (char *str, struct mips_cl_insn *insn)
l = 4;
s++;
}
- if (*s == '\0')
- break;
- else if (is_whitespace (*s++))
- break;
+ if (l != 0)
+ {
+ if (*s == '\0')
+ break;
+ else if (is_whitespace (*s++))
+ break;
+ }
set_insn_error (0, _("unrecognized opcode"));
return;
}
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index d3877a0..4e7a587 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -1523,6 +1523,8 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "mips16-sprel-swap"
run_dump_test "mips16-sdrasp"
run_dump_test "mips16-insn-length-noargs"
+ run_dump_test_arches "mips16-insn-length-bad" \
+ [mips_arch_list_matching mips16-32]
run_dump_test "mips16-branch-unextended-1"
run_dump_test "mips16-branch-unextended-2"
diff --git a/gas/testsuite/gas/mips/mips16-insn-length-bad.d b/gas/testsuite/gas/mips/mips16-insn-length-bad.d
new file mode 100644
index 0000000..9e2d3bc
--- /dev/null
+++ b/gas/testsuite/gas/mips/mips16-insn-length-bad.d
@@ -0,0 +1,3 @@
+#as: -32
+#name: MIPS16 bad instruction size override
+#error_output: mips16-insn-length-bad.l
diff --git a/gas/testsuite/gas/mips/mips16-insn-length-bad.l b/gas/testsuite/gas/mips/mips16-insn-length-bad.l
new file mode 100644
index 0000000..b955ea7
--- /dev/null
+++ b/gas/testsuite/gas/mips/mips16-insn-length-bad.l
@@ -0,0 +1,11 @@
+.*: Assembler messages:
+.*:3: Error: unrecognized opcode `break\.'
+.*:4: Error: unrecognized opcode `entry\.'
+.*:5: Error: unrecognized opcode `addiu\. \$2,0x7fff'
+.*:6: Error: unrecognized opcode `addiu\. \$3,\$2,0'
+.*:7: Error: unrecognized opcode `exit\.ex'
+.*:8: Error: unrecognized opcode `exit\.tx'
+.*:9: Error: unrecognized opcode `nop\.ey'
+.*:10: Error: unrecognized opcode `nop\.ty'
+.*:11: Error: unrecognized opcode `li\.ez \$2,0'
+.*:12: Error: unrecognized opcode `li\.tz \$2,0'
diff --git a/gas/testsuite/gas/mips/mips16-insn-length-bad.s b/gas/testsuite/gas/mips/mips16-insn-length-bad.s
new file mode 100644
index 0000000..edff61a
--- /dev/null
+++ b/gas/testsuite/gas/mips/mips16-insn-length-bad.s
@@ -0,0 +1,16 @@
+ .set mips16
+foo:
+ break.
+ entry.
+ addiu. $2, 0x7fff
+ addiu. $3, $2, 0
+ exit.ex
+ exit.tx
+ nop.ey
+ nop.ty
+ li.ez $2, 0
+ li.tz $2, 0
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .align 4, 0
+ .space 16