gdb/:
* 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. gdb/doc/: * gdb.texinfo (Examining Memory): Document the new behaviour. gdb/gdbtk/: * generic/gdbtk-cmds.c (gdbtk_load_asm): Update the call to gdb_print_insn().
This commit is contained in:
parent
ade2871640
commit
a464298641
8 changed files with 65 additions and 13 deletions
|
@ -1,3 +1,20 @@
|
|||
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.
|
||||
|
|
3
gdb/NEWS
3
gdb/NEWS
|
@ -41,6 +41,9 @@ has been rewritten to use the standard GDB remote protocol.
|
|||
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
|
||||
|
|
21
gdb/disasm.c
21
gdb/disasm.c
|
@ -387,11 +387,24 @@ gdb_disassembly (struct ui_out *uiout,
|
|||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
|
|
@ -30,9 +30,12 @@ extern void gdb_disassembly (struct ui_out *uiout,
|
|||
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
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
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
|
||||
|
|
|
@ -5861,9 +5861,12 @@ specifications @samp{4xw} and @samp{4wx} mean exactly the same thing.
|
|||
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
|
||||
|
|
|
@ -70,6 +70,10 @@ static char last_size = 'w';
|
|||
|
||||
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;
|
||||
|
@ -277,8 +281,9 @@ print_formatted (struct value *val, int format, int size,
|
|||
|
||||
/* 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:
|
||||
|
@ -800,6 +805,10 @@ do_examine (struct format_data fmt, CORE_ADDR addr)
|
|||
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);
|
||||
|
|
|
@ -72,7 +72,7 @@ tui_disassemble (struct tui_asm_line* asm_lines, CORE_ADDR pc, int count)
|
|||
|
||||
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));
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue