[gdb/tdep] Fix exec check in gdb_print_insn_arm
authorTom de Vries <tdevries@suse.de>
Mon, 13 Sep 2021 18:16:36 +0000 (20:16 +0200)
committerTom de Vries <tdevries@suse.de>
Mon, 13 Sep 2021 18:16:36 +0000 (20:16 +0200)
With a gdb build with --enable-targets=all we run into a KFAIL:
...
KFAIL: gdb.gdb/unittest.exp: executable loaded: maintenance selftest, \
  failed none (PRMS: gdb/27891)
...
due to:
...
Running selftest print_one_insn.^M
Self test failed: arch armv8.1-m.main: self-test failed at \
  disasm-selftests.c:165^M
...

The test fails because we expect disassembling of one arm insn to consume 4
bytes and produce (using verbose = true in disasm-selftests.c):
...
arm mov r0, #0
...
but instead the disassembler uses thumb mode and only consumes 2
bytes and produces:
...
arm movs        r0, r0
...

The failure does not show up in the "no executable loaded" variant because
this code in gdb_print_insn_arm isn't triggered:
...
  if (current_program_space->exec_bfd () != NULL)
    info->flags |= USER_SPECIFIED_MACHINE_TYPE;
...
and consequently we do this in print_insn:
...
      if ((info->flags & USER_SPECIFIED_MACHINE_TYPE) == 0)
        info->mach = bfd_mach_arm_unknown;
...
and don't set force_thumb to true in select_arm_features.

The code in gdb_print_insn_arm makes the assumption that the disassembly
architecture matches the exec architecture, which in this case is incorrect,
because the exec architecture is x86_64, and the disassembly architecture is
armv8.1-m.main.  Fix that by explicitly checking it:
...
  if (current_program_space->exec_bfd () != NULL
      && (current_program_space->exec_bfd ()->arch_info
  == gdbarch_bfd_arch_info (gdbarch)))
...

This fixes the print_one_insn failure, so remove the KFAIL.

Tested on x86_64-linux.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=27891

gdb/arm-tdep.c
gdb/testsuite/gdb.gdb/unittest.exp

index e4e7aec4e1c2604483b1d40fffe66591f09c3e85..ab6999ae2094757de4bbfb4f566f31e4d234357c 100644 (file)
@@ -7727,7 +7727,9 @@ gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
      the assert on the mismatch of info->mach and
      bfd_get_mach (current_program_space->exec_bfd ()) in
      default_print_insn.  */
-  if (current_program_space->exec_bfd () != NULL)
+  if (current_program_space->exec_bfd () != NULL
+      && (current_program_space->exec_bfd ()->arch_info
+         == gdbarch_bfd_arch_info (gdbarch)))
     info->flags |= USER_SPECIFIED_MACHINE_TYPE;
 
   return default_print_insn (memaddr, info);
index 61a6c0efb4bdccb0a257e512758d18833801f857..3622243492cc83cf7874184d67c06f40ea62e25a 100644 (file)
@@ -51,13 +51,6 @@ proc run_selftests { binfile } {
            set num_ran $expect_out(1,string)
            set num_failed $expect_out(2,string)
            gdb_assert "$num_ran > 0" "$test, ran some tests"
-
-           if { $binfile != "" } {
-               # There's a known issue here (see PR gdb/27891),
-               # however, we should not have more than 1 failure.
-               gdb_assert "$num_failed <= 1" "$test, failed no more than 1"
-               setup_kfail "gdb/27891" "*-*-*"
-           }
            gdb_assert "$num_failed == 0" "$test, failed none"
        }
        -re "Selftests have been disabled for this build.\r\n$gdb_prompt $" {