gdb/arc: fix print_one_insn selftest
authorAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 16 Nov 2020 15:31:16 +0000 (15:31 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 17 Nov 2020 10:11:51 +0000 (10:11 +0000)
I noticed that the ARC print_one_insn selftest was failing.  The
problem is that in print_one_insn_test the arc case falls through into
the special case that handles nios2, score, and riscv.

The special case for these targets hard codes the breakpoint kind to
'4'.  This is find for bare metal arc (see arc-tdep.c,
arc_sw_breakpoint_from_kind), however, for arc/linux only breakpoint
kind '2' is supported (see arc-linux-tdep.c,
arc_linux_sw_breakpoint_from_kind).

So the code in print_one_insn_test as it is currently written passed
in an invalid breakpoint kind, this leads to GDB trying to disassemble
unexpected memory.

The fix is to reorder the code in print_one_insn_test so that the arc
case falls through into the default case.  In the default we no longer
hard code the breakpoint kind, and everything should be good.

Additionally, given the arc code only expects specific breakpoint kind
values, I thought it would be nice to add some gdb_assert to validate
things.  This assert would have triggered in this case and made it
easier to find the error.

After this commit, configure GDB with --enable-targets=all, then run
gdb.gdb/unittest.exp, there should no longer be any failures.

gdb/ChangeLog:

* arc-linux-tdep.c (arc_linux_sw_breakpoint_from_kind): Add an
assert.
* arc-tdep.c (arc_breakpoint_kind_from_pc): Likewise.
* disasm-selftests.c (print_one_insn_test): Fall throough from ARC
case to the default.

gdb/ChangeLog
gdb/arc-linux-tdep.c
gdb/arc-tdep.c
gdb/disasm-selftests.c

index 214d04814ba2eeba05accd9a48fa1934ec2574af..a887a83e0811c48052685bfcdfa3a832d5984f58 100644 (file)
@@ -1,3 +1,11 @@
+2020-11-17  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * arc-linux-tdep.c (arc_linux_sw_breakpoint_from_kind): Add an
+       assert.
+       * arc-tdep.c (arc_breakpoint_kind_from_pc): Likewise.
+       * disasm-selftests.c (print_one_insn_test): Fall throough from ARC
+       case to the default.
+
 2020-11-17  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * printcmd.c: Include 'safe-ctype.c'.
index 6e74bae80567236f59fbe054d9f4e1844a0bbc1c..ef459bf596f07e0f15d2f781cbe790fea3353a4c 100644 (file)
@@ -149,6 +149,7 @@ static const gdb_byte *
 arc_linux_sw_breakpoint_from_kind (struct gdbarch *gdbarch,
                                   int kind, int *size)
 {
+  gdb_assert (kind == trap_size);
   *size = kind;
   return ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
          ? arc_linux_trap_s_be
index bcc73590087209681796e02d10dd2222e2791c5e..d18d3bcdf2d02c4f59f452305ed86f1733bbda78 100644 (file)
@@ -1634,6 +1634,7 @@ arc_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
 static const gdb_byte *
 arc_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
 {
+  gdb_assert (kind == 2 || kind == 4);
   *size = kind;
 
   if (kind == sizeof (arc_brk_le))
index a24db7f224ff983fa3cc0746e547043243e7ee40..f8f999351a3b6abdc5f79ab3a67ea09a3fff558d 100644 (file)
@@ -69,11 +69,6 @@ print_one_insn_test (struct gdbarch *gdbarch)
       insn = xstormy16_insn;
       len = sizeof (xstormy16_insn);
       break;
-    case bfd_arch_arc:
-      /* PR 21003 */
-      if (gdbarch_bfd_arch_info (gdbarch)->mach == bfd_mach_arc_arc601)
-       return;
-      /* fall through */
     case bfd_arch_nios2:
     case bfd_arch_score:
     case bfd_arch_riscv:
@@ -86,6 +81,11 @@ print_one_insn_test (struct gdbarch *gdbarch)
        len = bplen;
       }
       break;
+    case bfd_arch_arc:
+      /* PR 21003 */
+      if (gdbarch_bfd_arch_info (gdbarch)->mach == bfd_mach_arc_arc601)
+       return;
+      /* fall through */
     default:
       {
        /* Test disassemble breakpoint instruction.  */