/* MI Command Set - disassemble commands.
- Copyright (C) 2000-2016 Free Software Foundation, Inc.
+ Copyright (C) 2000-2018 Free Software Foundation, Inc.
Contributed by Cygnus Solutions (a Red Hat company).
This file is part of GDB.
5 -- disassembly, source (pc-centric) and opcodes. */
void
-mi_cmd_disassemble (char *command, char **argv, int argc)
+mi_cmd_disassemble (const char *command, char **argv, int argc)
{
struct gdbarch *gdbarch = get_current_arch ();
struct ui_out *uiout = current_uiout;
CORE_ADDR start;
- int mode, disasm_flags;
+ int mode;
+ gdb_disassembly_flags disasm_flags;
struct symtab *s;
/* Which options have we processed ... */
int num_seen = 0;
int start_seen = 0;
int end_seen = 0;
+ int addr_seen = 0;
/* ... and their corresponding value. */
char *file_string = NULL;
int how_many = -1;
CORE_ADDR low = 0;
CORE_ADDR high = 0;
- struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
+ CORE_ADDR addr = 0;
/* Options processing stuff. */
int oind = 0;
char *oarg;
enum opt
{
- FILE_OPT, LINE_OPT, NUM_OPT, START_OPT, END_OPT
+ FILE_OPT, LINE_OPT, NUM_OPT, START_OPT, END_OPT, ADDR_OPT
};
static const struct mi_opt opts[] =
{
{"n", NUM_OPT, 1},
{"s", START_OPT, 1},
{"e", END_OPT, 1},
+ {"a", ADDR_OPT, 1},
{ 0, 0, 0 }
};
switch ((enum opt) opt)
{
case FILE_OPT:
- file_string = xstrdup (oarg);
+ file_string = oarg;
file_seen = 1;
- make_cleanup (xfree, file_string);
break;
case LINE_OPT:
line_num = atoi (oarg);
high = parse_and_eval_address (oarg);
end_seen = 1;
break;
+ case ADDR_OPT:
+ addr = parse_and_eval_address (oarg);
+ addr_seen = 1;
+ break;
}
}
argv += oind;
argc -= oind;
/* Allow only filename + linenum (with how_many which is not
- required) OR start_addr + end_addr. */
+ required) OR start_addr + end_addr OR addr. */
+
+ if (!(
+ ( line_seen && file_seen && !start_seen && !end_seen
+ && !addr_seen)
- if (!((line_seen && file_seen && num_seen && !start_seen && !end_seen)
- || (line_seen && file_seen && !num_seen && !start_seen && !end_seen)
- || (!line_seen && !file_seen && !num_seen && start_seen && end_seen)))
- error (_("-data-disassemble: Usage: ( [-f filename -l linenum [-n "
- "howmany]] | [-s startaddr -e endaddr]) [--] mode."));
+ || (!line_seen && !file_seen && !num_seen && start_seen && end_seen
+ && !addr_seen)
- if (argc != 1)
- error (_("-data-disassemble: Usage: [-f filename -l linenum "
- "[-n howmany]] [-s startaddr -e endaddr] [--] mode."));
+ || (!line_seen && !file_seen && !num_seen && !start_seen && !end_seen
+ && addr_seen))
+ || argc != 1)
+ error (_("-data-disassemble: Usage: ( [-f filename -l linenum "
+ "[-n howmany]] | [-s startaddr -e endaddr] | [-a addr] ) [--] mode."));
mode = atoi (argv[0]);
if (mode < 0 || mode > 5)
error (_("-data-disassemble: "
"No function contains specified address"));
}
+ else if (addr_seen)
+ {
+ if (find_pc_partial_function (addr, NULL, &low, &high) == 0)
+ error (_("-data-disassemble: "
+ "No function contains specified address"));
+ }
gdb_disassembly (gdbarch, uiout,
- file_string,
disasm_flags,
how_many, low, high);
-
- do_cleanups (cleanups);
}