/* MI Command Set - disassemble commands.
- Copyright (C) 2000, 2001, 2002, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 2000-2016 Free Software Foundation, Inc.
Contributed by Cygnus Solutions (a Red Hat company).
This file is part of GDB.
#include "value.h"
#include "mi-cmds.h"
#include "mi-getopt.h"
-#include "gdb_string.h"
#include "ui-out.h"
#include "disasm.h"
-/* The arguments to be passed on the command line and parsed here are:
-
+/* The arguments to be passed on the command line and parsed here are
either:
START-ADDRESS: address to start the disassembly at.
always required:
MODE: 0 -- disassembly.
- 1 -- disassembly and source.
+ 1 -- disassembly and source (with deprecated source-centric view).
2 -- disassembly and opcodes.
- 3 -- disassembly, source and opcodes.
-*/
+ 3 -- disassembly, source-centric and opcodes.
+ 4 -- disassembly, and source (with pc-centric view).
+ 5 -- disassembly, source (pc-centric) and opcodes. */
+
void
mi_cmd_disassemble (char *command, char **argv, int argc)
{
CORE_ADDR high = 0;
struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
- /* Options processing stuff. */
- int optind = 0;
- char *optarg;
+ /* Options processing stuff. */
+ int oind = 0;
+ char *oarg;
enum opt
{
FILE_OPT, LINE_OPT, NUM_OPT, START_OPT, END_OPT
};
- static const struct mi_opt opts[] = {
- {"f", FILE_OPT, 1},
- {"l", LINE_OPT, 1},
- {"n", NUM_OPT, 1},
- {"s", START_OPT, 1},
- {"e", END_OPT, 1},
- { 0, 0, 0 }
- };
+ static const struct mi_opt opts[] =
+ {
+ {"f", FILE_OPT, 1},
+ {"l", LINE_OPT, 1},
+ {"n", NUM_OPT, 1},
+ {"s", START_OPT, 1},
+ {"e", END_OPT, 1},
+ { 0, 0, 0 }
+ };
/* Get the options with their arguments. Keep track of what we
- encountered. */
+ encountered. */
while (1)
{
int opt = mi_getopt ("-data-disassemble", argc, argv, opts,
- &optind, &optarg);
+ &oind, &oarg);
if (opt < 0)
break;
switch ((enum opt) opt)
{
case FILE_OPT:
- file_string = xstrdup (optarg);
+ file_string = xstrdup (oarg);
file_seen = 1;
make_cleanup (xfree, file_string);
break;
case LINE_OPT:
- line_num = atoi (optarg);
+ line_num = atoi (oarg);
line_seen = 1;
break;
case NUM_OPT:
- how_many = atoi (optarg);
+ how_many = atoi (oarg);
num_seen = 1;
break;
case START_OPT:
- low = parse_and_eval_address (optarg);
+ low = parse_and_eval_address (oarg);
start_seen = 1;
break;
case END_OPT:
- high = parse_and_eval_address (optarg);
+ high = parse_and_eval_address (oarg);
end_seen = 1;
break;
}
}
- argv += optind;
- argc -= optind;
+ argv += oind;
+ argc -= oind;
/* Allow only filename + linenum (with how_many which is not
- required) OR start_addr + and_addr */
+ required) OR start_addr + end_addr. */
if (!((line_seen && file_seen && num_seen && !start_seen && !end_seen)
|| (line_seen && file_seen && !num_seen && !start_seen && !end_seen)
"[-n howmany]] [-s startaddr -e endaddr] [--] mode."));
mode = atoi (argv[0]);
- if (mode < 0 || mode > 3)
- error (_("-data-disassemble: Mode argument must be 0, 1, 2, or 3."));
+ if (mode < 0 || mode > 5)
+ error (_("-data-disassemble: Mode argument must be in the range 0-5."));
- /* Convert the mode into a set of disassembly flags */
+ /* Convert the mode into a set of disassembly flags. */
- disasm_flags = 0;
- if (mode & 0x1)
- disasm_flags |= DISASSEMBLY_SOURCE;
- if (mode & 0x2)
- disasm_flags |= DISASSEMBLY_RAW_INSN;
+ disasm_flags = 0; /* Initialize here for -Wall. */
+ switch (mode)
+ {
+ case 0:
+ break;
+ case 1:
+ disasm_flags |= DISASSEMBLY_SOURCE_DEPRECATED;
+ break;
+ case 2:
+ disasm_flags |= DISASSEMBLY_RAW_INSN;
+ break;
+ case 3:
+ disasm_flags |= DISASSEMBLY_SOURCE_DEPRECATED | DISASSEMBLY_RAW_INSN;
+ break;
+ case 4:
+ disasm_flags |= DISASSEMBLY_SOURCE;
+ break;
+ case 5:
+ disasm_flags |= DISASSEMBLY_SOURCE | DISASSEMBLY_RAW_INSN;
+ break;
+ default:
+ gdb_assert_not_reached ("bad disassembly mode");
+ }
/* We must get the function beginning and end where line_num is
- contained. */
+ contained. */
if (line_seen && file_seen)
{