+2007-06-21 Nigel Stephens <nigel@mips.com>
+ Maciej W. Rozycki <macro@mips.com>
+
+ * disasm.c (gdb_print_insn): Return the number of branch delay
+ slot instructions too.
+ * disasm.h (gdb_print_insn): Update prototype.
+ * printcmd.c (branch_delay_insns): New variable to record the
+ number of delay slot instructions after disassembling a branch.
+ (print_formatted): Record the number of branch delay slot
+ instructions.
+ (do_examine): When disassembling, if the last instruction
+ disassembled has any branch delay slots, then bump the count so
+ that they get disassembled too.
+ * tui/tui-disasm.c (tui_disassemble): Update the call to
+ gdb_print_insn().
+ * NEWS: Document the new behaviour.
+
2007-06-21 Andreas Schwab <schwab@suse.de>
* regcache.c (write_pc_pid): Restore missing else.
layout. It also supports a TextSeg= and DataSeg= response when only
segment base addresses (rather than offsets) are available.
+* The /i format now outputs any trailing branch delay slot instructions
+immediately following the last instruction within the count specified.
+
* New commands
set remoteflow
}
/* Print the instruction at address MEMADDR in debugged memory,
- on STREAM. Returns length of the instruction, in bytes. */
+ on STREAM. Returns the length of the instruction, in bytes,
+ and, if requested, the number of branch delay slot instructions. */
int
-gdb_print_insn (CORE_ADDR memaddr, struct ui_file *stream)
+gdb_print_insn (CORE_ADDR memaddr, struct ui_file *stream,
+ int *branch_delay_insns)
{
- struct disassemble_info di = gdb_disassemble_info (current_gdbarch, stream);
- return gdbarch_print_insn (current_gdbarch, memaddr, &di);
+ struct disassemble_info di;
+ int length;
+
+ di = gdb_disassemble_info (current_gdbarch, stream);
+ length = gdbarch_print_insn (current_gdbarch, memaddr, &di);
+ if (branch_delay_insns)
+ {
+ if (di.insn_info_valid)
+ *branch_delay_insns = di.branch_delay_insns;
+ else
+ *branch_delay_insns = 0;
+ }
+ return length;
}
int mixed_source_and_assembly,
int how_many, CORE_ADDR low, CORE_ADDR high);
-/* Print the instruction at address MEMADDR in debugged memory, on
- STREAM. Returns length of the instruction, in bytes. */
+/* Print the instruction at address MEMADDR in debugged memory,
+ on STREAM. Returns the length of the instruction, in bytes,
+ and, if requested, the number of branch delay slot instructions. */
-extern int gdb_print_insn (CORE_ADDR memaddr, struct ui_file *stream);
+extern int gdb_print_insn (CORE_ADDR memaddr,
+ struct ui_file *stream,
+ int *branch_delay_insns);
#endif
+2007-06-21 Maciej W. Rozycki <macro@mips.com>
+
+ * gdb.texinfo (Examining Memory): Document the new behaviour.
+
2007-06-21 Vladimir Prus <vladimir@codesourcery.com>
* gdb.texinfo (Standard Target Features): Document
Even though the unit size @var{u} is ignored for the formats @samp{s}
and @samp{i}, you might still want to use a count @var{n}; for example,
@samp{3i} specifies that you want to see three machine instructions,
-including any operands. The command @code{disassemble} gives an
-alternative way of inspecting machine instructions; see @ref{Machine
-Code,,Source and Machine Code}.
+including any operands. For convenience, especially when used with
+the @code{display} command, the @samp{i} format also prints branch delay
+slot instructions, if any, beyond the count specified, which immediately
+follow the last instruction that is within the count. The command
+@code{disassemble} gives an alternative way of inspecting machine
+instructions; see @ref{Machine Code,,Source and Machine Code}.
All the defaults for the arguments to @code{x} are designed to make it
easy to continue scanning memory with minimal specifications each time
static CORE_ADDR next_address;
+/* Number of delay instructions following current disassembled insn. */
+
+static int branch_delay_insns;
+
/* Last address examined. */
static CORE_ADDR last_examine_address;
/* We often wrap here if there are long symbolic names. */
wrap_here (" ");
- next_address = VALUE_ADDRESS (val)
- + gdb_print_insn (VALUE_ADDRESS (val), stream);
+ next_address = (VALUE_ADDRESS (val)
+ + gdb_print_insn (VALUE_ADDRESS (val), stream,
+ &branch_delay_insns));
break;
default:
release_value (last_examine_value);
print_formatted (last_examine_value, format, size, gdb_stdout);
+
+ /* Display any branch delay slots following the final insn. */
+ if (format == 'i' && count == 1)
+ count += branch_delay_insns;
}
printf_filtered ("\n");
gdb_flush (gdb_stdout);
ui_file_rewind (gdb_dis_out);
- pc = pc + gdb_print_insn (pc, gdb_dis_out);
+ pc = pc + gdb_print_insn (pc, gdb_dis_out, NULL);
asm_lines->insn = xstrdup (tui_file_get_strbuf (gdb_dis_out));