aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2017-08-18 09:30:12 +0100
committerYao Qi <yao.qi@linaro.org>2017-08-18 09:30:12 +0100
commite60eb2880368b4e4752577c626ab0dadf0499cb5 (patch)
tree1b081d218faa8ddb2e6f321a64149a140ed5ccee
parent6d580b635f8963183540b816b20bb9c240154497 (diff)
downloadgdb-e60eb2880368b4e4752577c626ab0dadf0499cb5.zip
gdb-e60eb2880368b4e4752577c626ab0dadf0499cb5.tar.gz
gdb-e60eb2880368b4e4752577c626ab0dadf0499cb5.tar.bz2
[ARM] Mark USER_SPECIFIED_MACHINE_TYPE in disassemble_info.flags
opcodes/arm-dis.c:print_insn may update disassemble_info.mach to bfd_mach_arm_unknown unless USER_SPECIFIED_MACHINE_TYPE is marked. When default_print_insn is called for the first time, disassemble_info.mach is correctly set in GDB, but arm-dis.c:print_insn sets it to bfd_mach_arm_unknown. Then, when default_print_insn is called again (in a loop), it triggers the assert. The patch fixes the assert by marking USER_SPECIFIED_MACHINE_TYPE so that opcodes won't reset disassemble_info.mach. gdb: 2017-08-18 Yao Qi <yao.qi@linaro.org> PR tdep/21818 * arm-tdep.c (gdb_print_insn_arm): Mark USER_SPECIFIED_MACHINE_TYPE if exec_bfd isn't NULL.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/arm-tdep.c8
2 files changed, 14 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2581935..5929091 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2017-08-18 Yao Qi <yao.qi@linaro.org>
+ PR tdep/21818
+ * arm-tdep.c (gdb_print_insn_arm): Mark
+ USER_SPECIFIED_MACHINE_TYPE if exec_bfd isn't NULL.
+
+2017-08-18 Yao Qi <yao.qi@linaro.org>
+
* NEWS: Mention GDBserver's new option "--selftest".
* Makefile.in (SFILES): Remove selftest.c, add common/selftest.c.
* selftest.c: Move it to common/selftest.c.
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index a107584..0c1a0b3 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -7773,6 +7773,14 @@ gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
else
info->symbols = NULL;
+ /* GDB is able to get bfd_mach from the exe_bfd, info->mach is
+ accurate, so mark USER_SPECIFIED_MACHINE_TYPE bit. Otherwise,
+ opcodes/arm-dis.c:print_insn reset info->mach, and it will trigger
+ the assert on the mismatch of info->mach and bfd_get_mach (exec_bfd)
+ in default_print_insn. */
+ if (exec_bfd != NULL)
+ info->flags |= USER_SPECIFIED_MACHINE_TYPE;
+
return default_print_insn (memaddr, info);
}