gdb/:
authorMaciej W. Rozycki <macro@linux-mips.org>
Thu, 21 Jun 2007 15:18:51 +0000 (15:18 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Thu, 21 Jun 2007 15:18:51 +0000 (15:18 +0000)
* 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().

gdb/ChangeLog
gdb/NEWS
gdb/disasm.c
gdb/disasm.h
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/printcmd.c
gdb/tui/tui-disasm.c

index a32a2ca..dbe57a9 100644 (file)
@@ -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.
index 59c241a..19d7862 100644 (file)
--- a/gdb/NEWS
+++ b/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
index 168d7ee..ed885c6 100644 (file)
@@ -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;
 }
index b96ad30..4dae0ba 100644 (file)
@@ -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
index d3e0cc4..dbd46d6 100644 (file)
@@ -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
index 6edd6a6..fdbacf1 100644 (file)
@@ -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
index b03c65e..45d7e8a 100644 (file)
@@ -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);
index e7bf2d1..a256b5a 100644 (file)
@@ -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));