diff options
-rw-r--r-- | gdb/ChangeLog | 24 | ||||
-rw-r--r-- | gdb/NEWS | 3 | ||||
-rw-r--r-- | gdb/cli/cli-cmds.c | 31 | ||||
-rw-r--r-- | gdb/disasm.c | 39 | ||||
-rw-r--r-- | gdb/disasm.h | 3 | ||||
-rw-r--r-- | gdb/mi/mi-cmd-disas.c | 2 | ||||
-rw-r--r-- | gdb/stack.c | 4 |
7 files changed, 80 insertions, 26 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dd0518a..30896bf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,27 @@ +2009-07-11 Hui Zhu <teawater@gmail.com> + + * cli/cli-cmds.c (disassemble_command): Add a new modifier /r + to "disassemble" command to print the raw instructions in hex as + well as in symbolic form. + (init_cli_cmds): Ditto. + (print_disassembly): Change "mixed" to "flags" to translate + the behavior of disassemble. + (disassemble_current_function): Ditto. + * mi/mi-cmd-disas.c (mi_cmd_disassemble): Ditto. + * stack.c (gdb_disassembly_stub): Ditto. + * disasm.c (do_mixed_source_and_assembly): Ditto. + (do_mixed_source_and_assembly): Ditto. + (do_assembly_only): Ditto. + (gdb_disassembly): Ditto. + (dump_insns): print the raw instructions in hex as well as in + symbolic form if DISASSEMBLY_RAW_INSN and flags is true. + * disasm.h (DISASSEMBLY_SOURCE): Include source code with the + assembly if it and flags is true. + (DISASSEMBLY_RAW_INSN): Include the raw instructions in hex with + the assembly if it and flags is true. + (gdb_disassembly): Update extern. + * NEWS: Document disassemble/r support. + 2009-07-10 Tom Tromey <tromey@redhat.com> * dwarf2-frame.c: Include dwarf2.h, not elf/dwarf2.h. @@ -3,6 +3,9 @@ *** Changes since GDB 6.8 +* "disassemble" command with a /r modifier, print the raw instructions +in hex as well as in symbolic form." + * Process record and replay In a architecture environment that supports ``process record and diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 9c11204..ce7c2a6 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -908,7 +908,7 @@ list_command (char *arg, int from_tty) static void print_disassembly (struct gdbarch *gdbarch, const char *name, - CORE_ADDR low, CORE_ADDR high, int mixed) + CORE_ADDR low, CORE_ADDR high, int flags) { #if defined(TUI) if (!tui_is_window_visible (DISASSEM_WIN)) @@ -922,7 +922,7 @@ print_disassembly (struct gdbarch *gdbarch, const char *name, paddress (gdbarch, low), paddress (gdbarch, high)); /* Dump the specified range. */ - gdb_disassembly (gdbarch, uiout, 0, mixed, -1, low, high); + gdb_disassembly (gdbarch, uiout, 0, flags, -1, low, high); printf_filtered ("End of assembler dump.\n"); gdb_flush (gdb_stdout); @@ -940,7 +940,7 @@ print_disassembly (struct gdbarch *gdbarch, const char *name, MIXED is non-zero to print source with the assembler. */ static void -disassemble_current_function (int mixed) +disassemble_current_function (int flags) { struct frame_info *frame; struct gdbarch *gdbarch; @@ -961,20 +961,21 @@ disassemble_current_function (int mixed) #endif low += gdbarch_deprecated_function_start_offset (gdbarch); - print_disassembly (gdbarch, name, low, high, mixed); + print_disassembly (gdbarch, name, low, high, flags); } /* Dump a specified section of assembly code. Usage: - disassemble [/m] + disassemble [/mr] - dump the assembly code for the function of the current pc - disassemble [/m] addr + disassemble [/mr] addr - dump the assembly code for the function at ADDR - disassemble [/m] low high + disassemble [/mr] low high - dump the assembly code in the range [LOW,HIGH) - A /m modifier will include source code with the assembly. */ + A /m modifier will include source code with the assembly. + A /r modifier will include raw instructions in hex with the assembly. */ static void disassemble_command (char *arg, int from_tty) @@ -984,10 +985,10 @@ disassemble_command (char *arg, int from_tty) char *name; CORE_ADDR pc, pc_masked; char *space_index; - int mixed_source_and_assembly; + int flags; name = NULL; - mixed_source_and_assembly = 0; + flags = 0; if (arg && *arg == '/') { @@ -1001,7 +1002,10 @@ disassemble_command (char *arg, int from_tty) switch (*arg++) { case 'm': - mixed_source_and_assembly = 1; + flags |= DISASSEMBLY_SOURCE; + break; + case 'r': + flags |= DISASSEMBLY_RAW_INSN; break; default: error (_("Invalid disassembly modifier.")); @@ -1014,7 +1018,7 @@ disassemble_command (char *arg, int from_tty) if (! arg || ! *arg) { - disassemble_current_function (mixed_source_and_assembly); + disassemble_current_function (flags); return; } @@ -1044,7 +1048,7 @@ disassemble_command (char *arg, int from_tty) high = parse_and_eval_address (space_index + 1); } - print_disassembly (gdbarch, name, low, high, mixed_source_and_assembly); + print_disassembly (gdbarch, name, low, high, flags); } static void @@ -1454,6 +1458,7 @@ With two args if one is empty it stands for ten lines away from the other arg.") Disassemble a specified section of memory.\n\ Default is the function surrounding the pc of the selected frame.\n\ With a /m modifier, source lines are included (if available).\n\ +With a /r modifier, raw instructions in hex are included.\n\ With a single argument, the function surrounding that address is dumped.\n\ Two arguments are taken as a range of memory to dump.")); set_cmd_completer (c, location_completer); diff --git a/gdb/disasm.c b/gdb/disasm.c index dcb0633..6a1a316 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -88,7 +88,7 @@ static int dump_insns (struct gdbarch *gdbarch, struct ui_out *uiout, struct disassemble_info * di, CORE_ADDR low, CORE_ADDR high, - int how_many, struct ui_stream *stb) + int how_many, int flags, struct ui_stream *stb) { int num_displayed = 0; CORE_ADDR pc; @@ -135,7 +135,23 @@ dump_insns (struct gdbarch *gdbarch, struct ui_out *uiout, xfree (name); ui_file_rewind (stb->stream); - pc += gdbarch_print_insn (gdbarch, pc, di); + if (flags & DISASSEMBLY_RAW_INSN) + { + CORE_ADDR old_pc = pc; + bfd_byte data; + int status; + pc += gdbarch_print_insn (gdbarch, pc, di); + for (;old_pc < pc; old_pc++) + { + status = (*di->read_memory_func) (old_pc, &data, 1, di); + if (status != 0) + (*di->memory_error_func) (status, old_pc, di); + ui_out_message (uiout, 0, " %02x", (unsigned)data); + } + ui_out_text (uiout, "\t"); + } + else + pc += gdbarch_print_insn (gdbarch, pc, di); ui_out_field_stream (uiout, "inst", stb); ui_file_rewind (stb->stream); do_cleanups (ui_out_chain); @@ -154,7 +170,7 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch, struct ui_out *uiout, struct linetable_entry *le, CORE_ADDR low, CORE_ADDR high, struct symtab *symtab, - int how_many, struct ui_stream *stb) + int how_many, int flags, struct ui_stream *stb) { int newlines = 0; struct dis_line_entry *mle; @@ -278,7 +294,7 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch, struct ui_out *uiout, num_displayed += dump_insns (gdbarch, uiout, di, mle[i].start_pc, mle[i].end_pc, - how_many, stb); + how_many, flags, stb); /* When we've reached the end of the mle array, or we've seen the last assembly range for this source line, close out the list/tuple. */ @@ -301,14 +317,15 @@ static void do_assembly_only (struct gdbarch *gdbarch, struct ui_out *uiout, struct disassemble_info * di, CORE_ADDR low, CORE_ADDR high, - int how_many, struct ui_stream *stb) + int how_many, int flags, struct ui_stream *stb) { int num_displayed = 0; struct cleanup *ui_out_chain; ui_out_chain = make_cleanup_ui_out_list_begin_end (uiout, "asm_insns"); - num_displayed = dump_insns (gdbarch, uiout, di, low, high, how_many, stb); + num_displayed = dump_insns (gdbarch, uiout, di, low, high, how_many, + flags, stb); do_cleanups (ui_out_chain); } @@ -356,7 +373,7 @@ gdb_disassemble_info (struct gdbarch *gdbarch, struct ui_file *file) void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout, char *file_string, - int mixed_source_and_assembly, + int flags, int how_many, CORE_ADDR low, CORE_ADDR high) { struct ui_stream *stb = ui_out_stream_new (uiout); @@ -377,13 +394,13 @@ gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout, nlines = symtab->linetable->nitems; } - if (!mixed_source_and_assembly || nlines <= 0 + if (!(flags & DISASSEMBLY_SOURCE) || nlines <= 0 || symtab == NULL || symtab->linetable == NULL) - do_assembly_only (gdbarch, uiout, &di, low, high, how_many, stb); + do_assembly_only (gdbarch, uiout, &di, low, high, how_many, flags, stb); - else if (mixed_source_and_assembly) + else if (flags & DISASSEMBLY_SOURCE) do_mixed_source_and_assembly (gdbarch, uiout, &di, nlines, le, low, - high, symtab, how_many, stb); + high, symtab, how_many, flags, stb); do_cleanups (cleanups); gdb_flush (gdb_stdout); diff --git a/gdb/disasm.h b/gdb/disasm.h index a11280d..a6f6d39 100644 --- a/gdb/disasm.h +++ b/gdb/disasm.h @@ -19,6 +19,9 @@ #ifndef DISASM_H #define DISASM_H +#define DISASSEMBLY_SOURCE (0x1 << 0) +#define DISASSEMBLY_RAW_INSN (0x1 << 1) + struct ui_out; struct ui_file; diff --git a/gdb/mi/mi-cmd-disas.c b/gdb/mi/mi-cmd-disas.c index d63f1ad..e17f38a 100644 --- a/gdb/mi/mi-cmd-disas.c +++ b/gdb/mi/mi-cmd-disas.c @@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char **argv, int argc) gdb_disassembly (gdbarch, uiout, file_string, - mixed_source_and_assembly, how_many, low, high); + DISASSEMBLY_SOURCE, how_many, low, high); } diff --git a/gdb/stack.c b/gdb/stack.c index 3eea0a1..82ac0d4 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -481,7 +481,9 @@ static void gdb_disassembly_stub (void *args) { struct gdb_disassembly_stub_args *p = args; - gdb_disassembly (p->gdbarch, uiout, 0, 0, p->how_many, p->low, p->high); + gdb_disassembly (p->gdbarch, uiout, 0, + DISASSEMBLY_SOURCE | DISASSEMBLY_RAW_INSN, p->how_many, + p->low, p->high); } /* Use TRY_CATCH to catch the exception from the gdb_disassembly |