x86: Avoid abort on invalid broadcast

Print "{bad}" on invalid broadcast instead of abort.

gas/

	PR binutils/28247
	* testsuite/gas/i386/bad-bcast.d: New file.
	* testsuite/gas/i386/bad-bcast.s: Likewise.
	* testsuite/gas/i386/i386.exp: Run bad-bcast.

opcodes/

	PR binutils/28247
	* i386-dis.c (OP_E_memory): Print "{bad}" on invalid broadcast
	instead of abort.
This commit is contained in:
H.J. Lu 2021-08-19 06:38:21 -07:00
parent 8ddf46454a
commit 7e40d574be
4 changed files with 21 additions and 4 deletions

View file

@ -0,0 +1,14 @@
#objdump: -dw
#name: Disassemble bad broadcast
.*: +file format .*
Disassembly of section .text:
0+ <.text>:
+[a-f0-9]+: 62 .byte 0x62
+[a-f0-9]+: c3 ret
+[a-f0-9]+: 8c 1d 66 90 66 90 mov %ds,0x90669066
+[a-f0-9]+: 66 90 xchg %ax,%ax
#pass

View file

@ -0,0 +1,2 @@
.text
.byte 0x62, 0xc3, 0x8c, 0x1d, 0x66, 0x90, 0x66, 0x90, 0x66, 0x90

View file

@ -646,6 +646,7 @@ if [gas_32_check] then {
run_dump_test "dw2-compress-2" run_dump_test "dw2-compress-2"
run_dump_test "dw2-compressed-2" run_dump_test "dw2-compressed-2"
run_dump_test "bad-bcast"
run_dump_test "bad-size" run_dump_test "bad-size"
run_dump_test "size-1" run_dump_test "size-1"

View file

@ -11912,7 +11912,7 @@ OP_E_memory (int bytemode, int sizeflag)
{ {
if (vex.w) if (vex.w)
{ {
abort (); oappend ("{bad}");
} }
else else
{ {
@ -11928,7 +11928,7 @@ OP_E_memory (int bytemode, int sizeflag)
oappend ("{1to32}"); oappend ("{1to32}");
break; break;
default: default:
abort (); oappend ("{bad}");
} }
} }
} }
@ -11948,7 +11948,7 @@ OP_E_memory (int bytemode, int sizeflag)
oappend ("{1to8}"); oappend ("{1to8}");
break; break;
default: default:
abort (); oappend ("{bad}");
} }
} }
else if (bytemode == x_mode else if (bytemode == x_mode
@ -11966,7 +11966,7 @@ OP_E_memory (int bytemode, int sizeflag)
oappend ("{1to16}"); oappend ("{1to16}");
break; break;
default: default:
abort (); oappend ("{bad}");
} }
} }
else else