mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 15:15:42 +00:00
MIPS16/GAS: Reject instructions that end with a dot
Fix a regression from commit 3fb4970943 ("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.
This commit is contained in:
@@ -14416,10 +14416,13 @@ mips16_ip (char *str, struct mips_cl_insn *insn)
|
||||
l = 4;
|
||||
s++;
|
||||
}
|
||||
if (l != 0)
|
||||
{
|
||||
if (*s == '\0')
|
||||
break;
|
||||
else if (is_whitespace (*s++))
|
||||
break;
|
||||
}
|
||||
set_insn_error (0, _("unrecognized opcode"));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
3
gas/testsuite/gas/mips/mips16-insn-length-bad.d
Normal file
3
gas/testsuite/gas/mips/mips16-insn-length-bad.d
Normal file
@@ -0,0 +1,3 @@
|
||||
#as: -32
|
||||
#name: MIPS16 bad instruction size override
|
||||
#error_output: mips16-insn-length-bad.l
|
||||
11
gas/testsuite/gas/mips/mips16-insn-length-bad.l
Normal file
11
gas/testsuite/gas/mips/mips16-insn-length-bad.l
Normal file
@@ -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'
|
||||
16
gas/testsuite/gas/mips/mips16-insn-length-bad.s
Normal file
16
gas/testsuite/gas/mips/mips16-insn-length-bad.s
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user