x86: Avoid abort on invalid broadcast
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 19 Aug 2021 13:38:21 +0000 (06:38 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 19 Aug 2021 14:01:20 +0000 (07:01 -0700)
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.

gas/testsuite/gas/i386/bad-bcast.d [new file with mode: 0644]
gas/testsuite/gas/i386/bad-bcast.s [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp
opcodes/i386-dis.c

diff --git a/gas/testsuite/gas/i386/bad-bcast.d b/gas/testsuite/gas/i386/bad-bcast.d
new file mode 100644 (file)
index 0000000..9fc474a
--- /dev/null
@@ -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
diff --git a/gas/testsuite/gas/i386/bad-bcast.s b/gas/testsuite/gas/i386/bad-bcast.s
new file mode 100644 (file)
index 0000000..e09c3aa
--- /dev/null
@@ -0,0 +1,2 @@
+       .text
+       .byte 0x62, 0xc3, 0x8c, 0x1d, 0x66, 0x90, 0x66, 0x90, 0x66, 0x90
index f5eda2cf3319a7834547551634ff061bbc184a67..80959726d0eb9606ed0c1f97326191bc899c3b65 100644 (file)
@@ -646,6 +646,7 @@ if [gas_32_check] then {
        run_dump_test "dw2-compress-2"
        run_dump_test "dw2-compressed-2"
 
+       run_dump_test "bad-bcast"
        run_dump_test "bad-size"
 
        run_dump_test "size-1"
index 2c7027ca6f17b3a6476e41ccc8653596639da5e0..acb5a0faa88b4a46a705a552bab1c389e204797c 100644 (file)
@@ -11912,7 +11912,7 @@ OP_E_memory (int bytemode, int sizeflag)
         {
           if (vex.w)
             {
-              abort ();
+             oappend ("{bad}");
             }
           else
             {
@@ -11928,7 +11928,7 @@ OP_E_memory (int bytemode, int sizeflag)
                   oappend ("{1to32}");
                   break;
                 default:
-                  abort ();
+                 oappend ("{bad}");
                 }
             }
         }
@@ -11948,7 +11948,7 @@ OP_E_memory (int bytemode, int sizeflag)
              oappend ("{1to8}");
              break;
            default:
-             abort ();
+             oappend ("{bad}");
            }
        }
       else if (bytemode == x_mode
@@ -11966,7 +11966,7 @@ OP_E_memory (int bytemode, int sizeflag)
              oappend ("{1to16}");
              break;
            default:
-             abort ();
+             oappend ("{bad}");
            }
        }
       else