* Add a new modifier /c to "disassemble" command to make it output binary code
@ 2009-07-09 12:22 Hui Zhu
2009-07-09 19:22 ` Tom Tromey
` (3 more replies)
0 siblings, 4 replies; 16+ messages in thread
From: Hui Zhu @ 2009-07-09 12:22 UTC (permalink / raw)
To: gdb-patches ml
[-- Attachment #1: Type: text/plain, Size: 10117 bytes --]
Hi,
The objdump will output the binary code when it works but gdb not.
I make a patch to add a new modifier /c to "disassemble" command to
make it output binary code.
Please help me review it.
Thanks,
Hui
2009-07-09 Hui Zhu <teawater@gmail.com>
* cli/cli-cmds.c (disassemble_command): Add a new modifier /c
to "disassemble" command to make it output binary code.
(init_cli_cmds): Ditto.
(print_disassembly): Add a new argument "code" to make sure
output binary code or not.
(disassemble_current_function): Ditto.
* mi/mi-cmd-disas.c (mi_cmd_disassemble): Ditto.
* stack.c (gdb_disassembly_stub): Ditto.
* disasm.h (gdb_disassembly): Ditto.
* disasm.c (do_mixed_source_and_assembly): Ditto.
(do_mixed_source_and_assembly): Ditto.
(do_assembly_only): Ditto.
(gdb_disassembly): Ditto.
(dump_insns): Output the binary code if "code" is true.
---
cli/cli-cmds.c | 27 +++++++++++++++++----------
disasm.c | 35 ++++++++++++++++++++++++++---------
disasm.h | 3 ++-
mi/mi-cmd-disas.c | 2 +-
stack.c | 2 +-
5 files changed, 47 insertions(+), 22 deletions(-)
--- a/cli/cli-cmds.c
+++ b/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 mixed, int code)
{
#if defined(TUI)
if (!tui_is_window_visible (DISASSEM_WIN))
@@ -922,7 +922,7 @@ print_disassembly (struct gdbarch *gdbar
paddress (gdbarch, low), paddress (gdbarch, high));
/* Dump the specified range. */
- gdb_disassembly (gdbarch, uiout, 0, mixed, -1, low, high);
+ gdb_disassembly (gdbarch, uiout, 0, mixed, -1, code, low, high);
printf_filtered ("End of assembler dump.\n");
gdb_flush (gdb_stdout);
@@ -940,7 +940,7 @@ print_disassembly (struct gdbarch *gdbar
MIXED is non-zero to print source with the assembler. */
static void
-disassemble_current_function (int mixed)
+disassemble_current_function (int mixed, int code)
{
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, mixed, code);
}
/* Dump a specified section of assembly code.
Usage:
- disassemble [/m]
+ disassemble [/mc]
- dump the assembly code for the function of the current pc
- disassemble [/m] addr
+ disassemble [/mc] addr
- dump the assembly code for the function at ADDR
- disassemble [/m] low high
+ disassemble [/mc] 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 /c modifier will include binary code with the assembly. */
static void
disassemble_command (char *arg, int from_tty)
@@ -985,9 +986,11 @@ disassemble_command (char *arg, int from
CORE_ADDR pc, pc_masked;
char *space_index;
int mixed_source_and_assembly;
+ int code;
name = NULL;
mixed_source_and_assembly = 0;
+ code = 0;
if (arg && *arg == '/')
{
@@ -1003,6 +1006,9 @@ disassemble_command (char *arg, int from
case 'm':
mixed_source_and_assembly = 1;
break;
+ case 'c':
+ code = 1;
+ break;
default:
error (_("Invalid disassembly modifier."));
}
@@ -1014,7 +1020,7 @@ disassemble_command (char *arg, int from
if (! arg || ! *arg)
{
- disassemble_current_function (mixed_source_and_assembly);
+ disassemble_current_function (mixed_source_and_assembly, code);
return;
}
@@ -1044,7 +1050,7 @@ disassemble_command (char *arg, int from
high = parse_and_eval_address (space_index + 1);
}
- print_disassembly (gdbarch, name, low, high, mixed_source_and_assembly);
+ print_disassembly (gdbarch, name, low, high,
mixed_source_and_assembly, code);
}
static void
@@ -1453,6 +1459,7 @@ With two args if one is empty it stands
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 /c modifier, binary code 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);
--- a/disasm.c
+++ b/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 code, struct ui_stream *stb)
{
int num_displayed = 0;
CORE_ADDR pc;
@@ -135,7 +135,23 @@ dump_insns (struct gdbarch *gdbarch, str
xfree (name);
ui_file_rewind (stb->stream);
- pc += gdbarch_print_insn (gdbarch, pc, di);
+ if (code)
+ {
+ 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 gdb
struct linetable_entry *le,
CORE_ADDR low, CORE_ADDR high,
struct symtab *symtab,
- int how_many, struct ui_stream *stb)
+ int how_many, int code, struct ui_stream *stb)
{
int newlines = 0;
struct dis_line_entry *mle;
@@ -278,7 +294,7 @@ do_mixed_source_and_assembly (struct gdb
num_displayed += dump_insns (gdbarch, uiout, di,
mle[i].start_pc, mle[i].end_pc,
- how_many, stb);
+ how_many, code, 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 code, 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,
+ code, stb);
do_cleanups (ui_out_chain);
}
@@ -357,7 +374,7 @@ void
gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
char *file_string,
int mixed_source_and_assembly,
- int how_many, CORE_ADDR low, CORE_ADDR high)
+ int how_many, int code, CORE_ADDR low, CORE_ADDR high)
{
struct ui_stream *stb = ui_out_stream_new (uiout);
struct cleanup *cleanups = make_cleanup_ui_out_stream_delete (stb);
@@ -379,11 +396,11 @@ gdb_disassembly (struct gdbarch *gdbarch
if (!mixed_source_and_assembly || 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, code, stb);
else if (mixed_source_and_assembly)
do_mixed_source_and_assembly (gdbarch, uiout, &di, nlines, le, low,
- high, symtab, how_many, stb);
+ high, symtab, how_many, code, stb);
do_cleanups (cleanups);
gdb_flush (gdb_stdout);
--- a/disasm.h
+++ b/disasm.h
@@ -25,7 +25,8 @@ struct ui_file;
extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
char *file_string,
int mixed_source_and_assembly,
- int how_many, CORE_ADDR low, CORE_ADDR high);
+ int how_many, int code, CORE_ADDR low,
+ CORE_ADDR high);
/* Print the instruction at address MEMADDR in debugged memory,
on STREAM. Returns the length of the instruction, in bytes,
--- a/mi/mi-cmd-disas.c
+++ b/mi/mi-cmd-disas.c
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- mixed_source_and_assembly, how_many, low, high);
+ mixed_source_and_assembly, 0, how_many, low, high);
}
--- a/stack.c
+++ b/stack.c
@@ -481,7 +481,7 @@ 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, 0, 1, p->how_many, p->low, p->high);
}
/* Use TRY_CATCH to catch the exception from the gdb_disassembly
2009-07-09 Hui Zhu <teawater@gmail.com>
* gdb.texinfo (disassemble): Add a new modifier /c
to "disassemble" command to make it output binary code.
---
doc/gdb.texinfo | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -6177,10 +6177,11 @@ Variables}).
@cindex machine instructions
@cindex listing machine instructions
@item disassemble
-@itemx disassemble /m
+@itemx disassemble /mc
This specialized command dumps a range of memory as machine
instructions. It can also print mixed source+disassembly by specifying
-the @code{/m} modifier.
+the @code{/m} modifier and print binary code by specifying
+the @code{/c}.
The default memory range is the function surrounding the
program counter of the selected frame. A single argument to this
command is a program counter value; @value{GDBN} dumps the function
[-- Attachment #2: disassemble-output-code.txt --]
[-- Type: text/plain, Size: 8405 bytes --]
---
cli/cli-cmds.c | 27 +++++++++++++++++----------
disasm.c | 35 ++++++++++++++++++++++++++---------
disasm.h | 3 ++-
mi/mi-cmd-disas.c | 2 +-
stack.c | 2 +-
5 files changed, 47 insertions(+), 22 deletions(-)
--- a/cli/cli-cmds.c
+++ b/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 mixed, int code)
{
#if defined(TUI)
if (!tui_is_window_visible (DISASSEM_WIN))
@@ -922,7 +922,7 @@ print_disassembly (struct gdbarch *gdbar
paddress (gdbarch, low), paddress (gdbarch, high));
/* Dump the specified range. */
- gdb_disassembly (gdbarch, uiout, 0, mixed, -1, low, high);
+ gdb_disassembly (gdbarch, uiout, 0, mixed, -1, code, low, high);
printf_filtered ("End of assembler dump.\n");
gdb_flush (gdb_stdout);
@@ -940,7 +940,7 @@ print_disassembly (struct gdbarch *gdbar
MIXED is non-zero to print source with the assembler. */
static void
-disassemble_current_function (int mixed)
+disassemble_current_function (int mixed, int code)
{
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, mixed, code);
}
/* Dump a specified section of assembly code.
Usage:
- disassemble [/m]
+ disassemble [/mc]
- dump the assembly code for the function of the current pc
- disassemble [/m] addr
+ disassemble [/mc] addr
- dump the assembly code for the function at ADDR
- disassemble [/m] low high
+ disassemble [/mc] 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 /c modifier will include binary code with the assembly. */
static void
disassemble_command (char *arg, int from_tty)
@@ -985,9 +986,11 @@ disassemble_command (char *arg, int from
CORE_ADDR pc, pc_masked;
char *space_index;
int mixed_source_and_assembly;
+ int code;
name = NULL;
mixed_source_and_assembly = 0;
+ code = 0;
if (arg && *arg == '/')
{
@@ -1003,6 +1006,9 @@ disassemble_command (char *arg, int from
case 'm':
mixed_source_and_assembly = 1;
break;
+ case 'c':
+ code = 1;
+ break;
default:
error (_("Invalid disassembly modifier."));
}
@@ -1014,7 +1020,7 @@ disassemble_command (char *arg, int from
if (! arg || ! *arg)
{
- disassemble_current_function (mixed_source_and_assembly);
+ disassemble_current_function (mixed_source_and_assembly, code);
return;
}
@@ -1044,7 +1050,7 @@ disassemble_command (char *arg, int from
high = parse_and_eval_address (space_index + 1);
}
- print_disassembly (gdbarch, name, low, high, mixed_source_and_assembly);
+ print_disassembly (gdbarch, name, low, high, mixed_source_and_assembly, code);
}
static void
@@ -1453,6 +1459,7 @@ With two args if one is empty it stands
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 /c modifier, binary code 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);
--- a/disasm.c
+++ b/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 code, struct ui_stream *stb)
{
int num_displayed = 0;
CORE_ADDR pc;
@@ -135,7 +135,23 @@ dump_insns (struct gdbarch *gdbarch, str
xfree (name);
ui_file_rewind (stb->stream);
- pc += gdbarch_print_insn (gdbarch, pc, di);
+ if (code)
+ {
+ 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 gdb
struct linetable_entry *le,
CORE_ADDR low, CORE_ADDR high,
struct symtab *symtab,
- int how_many, struct ui_stream *stb)
+ int how_many, int code, struct ui_stream *stb)
{
int newlines = 0;
struct dis_line_entry *mle;
@@ -278,7 +294,7 @@ do_mixed_source_and_assembly (struct gdb
num_displayed += dump_insns (gdbarch, uiout, di,
mle[i].start_pc, mle[i].end_pc,
- how_many, stb);
+ how_many, code, 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 code, 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,
+ code, stb);
do_cleanups (ui_out_chain);
}
@@ -357,7 +374,7 @@ void
gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
char *file_string,
int mixed_source_and_assembly,
- int how_many, CORE_ADDR low, CORE_ADDR high)
+ int how_many, int code, CORE_ADDR low, CORE_ADDR high)
{
struct ui_stream *stb = ui_out_stream_new (uiout);
struct cleanup *cleanups = make_cleanup_ui_out_stream_delete (stb);
@@ -379,11 +396,11 @@ gdb_disassembly (struct gdbarch *gdbarch
if (!mixed_source_and_assembly || 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, code, stb);
else if (mixed_source_and_assembly)
do_mixed_source_and_assembly (gdbarch, uiout, &di, nlines, le, low,
- high, symtab, how_many, stb);
+ high, symtab, how_many, code, stb);
do_cleanups (cleanups);
gdb_flush (gdb_stdout);
--- a/disasm.h
+++ b/disasm.h
@@ -25,7 +25,8 @@ struct ui_file;
extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
char *file_string,
int mixed_source_and_assembly,
- int how_many, CORE_ADDR low, CORE_ADDR high);
+ int how_many, int code, CORE_ADDR low,
+ CORE_ADDR high);
/* Print the instruction at address MEMADDR in debugged memory,
on STREAM. Returns the length of the instruction, in bytes,
--- a/mi/mi-cmd-disas.c
+++ b/mi/mi-cmd-disas.c
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- mixed_source_and_assembly, how_many, low, high);
+ mixed_source_and_assembly, 0, how_many, low, high);
}
--- a/stack.c
+++ b/stack.c
@@ -481,7 +481,7 @@ 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, 0, 1, p->how_many, p->low, p->high);
}
/* Use TRY_CATCH to catch the exception from the gdb_disassembly
[-- Attachment #3: disassemble-output-code-doc.txt --]
[-- Type: text/plain, Size: 728 bytes --]
---
doc/gdb.texinfo | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -6177,10 +6177,11 @@ Variables}).
@cindex machine instructions
@cindex listing machine instructions
@item disassemble
-@itemx disassemble /m
+@itemx disassemble /mc
This specialized command dumps a range of memory as machine
instructions. It can also print mixed source+disassembly by specifying
-the @code{/m} modifier.
+the @code{/m} modifier and print binary code by specifying
+the @code{/c}.
The default memory range is the function surrounding the
program counter of the selected frame. A single argument to this
command is a program counter value; @value{GDBN} dumps the function
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 12:22 Add a new modifier /c to "disassemble" command to make it output binary code Hui Zhu
@ 2009-07-09 19:22 ` Tom Tromey
2009-07-09 19:40 ` Eli Zaretskii
2009-07-11 9:28 ` Hui Zhu
2009-07-09 19:53 ` Add a new modifier /c to "disassemble" command to make it output binary code Eli Zaretskii
` (2 subsequent siblings)
3 siblings, 2 replies; 16+ messages in thread
From: Tom Tromey @ 2009-07-09 19:22 UTC (permalink / raw)
To: Hui Zhu; +Cc: gdb-patches ml
>>>>> ">" == Hui Zhu <teawater@gmail.com> writes:
>> 2009-07-09 Hui Zhu <teawater@gmail.com>
>> * cli/cli-cmds.c (disassemble_command): Add a new modifier /c
>> to "disassemble" command to make it output binary code.
>> (init_cli_cmds): Ditto.
>> (print_disassembly): Add a new argument "code" to make sure
>> output binary code or not.
>> (disassemble_current_function): Ditto.
>> * mi/mi-cmd-disas.c (mi_cmd_disassemble): Ditto.
>> * stack.c (gdb_disassembly_stub): Ditto.
>> * disasm.h (gdb_disassembly): Ditto.
>> * disasm.c (do_mixed_source_and_assembly): Ditto.
>> (do_mixed_source_and_assembly): Ditto.
>> (do_assembly_only): Ditto.
>> (gdb_disassembly): Ditto.
>> (dump_insns): Output the binary code if "code" is true.
I think this patch looks good.
>> 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 mixed, int code)
I'm slightly more of a fan of the "flags" approach, so that we can
easily add more flags later if we want. But it isn't a big deal.
>> +With a /c modifier, binary code are included.\n\
I think this would be better as:
With a /c modifier, print the instruction in hex as well as
in symbolic form.
(This is what the objdump documentation says, and I think it is
clearer, by virtue of being more explicit.)
>> + ui_out_message (uiout, 0, " %02x", (unsigned)data);
I wasn't sure about ui_out_message, and reading the internals docs was
not really enlightening on the subject. I guess it is probably ok,
but if somebody else knows for sure, I'd like to be better informed.
I think this also needs a change to NEWS. We mention disassemble/m
there, we ought to mention /c as well.
Please fix the help text; and after a doc review, if nobody has
responded about the ui_out_message thing, I will approve this.
Tom
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 19:22 ` Tom Tromey
@ 2009-07-09 19:40 ` Eli Zaretskii
2009-07-11 9:28 ` Hui Zhu
1 sibling, 0 replies; 16+ messages in thread
From: Eli Zaretskii @ 2009-07-09 19:40 UTC (permalink / raw)
To: tromey; +Cc: teawater, gdb-patches
> Cc: gdb-patches ml <gdb-patches@sourceware.org>
> From: Tom Tromey <tromey@redhat.com>
> Date: Thu, 09 Jul 2009 11:42:32 -0600
>
> I think this also needs a change to NEWS. We mention disassemble/m
> there, we ought to mention /c as well.
Yes, definitely.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 12:22 Add a new modifier /c to "disassemble" command to make it output binary code Hui Zhu
2009-07-09 19:22 ` Tom Tromey
@ 2009-07-09 19:53 ` Eli Zaretskii
2009-07-09 22:00 ` Michael Snyder
2009-07-09 23:44 ` Doug Evans
3 siblings, 0 replies; 16+ messages in thread
From: Eli Zaretskii @ 2009-07-09 19:53 UTC (permalink / raw)
To: Hui Zhu; +Cc: gdb-patches
> Date: Thu, 9 Jul 2009 14:35:54 +0800
> From: Hui Zhu <teawater@gmail.com>
>
> +With a /c modifier, binary code are included.\n\
I think you mean "hex dump of machine code", not "binary code". In
any case, "binary code is included", in singular, not plural.
> -@itemx disassemble /m
> +@itemx disassemble /mc
Isn't it better to show that the modifiers are independent? Like
this:
@item disassemble
@itemx disassemble /m
@itemx disassemble /c
> -the @code{/m} modifier.
> +the @code{/m} modifier and print binary code by specifying
> +the @code{/c}.
Again, I think "machine code in hex dump format" is better.
Okay with these changes.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 12:22 Add a new modifier /c to "disassemble" command to make it output binary code Hui Zhu
2009-07-09 19:22 ` Tom Tromey
2009-07-09 19:53 ` Add a new modifier /c to "disassemble" command to make it output binary code Eli Zaretskii
@ 2009-07-09 22:00 ` Michael Snyder
2009-07-09 23:44 ` Doug Evans
3 siblings, 0 replies; 16+ messages in thread
From: Michael Snyder @ 2009-07-09 22:00 UTC (permalink / raw)
To: Hui Zhu; +Cc: gdb-patches ml
How about test suites?
At a minimum, gdb.base/help.exp probably needs an update.
Hui Zhu wrote:
> Hi,
>
> The objdump will output the binary code when it works but gdb not.
> I make a patch to add a new modifier /c to "disassemble" command to
> make it output binary code.
> Please help me review it.
>
> Thanks,
> Hui
>
> 2009-07-09 Hui Zhu <teawater@gmail.com>
>
> * cli/cli-cmds.c (disassemble_command): Add a new modifier /c
> to "disassemble" command to make it output binary code.
> (init_cli_cmds): Ditto.
> (print_disassembly): Add a new argument "code" to make sure
> output binary code or not.
> (disassemble_current_function): Ditto.
> * mi/mi-cmd-disas.c (mi_cmd_disassemble): Ditto.
> * stack.c (gdb_disassembly_stub): Ditto.
> * disasm.h (gdb_disassembly): Ditto.
> * disasm.c (do_mixed_source_and_assembly): Ditto.
> (do_mixed_source_and_assembly): Ditto.
> (do_assembly_only): Ditto.
> (gdb_disassembly): Ditto.
> (dump_insns): Output the binary code if "code" is true.
>
> ---
> cli/cli-cmds.c | 27 +++++++++++++++++----------
> disasm.c | 35 ++++++++++++++++++++++++++---------
> disasm.h | 3 ++-
> mi/mi-cmd-disas.c | 2 +-
> stack.c | 2 +-
> 5 files changed, 47 insertions(+), 22 deletions(-)
>
> --- a/cli/cli-cmds.c
> +++ b/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 mixed, int code)
> {
> #if defined(TUI)
> if (!tui_is_window_visible (DISASSEM_WIN))
> @@ -922,7 +922,7 @@ print_disassembly (struct gdbarch *gdbar
> paddress (gdbarch, low), paddress (gdbarch, high));
>
> /* Dump the specified range. */
> - gdb_disassembly (gdbarch, uiout, 0, mixed, -1, low, high);
> + gdb_disassembly (gdbarch, uiout, 0, mixed, -1, code, low, high);
>
> printf_filtered ("End of assembler dump.\n");
> gdb_flush (gdb_stdout);
> @@ -940,7 +940,7 @@ print_disassembly (struct gdbarch *gdbar
> MIXED is non-zero to print source with the assembler. */
>
> static void
> -disassemble_current_function (int mixed)
> +disassemble_current_function (int mixed, int code)
> {
> 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, mixed, code);
> }
>
> /* Dump a specified section of assembly code.
>
> Usage:
> - disassemble [/m]
> + disassemble [/mc]
> - dump the assembly code for the function of the current pc
> - disassemble [/m] addr
> + disassemble [/mc] addr
> - dump the assembly code for the function at ADDR
> - disassemble [/m] low high
> + disassemble [/mc] 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 /c modifier will include binary code with the assembly. */
>
> static void
> disassemble_command (char *arg, int from_tty)
> @@ -985,9 +986,11 @@ disassemble_command (char *arg, int from
> CORE_ADDR pc, pc_masked;
> char *space_index;
> int mixed_source_and_assembly;
> + int code;
>
> name = NULL;
> mixed_source_and_assembly = 0;
> + code = 0;
>
> if (arg && *arg == '/')
> {
> @@ -1003,6 +1006,9 @@ disassemble_command (char *arg, int from
> case 'm':
> mixed_source_and_assembly = 1;
> break;
> + case 'c':
> + code = 1;
> + break;
> default:
> error (_("Invalid disassembly modifier."));
> }
> @@ -1014,7 +1020,7 @@ disassemble_command (char *arg, int from
>
> if (! arg || ! *arg)
> {
> - disassemble_current_function (mixed_source_and_assembly);
> + disassemble_current_function (mixed_source_and_assembly, code);
> return;
> }
>
> @@ -1044,7 +1050,7 @@ disassemble_command (char *arg, int from
> high = parse_and_eval_address (space_index + 1);
> }
>
> - print_disassembly (gdbarch, name, low, high, mixed_source_and_assembly);
> + print_disassembly (gdbarch, name, low, high,
> mixed_source_and_assembly, code);
> }
>
> static void
> @@ -1453,6 +1459,7 @@ With two args if one is empty it stands
> 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 /c modifier, binary code 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);
> --- a/disasm.c
> +++ b/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 code, struct ui_stream *stb)
> {
> int num_displayed = 0;
> CORE_ADDR pc;
> @@ -135,7 +135,23 @@ dump_insns (struct gdbarch *gdbarch, str
> xfree (name);
>
> ui_file_rewind (stb->stream);
> - pc += gdbarch_print_insn (gdbarch, pc, di);
> + if (code)
> + {
> + 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 gdb
> struct linetable_entry *le,
> CORE_ADDR low, CORE_ADDR high,
> struct symtab *symtab,
> - int how_many, struct ui_stream *stb)
> + int how_many, int code, struct ui_stream *stb)
> {
> int newlines = 0;
> struct dis_line_entry *mle;
> @@ -278,7 +294,7 @@ do_mixed_source_and_assembly (struct gdb
>
> num_displayed += dump_insns (gdbarch, uiout, di,
> mle[i].start_pc, mle[i].end_pc,
> - how_many, stb);
> + how_many, code, 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 code, 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,
> + code, stb);
>
> do_cleanups (ui_out_chain);
> }
> @@ -357,7 +374,7 @@ void
> gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
> char *file_string,
> int mixed_source_and_assembly,
> - int how_many, CORE_ADDR low, CORE_ADDR high)
> + int how_many, int code, CORE_ADDR low, CORE_ADDR high)
> {
> struct ui_stream *stb = ui_out_stream_new (uiout);
> struct cleanup *cleanups = make_cleanup_ui_out_stream_delete (stb);
> @@ -379,11 +396,11 @@ gdb_disassembly (struct gdbarch *gdbarch
>
> if (!mixed_source_and_assembly || 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, code, stb);
>
> else if (mixed_source_and_assembly)
> do_mixed_source_and_assembly (gdbarch, uiout, &di, nlines, le, low,
> - high, symtab, how_many, stb);
> + high, symtab, how_many, code, stb);
>
> do_cleanups (cleanups);
> gdb_flush (gdb_stdout);
> --- a/disasm.h
> +++ b/disasm.h
> @@ -25,7 +25,8 @@ struct ui_file;
> extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
> char *file_string,
> int mixed_source_and_assembly,
> - int how_many, CORE_ADDR low, CORE_ADDR high);
> + int how_many, int code, CORE_ADDR low,
> + CORE_ADDR high);
>
> /* Print the instruction at address MEMADDR in debugged memory,
> on STREAM. Returns the length of the instruction, in bytes,
> --- a/mi/mi-cmd-disas.c
> +++ b/mi/mi-cmd-disas.c
> @@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
>
> gdb_disassembly (gdbarch, uiout,
> file_string,
> - mixed_source_and_assembly, how_many, low, high);
> + mixed_source_and_assembly, 0, how_many, low, high);
>
> }
> --- a/stack.c
> +++ b/stack.c
> @@ -481,7 +481,7 @@ 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, 0, 1, p->how_many, p->low, p->high);
> }
>
> /* Use TRY_CATCH to catch the exception from the gdb_disassembly
>
>
> 2009-07-09 Hui Zhu <teawater@gmail.com>
>
> * gdb.texinfo (disassemble): Add a new modifier /c
> to "disassemble" command to make it output binary code.
>
> ---
> doc/gdb.texinfo | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> --- a/doc/gdb.texinfo
> +++ b/doc/gdb.texinfo
> @@ -6177,10 +6177,11 @@ Variables}).
> @cindex machine instructions
> @cindex listing machine instructions
> @item disassemble
> -@itemx disassemble /m
> +@itemx disassemble /mc
> This specialized command dumps a range of memory as machine
> instructions. It can also print mixed source+disassembly by specifying
> -the @code{/m} modifier.
> +the @code{/m} modifier and print binary code by specifying
> +the @code{/c}.
> The default memory range is the function surrounding the
> program counter of the selected frame. A single argument to this
> command is a program counter value; @value{GDBN} dumps the function
>
>
> ------------------------------------------------------------------------
>
> ---
> cli/cli-cmds.c | 27 +++++++++++++++++----------
> disasm.c | 35 ++++++++++++++++++++++++++---------
> disasm.h | 3 ++-
> mi/mi-cmd-disas.c | 2 +-
> stack.c | 2 +-
> 5 files changed, 47 insertions(+), 22 deletions(-)
>
> --- a/cli/cli-cmds.c
> +++ b/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 mixed, int code)
> {
> #if defined(TUI)
> if (!tui_is_window_visible (DISASSEM_WIN))
> @@ -922,7 +922,7 @@ print_disassembly (struct gdbarch *gdbar
> paddress (gdbarch, low), paddress (gdbarch, high));
>
> /* Dump the specified range. */
> - gdb_disassembly (gdbarch, uiout, 0, mixed, -1, low, high);
> + gdb_disassembly (gdbarch, uiout, 0, mixed, -1, code, low, high);
>
> printf_filtered ("End of assembler dump.\n");
> gdb_flush (gdb_stdout);
> @@ -940,7 +940,7 @@ print_disassembly (struct gdbarch *gdbar
> MIXED is non-zero to print source with the assembler. */
>
> static void
> -disassemble_current_function (int mixed)
> +disassemble_current_function (int mixed, int code)
> {
> 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, mixed, code);
> }
>
> /* Dump a specified section of assembly code.
>
> Usage:
> - disassemble [/m]
> + disassemble [/mc]
> - dump the assembly code for the function of the current pc
> - disassemble [/m] addr
> + disassemble [/mc] addr
> - dump the assembly code for the function at ADDR
> - disassemble [/m] low high
> + disassemble [/mc] 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 /c modifier will include binary code with the assembly. */
>
> static void
> disassemble_command (char *arg, int from_tty)
> @@ -985,9 +986,11 @@ disassemble_command (char *arg, int from
> CORE_ADDR pc, pc_masked;
> char *space_index;
> int mixed_source_and_assembly;
> + int code;
>
> name = NULL;
> mixed_source_and_assembly = 0;
> + code = 0;
>
> if (arg && *arg == '/')
> {
> @@ -1003,6 +1006,9 @@ disassemble_command (char *arg, int from
> case 'm':
> mixed_source_and_assembly = 1;
> break;
> + case 'c':
> + code = 1;
> + break;
> default:
> error (_("Invalid disassembly modifier."));
> }
> @@ -1014,7 +1020,7 @@ disassemble_command (char *arg, int from
>
> if (! arg || ! *arg)
> {
> - disassemble_current_function (mixed_source_and_assembly);
> + disassemble_current_function (mixed_source_and_assembly, code);
> return;
> }
>
> @@ -1044,7 +1050,7 @@ disassemble_command (char *arg, int from
> high = parse_and_eval_address (space_index + 1);
> }
>
> - print_disassembly (gdbarch, name, low, high, mixed_source_and_assembly);
> + print_disassembly (gdbarch, name, low, high, mixed_source_and_assembly, code);
> }
>
> static void
> @@ -1453,6 +1459,7 @@ With two args if one is empty it stands
> 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 /c modifier, binary code 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);
> --- a/disasm.c
> +++ b/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 code, struct ui_stream *stb)
> {
> int num_displayed = 0;
> CORE_ADDR pc;
> @@ -135,7 +135,23 @@ dump_insns (struct gdbarch *gdbarch, str
> xfree (name);
>
> ui_file_rewind (stb->stream);
> - pc += gdbarch_print_insn (gdbarch, pc, di);
> + if (code)
> + {
> + 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 gdb
> struct linetable_entry *le,
> CORE_ADDR low, CORE_ADDR high,
> struct symtab *symtab,
> - int how_many, struct ui_stream *stb)
> + int how_many, int code, struct ui_stream *stb)
> {
> int newlines = 0;
> struct dis_line_entry *mle;
> @@ -278,7 +294,7 @@ do_mixed_source_and_assembly (struct gdb
>
> num_displayed += dump_insns (gdbarch, uiout, di,
> mle[i].start_pc, mle[i].end_pc,
> - how_many, stb);
> + how_many, code, 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 code, 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,
> + code, stb);
>
> do_cleanups (ui_out_chain);
> }
> @@ -357,7 +374,7 @@ void
> gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
> char *file_string,
> int mixed_source_and_assembly,
> - int how_many, CORE_ADDR low, CORE_ADDR high)
> + int how_many, int code, CORE_ADDR low, CORE_ADDR high)
> {
> struct ui_stream *stb = ui_out_stream_new (uiout);
> struct cleanup *cleanups = make_cleanup_ui_out_stream_delete (stb);
> @@ -379,11 +396,11 @@ gdb_disassembly (struct gdbarch *gdbarch
>
> if (!mixed_source_and_assembly || 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, code, stb);
>
> else if (mixed_source_and_assembly)
> do_mixed_source_and_assembly (gdbarch, uiout, &di, nlines, le, low,
> - high, symtab, how_many, stb);
> + high, symtab, how_many, code, stb);
>
> do_cleanups (cleanups);
> gdb_flush (gdb_stdout);
> --- a/disasm.h
> +++ b/disasm.h
> @@ -25,7 +25,8 @@ struct ui_file;
> extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
> char *file_string,
> int mixed_source_and_assembly,
> - int how_many, CORE_ADDR low, CORE_ADDR high);
> + int how_many, int code, CORE_ADDR low,
> + CORE_ADDR high);
>
> /* Print the instruction at address MEMADDR in debugged memory,
> on STREAM. Returns the length of the instruction, in bytes,
> --- a/mi/mi-cmd-disas.c
> +++ b/mi/mi-cmd-disas.c
> @@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
>
> gdb_disassembly (gdbarch, uiout,
> file_string,
> - mixed_source_and_assembly, how_many, low, high);
> + mixed_source_and_assembly, 0, how_many, low, high);
>
> }
> --- a/stack.c
> +++ b/stack.c
> @@ -481,7 +481,7 @@ 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, 0, 1, p->how_many, p->low, p->high);
> }
>
> /* Use TRY_CATCH to catch the exception from the gdb_disassembly
>
>
> ------------------------------------------------------------------------
>
> ---
> doc/gdb.texinfo | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> --- a/doc/gdb.texinfo
> +++ b/doc/gdb.texinfo
> @@ -6177,10 +6177,11 @@ Variables}).
> @cindex machine instructions
> @cindex listing machine instructions
> @item disassemble
> -@itemx disassemble /m
> +@itemx disassemble /mc
> This specialized command dumps a range of memory as machine
> instructions. It can also print mixed source+disassembly by specifying
> -the @code{/m} modifier.
> +the @code{/m} modifier and print binary code by specifying
> +the @code{/c}.
> The default memory range is the function surrounding the
> program counter of the selected frame. A single argument to this
> command is a program counter value; @value{GDBN} dumps the function
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 12:22 Add a new modifier /c to "disassemble" command to make it output binary code Hui Zhu
` (2 preceding siblings ...)
2009-07-09 22:00 ` Michael Snyder
@ 2009-07-09 23:44 ` Doug Evans
2009-07-10 9:33 ` Eli Zaretskii
2009-07-10 14:34 ` Mark Kettenis
3 siblings, 2 replies; 16+ messages in thread
From: Doug Evans @ 2009-07-09 23:44 UTC (permalink / raw)
To: Hui Zhu; +Cc: gdb-patches ml
On Wed, Jul 8, 2009 at 11:35 PM, Hui Zhu<teawater@gmail.com> wrote:
> Hi,
>
> The objdump will output the binary code when it works but gdb not.
> I make a patch to add a new modifier /c to "disassemble" command to
> make it output binary code.
> Please help me review it.
I like the idea.
The option to objdump is --[no-]show-raw-insn.
The word "raw" is the mnemonic I use to remember the option name.
Hence I wonder if it would be easier for users to remember
"disassemble /r" than "disassemble /c".
[nit picky, I know]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 23:44 ` Doug Evans
@ 2009-07-10 9:33 ` Eli Zaretskii
2009-07-10 14:34 ` Mark Kettenis
1 sibling, 0 replies; 16+ messages in thread
From: Eli Zaretskii @ 2009-07-10 9:33 UTC (permalink / raw)
To: Doug Evans; +Cc: teawater, gdb-patches
> Date: Thu, 9 Jul 2009 15:00:32 -0700
> From: Doug Evans <dje@google.com>
> Cc: gdb-patches ml <gdb-patches@sourceware.org>
>
> The option to objdump is --[no-]show-raw-insn.
> The word "raw" is the mnemonic I use to remember the option name.
> Hence I wonder if it would be easier for users to remember
> "disassemble /r" than "disassemble /c".
Yes, and perhaps have "show raw instructions" somewhere in the text of
the manual that describes this.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 23:44 ` Doug Evans
2009-07-10 9:33 ` Eli Zaretskii
@ 2009-07-10 14:34 ` Mark Kettenis
1 sibling, 0 replies; 16+ messages in thread
From: Mark Kettenis @ 2009-07-10 14:34 UTC (permalink / raw)
To: dje; +Cc: teawater, gdb-patches
> Date: Thu, 9 Jul 2009 15:00:32 -0700
> From: Doug Evans <dje@google.com>
>
> On Wed, Jul 8, 2009 at 11:35 PM, Hui Zhu<teawater@gmail.com> wrote:
> > Hi,
> >
> > The objdump will output the binary code when it works but gdb not.
> > I make a patch to add a new modifier /c to "disassemble" command to
> > make it output binary code.
> > Please help me review it.
>
> I like the idea.
> The option to objdump is --[no-]show-raw-insn.
> The word "raw" is the mnemonic I use to remember the option name.
> Hence I wonder if it would be easier for users to remember
> "disassemble /r" than "disassemble /c".
> [nit picky, I know]
Actually I think you have a point here. The term "code" is horribly
overloaded, so I felt a bit uncomfortable with the fact that the newly
added argument to print_disassembly carried that name:
>> 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 mixed, int code)
If people agree with Doug and me that /r is better than /c, can the
code be changed to match this?
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-09 19:22 ` Tom Tromey
2009-07-09 19:40 ` Eli Zaretskii
@ 2009-07-11 9:28 ` Hui Zhu
2009-07-11 12:42 ` Eli Zaretskii
1 sibling, 1 reply; 16+ messages in thread
From: Hui Zhu @ 2009-07-11 9:28 UTC (permalink / raw)
To: Tom Tromey, Eli Zaretskii, Michael Snyder, Doug Evans, Mark Kettenis
Cc: gdb-patches ml
[-- Attachment #1: Type: text/plain, Size: 12655 bytes --]
Thanks everybody,
1. I added a argument "flags". It include "DISASSEMBLY_SOURCE" and
"DISASSEMBLY_RAW_INSN".
2. I change the introduce to "With a /r modifier, print the
instruction in hex as well as in symbolic form." It get from
objdump's man. Wish you like it. :)
3. /c changed /r.
4. I have make a patch for testsuite.
Please help me review them.
Thanks,
Hui
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 instruction 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 instruction 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 instruction in hex with the
assembly if it and flags is true.
(gdb_disassembly): Update extern.
---
cli/cli-cmds.c | 31 ++++++++++++++++++-------------
disasm.c | 39 ++++++++++++++++++++++++++++-----------
disasm.h | 3 +++
mi/mi-cmd-disas.c | 2 +-
stack.c | 4 +++-
5 files changed, 53 insertions(+), 26 deletions(-)
--- a/cli/cli-cmds.c
+++ b/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 *gdbar
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 *gdbar
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 instruction in hex with the assembly. */
static void
disassemble_command (char *arg, int from_tty)
@@ -984,10 +985,10 @@ disassemble_command (char *arg, int from
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
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
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
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
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, instruction 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);
--- a/disasm.c
+++ b/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, str
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 gdb
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 gdb
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 *gd
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
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);
--- a/disasm.h
+++ b/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;
--- a/mi/mi-cmd-disas.c
+++ b/mi/mi-cmd-disas.c
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- mixed_source_and_assembly, how_many, low, high);
+ DISASSEMBLY_SOURCE, how_many, low, high);
}
--- a/stack.c
+++ b/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
2009-07-11 Hui Zhu <teawater@gmail.com>
* gdb.texinfo (disassemble): Add a new modifier /r
to "disassemble" command to make it print the instruction in
hex as well as in symbolic form.
---
doc/gdb.texinfo | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -6178,9 +6178,11 @@ Variables}).
@cindex listing machine instructions
@item disassemble
@itemx disassemble /m
+@itemx disassemble /r
This specialized command dumps a range of memory as machine
instructions. It can also print mixed source+disassembly by specifying
-the @code{/m} modifier.
+the @code{/m} modifier and print the instruction in hex as well as in
+symbolic form by specifying the @code{/r}.
The default memory range is the function surrounding the
program counter of the selected frame. A single argument to this
command is a program counter value; @value{GDBN} dumps the function
2009-07-11 Hui Zhu <teawater@gmail.com>
* gdb.base/help.exp (disassemble): Update expected help text.
---
testsuite/gdb.base/help.exp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/testsuite/gdb.base/help.exp
+++ b/testsuite/gdb.base/help.exp
@@ -124,7 +124,7 @@ gdb_test "help disable breakpoints" "Dis
# test help disable display
gdb_test "help disable display" "Disable some expressions to be
displayed when program stops\.\[\r\n\]+Arguments are the code numbers
of the expressions to stop displaying\.\[\r\n\]+No argument means
disable all automatic-display expressions\.\[\r\n\]+Do \"info
display\" to see current list of code numbers\." "help disable
display"
# test help disassemble
-gdb_test "help disassemble" "Disassemble a specified section of
memory\.\[\r\n\]+Default is the function surrounding the pc of the
selected frame\.\[\r\n\]+With a /m modifier, source lines are included
\\(if available\\)\.\[\r\n\]+With a single argument, the function
surrounding that address is dumped\.\[\r\n\]+Two arguments are taken
as a range of memory to dump\." "help disassemble"
+gdb_test "help disassemble" "Disassemble a specified section of
memory\.\[\r\n\]+Default is the function surrounding the pc of the
selected frame\.\[\r\n\]+With a /m modifier, source lines are included
\\(if available\\)\.\[\r\n\]+With a /r modifier, instruction in hex
are included\.\[\r\n\]+With a single argument, the function
surrounding that address is dumped\.\[\r\n\]+Two arguments are taken
as a range of memory to dump\." "help disassemble"
# test help display
gdb_test "help display" "Print value of expression EXP each time the
program stops\.\[\r\n\]+/FMT may be used before EXP as in the
\"print\" command\.\[\r\n\]+/FMT \"i\" or \"s\" or including a
size-letter is allowed,\[\r\n\]+as in the \"x\" command, and then EXP
is used to get the address to examine\[\r\n\]+and examining is done as
in the \"x\" command\.\[\r\n\]+With no argument, display all currently
requested auto-display expressions\.\[\r\n\]+Use \"undisplay\" to
cancel display requests previously made\." "help display"
# test help do
[-- Attachment #2: disassemble-output-code.txt --]
[-- Type: text/plain, Size: 8328 bytes --]
---
cli/cli-cmds.c | 31 ++++++++++++++++++-------------
disasm.c | 39 ++++++++++++++++++++++++++++-----------
disasm.h | 3 +++
mi/mi-cmd-disas.c | 2 +-
stack.c | 4 +++-
5 files changed, 53 insertions(+), 26 deletions(-)
--- a/cli/cli-cmds.c
+++ b/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 *gdbar
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 *gdbar
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 instruction in hex with the assembly. */
static void
disassemble_command (char *arg, int from_tty)
@@ -984,10 +985,10 @@ disassemble_command (char *arg, int from
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
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
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
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
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, instruction 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);
--- a/disasm.c
+++ b/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, str
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 gdb
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 gdb
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 *gd
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
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);
--- a/disasm.h
+++ b/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;
--- a/mi/mi-cmd-disas.c
+++ b/mi/mi-cmd-disas.c
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- mixed_source_and_assembly, how_many, low, high);
+ DISASSEMBLY_SOURCE, how_many, low, high);
}
--- a/stack.c
+++ b/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
[-- Attachment #3: disassemble-output-code-doc.txt --]
[-- Type: text/plain, Size: 733 bytes --]
---
doc/gdb.texinfo | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -6178,9 +6178,11 @@ Variables}).
@cindex listing machine instructions
@item disassemble
@itemx disassemble /m
+@itemx disassemble /r
This specialized command dumps a range of memory as machine
instructions. It can also print mixed source+disassembly by specifying
-the @code{/m} modifier.
+the @code{/m} modifier and print the instruction in hex as well as in
+symbolic form by specifying the @code{/r}.
The default memory range is the function surrounding the
program counter of the selected frame. A single argument to this
command is a program counter value; @value{GDBN} dumps the function
[-- Attachment #4: disassemble-output-code-test.txt --]
[-- Type: text/plain, Size: 2017 bytes --]
---
testsuite/gdb.base/help.exp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/testsuite/gdb.base/help.exp
+++ b/testsuite/gdb.base/help.exp
@@ -124,7 +124,7 @@ gdb_test "help disable breakpoints" "Dis
# test help disable display
gdb_test "help disable display" "Disable some expressions to be displayed when program stops\.\[\r\n\]+Arguments are the code numbers of the expressions to stop displaying\.\[\r\n\]+No argument means disable all automatic-display expressions\.\[\r\n\]+Do \"info display\" to see current list of code numbers\." "help disable display"
# test help disassemble
-gdb_test "help disassemble" "Disassemble a specified section of memory\.\[\r\n\]+Default is the function surrounding the pc of the selected frame\.\[\r\n\]+With a /m modifier, source lines are included \\(if available\\)\.\[\r\n\]+With a single argument, the function surrounding that address is dumped\.\[\r\n\]+Two arguments are taken as a range of memory to dump\." "help disassemble"
+gdb_test "help disassemble" "Disassemble a specified section of memory\.\[\r\n\]+Default is the function surrounding the pc of the selected frame\.\[\r\n\]+With a /m modifier, source lines are included \\(if available\\)\.\[\r\n\]+With a /r modifier, instruction in hex are included\.\[\r\n\]+With a single argument, the function surrounding that address is dumped\.\[\r\n\]+Two arguments are taken as a range of memory to dump\." "help disassemble"
# test help display
gdb_test "help display" "Print value of expression EXP each time the program stops\.\[\r\n\]+/FMT may be used before EXP as in the \"print\" command\.\[\r\n\]+/FMT \"i\" or \"s\" or including a size-letter is allowed,\[\r\n\]+as in the \"x\" command, and then EXP is used to get the address to examine\[\r\n\]+and examining is done as in the \"x\" command\.\[\r\n\]+With no argument, display all currently requested auto-display expressions\.\[\r\n\]+Use \"undisplay\" to cancel display requests previously made\." "help display"
# test help do
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-11 9:28 ` Hui Zhu
@ 2009-07-11 12:42 ` Eli Zaretskii
2009-07-11 14:15 ` Hui Zhu
0 siblings, 1 reply; 16+ messages in thread
From: Eli Zaretskii @ 2009-07-11 12:42 UTC (permalink / raw)
To: Hui Zhu; +Cc: tromey, msnyder, dje, mark.kettenis, gdb-patches
> Date: Sat, 11 Jul 2009 16:46:28 +0800
> From: Hui Zhu <teawater@gmail.com>
> Cc: gdb-patches ml <gdb-patches@sourceware.org>
>
> @@ -1454,6 +1458,7 @@ With two args if one is empty it stands
> 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, instruction in hex are included.\n\
With a /r modifier, raw instructions in hex are included.
(Use "raw" explicitly to help people remember why there's an `r' in
"/r".)
> +++ b/doc/gdb.texinfo
> @@ -6178,9 +6178,11 @@ Variables}).
> @cindex listing machine instructions
> @item disassemble
> @itemx disassemble /m
> +@itemx disassemble /r
> This specialized command dumps a range of memory as machine
> instructions. It can also print mixed source+disassembly by specifying
> -the @code{/m} modifier.
> +the @code{/m} modifier and print the instruction in hex as well as in
> +symbolic form by specifying the @code{/r}.
and print the raw instructions in hex as well as in symbolic form
Again, please use the word "raw" in the text.
Also, what about NEWS? didn't we agree that an entry there would be a
Good Thing?
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-11 12:42 ` Eli Zaretskii
@ 2009-07-11 14:15 ` Hui Zhu
2009-07-11 17:54 ` Eli Zaretskii
0 siblings, 1 reply; 16+ messages in thread
From: Hui Zhu @ 2009-07-11 14:15 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: tromey, msnyder, dje, mark.kettenis, gdb-patches
[-- Attachment #1: Type: text/plain, Size: 14481 bytes --]
On Sat, Jul 11, 2009 at 17:32, Eli Zaretskii<eliz@gnu.org> wrote:
>> Date: Sat, 11 Jul 2009 16:46:28 +0800
>> From: Hui Zhu <teawater@gmail.com>
>> Cc: gdb-patches ml <gdb-patches@sourceware.org>
>>
>> @@ -1454,6 +1458,7 @@ With two args if one is empty it stands
>> 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, instruction in hex are included.\n\
>
> With a /r modifier, raw instructions in hex are included.
>
> (Use "raw" explicitly to help people remember why there's an `r' in
> "/r".)
>
>> +++ b/doc/gdb.texinfo
>> @@ -6178,9 +6178,11 @@ Variables}).
>> @cindex listing machine instructions
>> @item disassemble
>> @itemx disassemble /m
>> +@itemx disassemble /r
>> This specialized command dumps a range of memory as machine
>> instructions. It can also print mixed source+disassembly by specifying
>> -the @code{/m} modifier.
>> +the @code{/m} modifier and print the instruction in hex as well as in
>> +symbolic form by specifying the @code{/r}.
>
> and print the raw instructions in hex as well as in symbolic form
>
> Again, please use the word "raw" in the text.
>
> Also, what about NEWS? didn't we agree that an entry there would be a
> Good Thing?
>
I have add "raw" and "NEWS". Please help me review it.
Thanks,
Hui
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 instruction 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 instruction 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 instruction in hex with
the assembly if it and flags is true.
(gdb_disassembly): Update extern.
* NEWS: Document disassemble/r support.
---
NEWS | 3 +++
cli/cli-cmds.c | 31 ++++++++++++++++++-------------
disasm.c | 39 ++++++++++++++++++++++++++++-----------
disasm.h | 3 +++
mi/mi-cmd-disas.c | 2 +-
stack.c | 4 +++-
6 files changed, 56 insertions(+), 26 deletions(-)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@
*** Changes since GDB 6.8
+* "disassemble" command with a /r modifier, print the raw instruction
+in hex as well as in symbolic form."
+
* Process record and replay
In a architecture environment that supports ``process record and
--- a/cli/cli-cmds.c
+++ b/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 *gdbar
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 *gdbar
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 instruction in hex with the assembly. */
static void
disassemble_command (char *arg, int from_tty)
@@ -984,10 +985,10 @@ disassemble_command (char *arg, int from
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
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
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
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
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 instruction 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);
--- a/disasm.c
+++ b/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, str
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 gdb
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 gdb
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 *gd
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
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);
--- a/disasm.h
+++ b/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;
--- a/mi/mi-cmd-disas.c
+++ b/mi/mi-cmd-disas.c
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- mixed_source_and_assembly, how_many, low, high);
+ DISASSEMBLY_SOURCE, how_many, low, high);
}
--- a/stack.c
+++ b/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
2009-07-11 Hui Zhu <teawater@gmail.com>
* gdb.texinfo (disassemble): Add a new modifier /r
to "disassemble" command to make it print the raw instruction
in hex as well as in symbolic form.
---
doc/gdb.texinfo | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -6178,9 +6178,11 @@ Variables}).
@cindex listing machine instructions
@item disassemble
@itemx disassemble /m
+@itemx disassemble /r
This specialized command dumps a range of memory as machine
instructions. It can also print mixed source+disassembly by specifying
-the @code{/m} modifier.
+the @code{/m} modifier and print the raw instruction in hex as well as
+in symbolic form by specifying the @code{/r}.
The default memory range is the function surrounding the
program counter of the selected frame. A single argument to this
command is a program counter value; @value{GDBN} dumps the function
2009-07-11 Hui Zhu <teawater@gmail.com>
* gdb.base/help.exp (disassemble): Update expected help text.
---
testsuite/gdb.base/help.exp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/testsuite/gdb.base/help.exp
+++ b/testsuite/gdb.base/help.exp
@@ -124,7 +124,7 @@ gdb_test "help disable breakpoints" "Dis
# test help disable display
gdb_test "help disable display" "Disable some expressions to be
displayed when program stops\.\[\r\n\]+Arguments are the code numbers
of the expressions to stop displaying\.\[\r\n\]+No argument means
disable all automatic-display expressions\.\[\r\n\]+Do \"info
display\" to see current list of code numbers\." "help disable
display"
# test help disassemble
-gdb_test "help disassemble" "Disassemble a specified section of
memory\.\[\r\n\]+Default is the function surrounding the pc of the
selected frame\.\[\r\n\]+With a /m modifier, source lines are included
\\(if available\\)\.\[\r\n\]+With a single argument, the function
surrounding that address is dumped\.\[\r\n\]+Two arguments are taken
as a range of memory to dump\." "help disassemble"
+gdb_test "help disassemble" "Disassemble a specified section of
memory\.\[\r\n\]+Default is the function surrounding the pc of the
selected frame\.\[\r\n\]+With a /m modifier, source lines are included
\\(if available\\)\.\[\r\n\]+With a /r modifier, raw instruction in
hex are included\.\[\r\n\]+With a single argument, the function
surrounding that address is dumped\.\[\r\n\]+Two arguments are taken
as a range of memory to dump\." "help disassemble"
# test help display
gdb_test "help display" "Print value of expression EXP each time the
program stops\.\[\r\n\]+/FMT may be used before EXP as in the
\"print\" command\.\[\r\n\]+/FMT \"i\" or \"s\" or including a
size-letter is allowed,\[\r\n\]+as in the \"x\" command, and then EXP
is used to get the address to examine\[\r\n\]+and examining is done as
in the \"x\" command\.\[\r\n\]+With no argument, display all currently
requested auto-display expressions\.\[\r\n\]+Use \"undisplay\" to
cancel display requests previously made\." "help display"
# test help do
[-- Attachment #2: disassemble-output-code.txt --]
[-- Type: text/plain, Size: 8645 bytes --]
---
NEWS | 3 +++
cli/cli-cmds.c | 31 ++++++++++++++++++-------------
disasm.c | 39 ++++++++++++++++++++++++++++-----------
disasm.h | 3 +++
mi/mi-cmd-disas.c | 2 +-
stack.c | 4 +++-
6 files changed, 56 insertions(+), 26 deletions(-)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@
*** Changes since GDB 6.8
+* "disassemble" command with a /r modifier, print the raw instruction
+in hex as well as in symbolic form."
+
* Process record and replay
In a architecture environment that supports ``process record and
--- a/cli/cli-cmds.c
+++ b/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 *gdbar
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 *gdbar
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 instruction in hex with the assembly. */
static void
disassemble_command (char *arg, int from_tty)
@@ -984,10 +985,10 @@ disassemble_command (char *arg, int from
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
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
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
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
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 instruction 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);
--- a/disasm.c
+++ b/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, str
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 gdb
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 gdb
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 *gd
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
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);
--- a/disasm.h
+++ b/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;
--- a/mi/mi-cmd-disas.c
+++ b/mi/mi-cmd-disas.c
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- mixed_source_and_assembly, how_many, low, high);
+ DISASSEMBLY_SOURCE, how_many, low, high);
}
--- a/stack.c
+++ b/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
[-- Attachment #3: disassemble-output-code-doc.txt --]
[-- Type: text/plain, Size: 737 bytes --]
---
doc/gdb.texinfo | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -6178,9 +6178,11 @@ Variables}).
@cindex listing machine instructions
@item disassemble
@itemx disassemble /m
+@itemx disassemble /r
This specialized command dumps a range of memory as machine
instructions. It can also print mixed source+disassembly by specifying
-the @code{/m} modifier.
+the @code{/m} modifier and print the raw instruction in hex as well as
+in symbolic form by specifying the @code{/r}.
The default memory range is the function surrounding the
program counter of the selected frame. A single argument to this
command is a program counter value; @value{GDBN} dumps the function
[-- Attachment #4: disassemble-output-code-test.txt --]
[-- Type: text/plain, Size: 2021 bytes --]
---
testsuite/gdb.base/help.exp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/testsuite/gdb.base/help.exp
+++ b/testsuite/gdb.base/help.exp
@@ -124,7 +124,7 @@ gdb_test "help disable breakpoints" "Dis
# test help disable display
gdb_test "help disable display" "Disable some expressions to be displayed when program stops\.\[\r\n\]+Arguments are the code numbers of the expressions to stop displaying\.\[\r\n\]+No argument means disable all automatic-display expressions\.\[\r\n\]+Do \"info display\" to see current list of code numbers\." "help disable display"
# test help disassemble
-gdb_test "help disassemble" "Disassemble a specified section of memory\.\[\r\n\]+Default is the function surrounding the pc of the selected frame\.\[\r\n\]+With a /m modifier, source lines are included \\(if available\\)\.\[\r\n\]+With a single argument, the function surrounding that address is dumped\.\[\r\n\]+Two arguments are taken as a range of memory to dump\." "help disassemble"
+gdb_test "help disassemble" "Disassemble a specified section of memory\.\[\r\n\]+Default is the function surrounding the pc of the selected frame\.\[\r\n\]+With a /m modifier, source lines are included \\(if available\\)\.\[\r\n\]+With a /r modifier, raw instruction in hex are included\.\[\r\n\]+With a single argument, the function surrounding that address is dumped\.\[\r\n\]+Two arguments are taken as a range of memory to dump\." "help disassemble"
# test help display
gdb_test "help display" "Print value of expression EXP each time the program stops\.\[\r\n\]+/FMT may be used before EXP as in the \"print\" command\.\[\r\n\]+/FMT \"i\" or \"s\" or including a size-letter is allowed,\[\r\n\]+as in the \"x\" command, and then EXP is used to get the address to examine\[\r\n\]+and examining is done as in the \"x\" command\.\[\r\n\]+With no argument, display all currently requested auto-display expressions\.\[\r\n\]+Use \"undisplay\" to cancel display requests previously made\." "help display"
# test help do
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-11 14:15 ` Hui Zhu
@ 2009-07-11 17:54 ` Eli Zaretskii
2009-07-11 17:59 ` Hui Zhu
0 siblings, 1 reply; 16+ messages in thread
From: Eli Zaretskii @ 2009-07-11 17:54 UTC (permalink / raw)
To: Hui Zhu; +Cc: tromey, msnyder, dje, mark.kettenis, gdb-patches
> Date: Sat, 11 Jul 2009 20:09:25 +0800
> From: Hui Zhu <teawater@gmail.com>
> Cc: tromey@redhat.com, msnyder@vmware.com, dje@google.com,
> mark.kettenis@xs4all.nl, gdb-patches@sourceware.org
>
> *** Changes since GDB 6.8
>
> +* "disassemble" command with a /r modifier, print the raw instruction
> +in hex as well as in symbolic form."
"instructions", in plural.
> + A /r modifier will include raw instruction in hex with the assembly. *=
"instruction", in plural.
> +With a /r modifier, raw instruction in hex are included.\n\
Same here.
> +the @code{/m} modifier and print the raw instruction in hex as well as
> +in symbolic form by specifying the @code{/r}.
And here.
Okay with those corrections.
Thanks.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: Add a new modifier /c to "disassemble" command to make it output binary code
2009-07-11 17:54 ` Eli Zaretskii
@ 2009-07-11 17:59 ` Hui Zhu
2009-07-11 18:16 ` Regression for mi-disassemble.exp [Re: Add a new modifier /c to "disassemble" command to make it output binary code] Jan Kratochvil
0 siblings, 1 reply; 16+ messages in thread
From: Hui Zhu @ 2009-07-11 17:59 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: tromey, msnyder, dje, mark.kettenis, gdb-patches
On Sat, Jul 11, 2009 at 20:42, Eli Zaretskii<eliz@gnu.org> wrote:
>> Date: Sat, 11 Jul 2009 20:09:25 +0800
>> From: Hui Zhu <teawater@gmail.com>
>> Cc: tromey@redhat.com, msnyder@vmware.com, dje@google.com,
>> mark.kettenis@xs4all.nl, gdb-patches@sourceware.org
>>
>> *** Changes since GDB 6.8
>>
>> +* "disassemble" command with a /r modifier, print the raw instruction
>> +in hex as well as in symbolic form."
>
> "instructions", in plural.
>
>> + A /r modifier will include raw instruction in hex with the assembly. *=
>
> "instruction", in plural.
>
>> +With a /r modifier, raw instruction in hex are included.\n\
>
> Same here.
>
>> +the @code{/m} modifier and print the raw instruction in hex as well as
>> +in symbolic form by specifying the @code{/r}.
>
> And here.
>
> Okay with those corrections.
>
Fixed and checked-in.
Thanks,
Hui
^ permalink raw reply [flat|nested] 16+ messages in thread
* Regression for mi-disassemble.exp [Re: Add a new modifier /c to "disassemble" command to make it output binary code]
2009-07-11 17:59 ` Hui Zhu
@ 2009-07-11 18:16 ` Jan Kratochvil
2009-07-17 17:09 ` [commit] Fix mi-disassemble.exp regression Ulrich Weigand
0 siblings, 1 reply; 16+ messages in thread
From: Jan Kratochvil @ 2009-07-11 18:16 UTC (permalink / raw)
To: Hui Zhu; +Cc: Eli Zaretskii, tromey, msnyder, dje, mark.kettenis, gdb-patches
Hi Hui,
On Sat, 11 Jul 2009 16:15:00 +0200, Hui Zhu wrote:
> Fixed and checked-in.
this check-in
http://sourceware.org/ml/gdb-cvs/2009-07/msg00089.html
http://sourceware.org/ml/gdb-cvs/2009-07/msg00092.html
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.
causes a regression on {x86_64,x86_64-32,i686}-fedora11-linux-gnu.
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble from pc to pc+12 assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file & line, assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number (zero lines) assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number (more than main lines) assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble from pc to pc+12 assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file & line, assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number (zero lines) assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number (more than main lines) assembly only
I hope it is reproducible for you, have not checked it much more.
Regards,
Jan
@@ -58240,17 +57869,17 @@
]+[(]gdb[)]
[ ]*)
111-data-disassemble -s $pc -e "$pc + 12" -- 0
-111^done,asm_insns=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"}]
+111^done,asm_insns=[src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]}]
(gdb)
-PASS: gdb.mi/mi-disassemble.exp: data-disassemble from pc to pc+12 assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble from pc to pc+12 assembly only
Expecting: ^(222-data-disassemble -f basics\.c -l 66 -- 0[
]+)?(222\^done,asm_insns=\[{address="0x[0-9A-Fa-f]+",func-name="main",offset="0",inst=".*"},.*,{address="0x[0-9A-Fa-f]+",func-name="main",offset="[0-9]+",inst=".*"}\][
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -- 0
-222^done,asm_insns=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"},{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"},{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"},{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"},{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"},{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"},{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"},{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"}]},src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="67",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="68",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="69",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"}]},src_and_asm_line={line="70",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="71",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="72",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="73",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="74",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"}]},src_and_asm_line={line="75",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]}]
(gdb)
-PASS: gdb.mi/mi-disassemble.exp: data-disassemble file & line, assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file & line, assembly only
Expecting: ^(002-data-disassemble -f basics\.c -l 41 -- 1[
]+)?(002\^done,asm_insns=\[src_and_asm_line={line="41",file=".*basics.c",line_asm_insn=\[{address="0x[0-9A-Fa-f]+",func-name="callee2",offset="0",inst=".*"}.*\]}.*,src_and_asm_line={line="[0-9]+",file=".*basics.c",line_asm_insn=\[.*{address="0x[0-9A-Fa-f]+",func-name="callee2",offset="[0-9]+",inst=".*"}\]}\][
]+[(]gdb[)]
@@ -58313,25 +57942,25 @@
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -n 20 -- 0
-222^done,asm_insns=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"},{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"},{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"},{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"},{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"},{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"},{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"},{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"}]},src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="67",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="68",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="69",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"}]},src_and_asm_line={line="70",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="71",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="72",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="73",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="74",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"}]},src_and_asm_line={line="75",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]}]
(gdb)
-PASS: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number assembly only
Expecting: ^(222-data-disassemble -f basics\.c -l 66 -n 0 -- 0[
]+)?(222\^done,asm_insns=\[\][
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -n 0 -- 0
-222^done,asm_insns=[]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]}]
(gdb)
-PASS: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number (zero lines) assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number (zero lines) assembly only
Expecting: ^(222-data-disassemble -f basics\.c -l 66 -n 50 -- 0[
]+)?(222\^done,asm_insns=\[{address="0x[0-9A-Fa-f]+",func-name="main",offset="0",inst=".*"},.*,{address="0x[0-9A-Fa-f]+",func-name="main",offset="[0-9]+",inst=".*"}\][
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -n 50 -- 0
-222^done,asm_insns=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"},{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"},{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"},{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"},{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"},{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"},{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"},{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"}]},src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="67",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="68",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="69",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"}]},src_and_asm_line={line="70",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="71",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="72",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="73",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="74",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"}]},src_and_asm_line={line="75",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]}]
(gdb)
-PASS: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number (more than main lines) assembly only
+FAIL: gdb.mi/mi-disassemble.exp: data-disassemble file, line, number (more than main lines) assembly only
Expecting: ^(print/x \$pc[
]+)?([
]+[(]gdb[)]
@@ -68148,17 +67774,17 @@
]+[(]gdb[)]
[ ]*)
111-data-disassemble -s $pc -e "$pc + 12" -- 0
-111^done,asm_insns=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"}]
+111^done,asm_insns=[src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]}]
(gdb)
-PASS: gdb.mi/mi2-disassemble.exp: data-disassemble from pc to pc+12 assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble from pc to pc+12 assembly only
Expecting: ^(222-data-disassemble -f basics\.c -l 66 -- 0[
]+)?(222\^done,asm_insns=\[{address="0x[0-9A-Fa-f]+",func-name="main",offset="0",inst=".*"},.*,{address="0x[0-9A-Fa-f]+",func-name="main",offset="[0-9]+",inst=".*"}\][
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -- 0
-222^done,asm_insns=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"},{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"},{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"},{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"},{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"},{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"},{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"},{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"}]},src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="67",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="68",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="69",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"}]},src_and_asm_line={line="70",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="71",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="72",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="73",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="74",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"}]},src_and_asm_line={line="75",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]}]
(gdb)
-PASS: gdb.mi/mi2-disassemble.exp: data-disassemble file & line, assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file & line, assembly only
Expecting: ^(002-data-disassemble -f basics\.c -l 41 -- 1[
]+)?(002\^done,asm_insns=\[src_and_asm_line={line="41",file=".*basics.c",line_asm_insn=\[{address="0x[0-9A-Fa-f]+",func-name="callee2",offset="0",inst=".*"}.*\]}.*,src_and_asm_line={line="[0-9]+",file=".*basics.c",line_asm_insn=\[.*{address="0x[0-9A-Fa-f]+",func-name="callee2",offset="[0-9]+",inst=".*"}\]}\][
]+[(]gdb[)]
@@ -68221,25 +67847,25 @@
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -n 20 -- 0
-222^done,asm_insns=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"},{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"},{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"},{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"},{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"},{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"},{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"},{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"}]},src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="67",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="68",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="69",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"}]},src_and_asm_line={line="70",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="71",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="72",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="73",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="74",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"}]},src_and_asm_line={line="75",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]}]
(gdb)
-PASS: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number assembly only
Expecting: ^(222-data-disassemble -f basics\.c -l 66 -n 0 -- 0[
]+)?(222\^done,asm_insns=\[\][
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -n 0 -- 0
-222^done,asm_insns=[]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]}]
(gdb)
-PASS: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number (zero lines) assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number (zero lines) assembly only
Expecting: ^(222-data-disassemble -f basics\.c -l 66 -n 50 -- 0[
]+)?(222\^done,asm_insns=\[{address="0x[0-9A-Fa-f]+",func-name="main",offset="0",inst=".*"},.*,{address="0x[0-9A-Fa-f]+",func-name="main",offset="[0-9]+",inst=".*"}\][
]+[(]gdb[)]
[ ]*)
222-data-disassemble -f basics.c -l 66 -n 50 -- 0
-222^done,asm_insns=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"},{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"},{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"},{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"},{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"},{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"},{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"},{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]
+222^done,asm_insns=[src_and_asm_line={line="65",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a0",func-name="main",offset="0",inst="push %rbp"},{address="0x00000000004005a1",func-name="main",offset="1",inst="mov %rsp,%rbp"}]},src_and_asm_line={line="66",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005a4",func-name="main",offset="4",inst="movsd 0x16c(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005ac",func-name="main",offset="12",inst="mov $0x4006ff,%esi"},{address="0x00000000004005b1",func-name="main",offset="17",inst="mov $0x2,%edi"},{address="0x00000000004005b6",func-name="main",offset="22",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="67",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005bb",func-name="main",offset="27",inst="movsd 0x155(%rip),%xmm0 # 0x400718 <__dso_handle+40>"},{address="0x00000000004005c3",func-name="main",offset="35",inst="mov $0x4006ff,%esi"},{address="0x00000000004005c8",func-name="main",offset="40",inst="mov $0x2,%edi"},{address="0x00000000004005cd",func-name="main",offset="45",inst="callq 0x400551 <callee1>"}]},src_and_asm_line={line="68",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="69",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d2",func-name="main",offset="50",inst="callq 0x40059a <do_nothing>"}]},src_and_asm_line={line="70",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="71",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005d7",func-name="main",offset="55",inst="mov $0x1,%edi"},{address="0x00000000004005dc",func-name="main",offset="60",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="72",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005e1",func-name="main",offset="65",inst="mov $0x2,%edi"},{address="0x00000000004005e6",func-name="main",offset="70",inst="callq 0x400578 <callme>"}]},src_and_asm_line={line="73",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[]},src_and_asm_line={line="74",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005eb",func-name="main",offset="75",inst="mov $0x0,%eax"}]},src_and_asm_line={line="75",file="../.././gdb/testsuite/gdb.mi/basics.c",line_asm_insn=[{address="0x00000000004005f0",func-name="main",offset="80",inst="leaveq "},{address="0x00000000004005f1",func-name="main",offset="81",inst="retq "}]}]
(gdb)
-PASS: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number (more than main lines) assembly only
+FAIL: gdb.mi/mi2-disassemble.exp: data-disassemble file, line, number (more than main lines) assembly only
Expecting: ^(print/x \$pc[
]+)?([
]+[(]gdb[)]
^ permalink raw reply [flat|nested] 16+ messages in thread
* [commit] Fix mi-disassemble.exp regression
2009-07-11 18:16 ` Regression for mi-disassemble.exp [Re: Add a new modifier /c to "disassemble" command to make it output binary code] Jan Kratochvil
@ 2009-07-17 17:09 ` Ulrich Weigand
2009-07-18 5:45 ` Hui Zhu
0 siblings, 1 reply; 16+ messages in thread
From: Ulrich Weigand @ 2009-07-17 17:09 UTC (permalink / raw)
To: Jan Kratochvil
Cc: Hui Zhu, Eli Zaretskii, tromey, msnyder, dje, mark.kettenis, gdb-patches
Jan Kratochvil wrote:
> On Sat, 11 Jul 2009 16:15:00 +0200, Hui Zhu wrote:
> > Fixed and checked-in.
>
> this check-in
> http://sourceware.org/ml/gdb-cvs/2009-07/msg00089.html
> http://sourceware.org/ml/gdb-cvs/2009-07/msg00092.html
[snip]
> causes a regression on {x86_64,x86_64-32,i686}-fedora11-linux-gnu.
This is caused by this part of Hui's patch:
--- a/mi/mi-cmd-disas.c
+++ b/mi/mi-cmd-disas.c
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- mixed_source_and_assembly, how_many, low, high);
+ DISASSEMBLY_SOURCE, how_many, low, high);
}
Note how the new code completely ignores the mixed_source_and_assembly
flag (which is set from the mixed_mode MI parameter).
The following patch fixes this.
Tested on powerpc64-linux, committed to mainline.
Bye,
Ulrich
ChangeLog:
* mi/mi-cmd-disas.c (mi_cmd_disassemble): Respect mixed_mode flag.
Index: gdb/mi/mi-cmd-disas.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmd-disas.c,v
retrieving revision 1.31
diff -u -p -r1.31 mi-cmd-disas.c
--- gdb/mi/mi-cmd-disas.c 11 Jul 2009 14:04:23 -0000 1.31
+++ gdb/mi/mi-cmd-disas.c 17 Jul 2009 15:50:06 -0000
@@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
gdb_disassembly (gdbarch, uiout,
file_string,
- DISASSEMBLY_SOURCE, how_many, low, high);
-
+ mixed_source_and_assembly? DISASSEMBLY_SOURCE : 0,
+ how_many, low, high);
}
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [commit] Fix mi-disassemble.exp regression
2009-07-17 17:09 ` [commit] Fix mi-disassemble.exp regression Ulrich Weigand
@ 2009-07-18 5:45 ` Hui Zhu
0 siblings, 0 replies; 16+ messages in thread
From: Hui Zhu @ 2009-07-18 5:45 UTC (permalink / raw)
To: Ulrich Weigand
Cc: Jan Kratochvil, Eli Zaretskii, tromey, msnyder, dje,
mark.kettenis, gdb-patches
Oops, sorry to forget it. Thanks.
Hui
On Fri, Jul 17, 2009 at 23:59, Ulrich Weigand<uweigand@de.ibm.com> wrote:
> Jan Kratochvil wrote:
>
>> On Sat, 11 Jul 2009 16:15:00 +0200, Hui Zhu wrote:
>> > Fixed and checked-in.
>>
>> this check-in
>> http://sourceware.org/ml/gdb-cvs/2009-07/msg00089.html
>> http://sourceware.org/ml/gdb-cvs/2009-07/msg00092.html
> [snip]
>> causes a regression on {x86_64,x86_64-32,i686}-fedora11-linux-gnu.
>
> This is caused by this part of Hui's patch:
>
> --- a/mi/mi-cmd-disas.c
> +++ b/mi/mi-cmd-disas.c
> @@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
>
> gdb_disassembly (gdbarch, uiout,
> file_string,
> - mixed_source_and_assembly, how_many, low, high);
> + DISASSEMBLY_SOURCE, how_many, low, high);
>
> }
>
> Note how the new code completely ignores the mixed_source_and_assembly
> flag (which is set from the mixed_mode MI parameter).
>
> The following patch fixes this.
> Tested on powerpc64-linux, committed to mainline.
>
> Bye,
> Ulrich
>
> ChangeLog:
>
> * mi/mi-cmd-disas.c (mi_cmd_disassemble): Respect mixed_mode flag.
>
> Index: gdb/mi/mi-cmd-disas.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mi/mi-cmd-disas.c,v
> retrieving revision 1.31
> diff -u -p -r1.31 mi-cmd-disas.c
> --- gdb/mi/mi-cmd-disas.c 11 Jul 2009 14:04:23 -0000 1.31
> +++ gdb/mi/mi-cmd-disas.c 17 Jul 2009 15:50:06 -0000
> @@ -156,6 +156,6 @@ mi_cmd_disassemble (char *command, char
>
> gdb_disassembly (gdbarch, uiout,
> file_string,
> - DISASSEMBLY_SOURCE, how_many, low, high);
> -
> + mixed_source_and_assembly? DISASSEMBLY_SOURCE : 0,
> + how_many, low, high);
> }
>
>
> --
> Dr. Ulrich Weigand
> GNU Toolchain for Linux on System z and Cell BE
> Ulrich.Weigand@de.ibm.com
>
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2009-07-18 3:04 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-09 12:22 Add a new modifier /c to "disassemble" command to make it output binary code Hui Zhu
2009-07-09 19:22 ` Tom Tromey
2009-07-09 19:40 ` Eli Zaretskii
2009-07-11 9:28 ` Hui Zhu
2009-07-11 12:42 ` Eli Zaretskii
2009-07-11 14:15 ` Hui Zhu
2009-07-11 17:54 ` Eli Zaretskii
2009-07-11 17:59 ` Hui Zhu
2009-07-11 18:16 ` Regression for mi-disassemble.exp [Re: Add a new modifier /c to "disassemble" command to make it output binary code] Jan Kratochvil
2009-07-17 17:09 ` [commit] Fix mi-disassemble.exp regression Ulrich Weigand
2009-07-18 5:45 ` Hui Zhu
2009-07-09 19:53 ` Add a new modifier /c to "disassemble" command to make it output binary code Eli Zaretskii
2009-07-09 22:00 ` Michael Snyder
2009-07-09 23:44 ` Doug Evans
2009-07-10 9:33 ` Eli Zaretskii
2009-07-10 14:34 ` Mark Kettenis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox