MI: Add -a option to the "-data-disassemble" command
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 14 Aug 2018 13:13:28 +0000 (14:13 +0100)
committerPedro Alves <palves@redhat.com>
Tue, 14 Aug 2018 13:13:28 +0000 (14:13 +0100)
The CLI "disassemble" command allows specifying a single address - in
that case the function surrounding that address is disassembled.

This commit adds this feature to the equivalent MI command
"-data-disassemble".

gdb/ChangeLog:
2018-08-14  Jan Vrany  <jan.vrany@fit.cvut.cz>

* mi/mi-cmd-disas.c (mi_cmd_disassemble): Add -a option.
If used, use find_pc_partial_function to find address range
to disassemble.
* mi/mi-main.c (mi_cmd_list_features): Report
"data-disassemble-a-option" feature.
* NEWS: Mention new -data-disassemble option -a.

gdb/doc/ChangeLog:
2018-08-14  Jan Vrany  <jan.vrany@fit.cvut.cz>

* gdb.texinfo (GDB/MI Data Manipulation): Document
"-data-disassemble -a addr".
(GDB/MI Support Commands): Document "data-disassemble-a-option"
feature.

gdb/testsuite/ChangeLog:
2018-08-14  Jan Vrany  <jan.vrany@fit.cvut.cz>

* gdb.mi/mi-disassemble.exp (test_disassembly_only): Add tests for
-data-disassemble -a.
(test_disassembly_bogus_args): Likewise.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/mi/mi-cmd-disas.c
gdb/mi/mi-main.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-disassemble.exp

index 37ab81b0a93b7c6ad2ea678247cf7dbbc9ce879a..d16920d80e9a5721d9096f5b79f3978042e5593e 100644 (file)
@@ -1,3 +1,12 @@
+2018-08-14  Jan Vrany  <jan.vrany@fit.cvut.cz>
+
+       * mi/mi-cmd-disas.c (mi_cmd_disassemble): Add -a option.
+       If used, use find_pc_partial_function to find address range
+       to disassemble.
+       * mi/mi-main.c (mi_cmd_list_features): Report
+       "data-disassemble-a-option" feature.
+       * NEWS: Mention new -data-disassemble option -a.
+
 2018-08-13  Tom Tromey  <tom@tromey.com>
 
        * common/common-defs.h (_FORTIFY_SOURCE): Define.
index f27503134543c804c247655f0f3c2dad1e4f4567..16d3d725897c8c06124709c0203be5d24c85f72b 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -41,6 +41,14 @@ thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
   FLAG arguments allow to control what output to produce and how to handle
   errors raised when applying COMMAND to a thread.
 
+* MI changes
+
+  ** The '-data-disassemble' MI command now accepts an '-a' option to
+     disassemble the whole function surrounding the given program
+     counter value or function name.  Support for this feature can be
+     verified by using the "-list-features" command, which should
+     contain "data-disassemble-a-option".
+
 * New native configurations
 
 GNU/Linux/RISC-V               riscv*-*-linux*
index ceb4043e326a59c26c3e9d90963a6a02d599d6e9..8688b7fdd93e53be0c3a1b7ffcd83381a7b389c0 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-14  Jan Vrany  <jan.vrany@fit.cvut.cz>
+
+       * gdb.texinfo (GDB/MI Data Manipulation): Document
+       "-data-disassemble -a addr".
+       (GDB/MI Support Commands): Document "data-disassemble-a-option"
+       feature.
+
 2018-08-07  Simon Marchi  <simon.marchi@ericsson.com>
 
        * gdb.texinfo (Index Files Speed Up GDB): Add section about
index b93183440026db3b5fb13b193ce29e43e75010d9..433a2698a9264b352e560259f6157dc98a6777e3 100644 (file)
@@ -31208,6 +31208,7 @@ For details about what an addressable memory unit is,
 @smallexample
  -data-disassemble
     [ -s @var{start-addr} -e @var{end-addr} ]
+  | [ -a @var{addr} ]
   | [ -f @var{filename} -l @var{linenum} [ -n @var{lines} ] ]
   -- @var{mode}
 @end smallexample
@@ -31220,6 +31221,11 @@ Where:
 is the beginning address (or @code{$pc})
 @item @var{end-addr}
 is the end address
+@item @var{addr}
+is an address anywhere within (or the name of) the function to
+disassemble.  If an address is specified, the whole function
+surrounding that address will be disassembled.  If a name is
+specified, the whole function with that name will be disassembled.
 @item @var{filename}
 is the name of the file to disassemble
 @item @var{linenum}
@@ -33356,6 +33362,9 @@ records, produced when trying to execute an undefined @sc{gdb/mi} command
 @item exec-run-start-option
 Indicates that the @code{-exec-run} command supports the @option{--start}
 option (@pxref{GDB/MI Program Execution}).
+@item data-disassemble-a-option
+Indicates that the @code{-data-disassemble} command supports the @option{-a}
+option (@pxref{GDB/MI Data Manipulation}).
 @end ftable
 
 @subheading The @code{-list-target-features} Command
index e704e35b34b115263803072526d2a80b8d4f89be..f0f26356c2d5317b8499a0e93afe1a1c5612a707 100644 (file)
@@ -67,6 +67,7 @@ mi_cmd_disassemble (const char *command, char **argv, int argc)
   int num_seen = 0;
   int start_seen = 0;
   int end_seen = 0;
+  int addr_seen = 0;
 
   /* ... and their corresponding value. */
   char *file_string = NULL;
@@ -74,13 +75,14 @@ mi_cmd_disassemble (const char *command, char **argv, int argc)
   int how_many = -1;
   CORE_ADDR low = 0;
   CORE_ADDR high = 0;
+  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[] =
     {
@@ -89,6 +91,7 @@ mi_cmd_disassemble (const char *command, char **argv, int argc)
       {"n", NUM_OPT, 1},
       {"s", START_OPT, 1},
       {"e", END_OPT, 1},
+      {"a", ADDR_OPT, 1},
       { 0, 0, 0 }
     };
 
@@ -122,23 +125,30 @@ mi_cmd_disassemble (const char *command, char **argv, int argc)
          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)
@@ -184,6 +194,12 @@ mi_cmd_disassemble (const char *command, char **argv, int argc)
        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,
                   disasm_flags,
index 2163d4230285af2399c061ea488eb7ad4d3484f1..1e31040d1e21d86eecd39d3e4af581e0bf6e6197 100644 (file)
@@ -1683,6 +1683,7 @@ mi_cmd_list_features (const char *command, char **argv, int argc)
       uiout->field_string (NULL, "info-gdb-mi-command");
       uiout->field_string (NULL, "undefined-command-error-code");
       uiout->field_string (NULL, "exec-run-start-option");
+      uiout->field_string (NULL, "data-disassemble-a-option");
 
       if (ext_lang_initialized_p (get_ext_lang_defn (EXT_LANG_PYTHON)))
        uiout->field_string (NULL, "python");
index 33749aa6763e25693fd5f53a4921aff0cf925219..1b4dde59bb6ec427962d9bcb5710cd7f04893975 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-14  Jan Vrany  <jan.vrany@fit.cvut.cz>
+
+       * gdb.mi/mi-disassemble.exp (test_disassembly_only): Add tests for
+       -data-disassemble -a.
+       (test_disassembly_bogus_args): Likewise.
+
 2018-08-14  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gdb.mi/list-thread-groups-available.exp: Update test regexp.
index 6b1fcf58845ae81d5e970027f4ad0a180141f845..f9399477e5a0c326642b6bf714ab9af51be9eab7 100644 (file)
@@ -46,13 +46,24 @@ proc test_disassembly_only {} {
     # Test disassembly more only for the current function.
     # Tests:
     # -data-disassemble -s $pc -e "$pc+8" -- 0
+    # -data-disassemble -a $pc -- 0
+    # -data-disassemble -a callee4 -- 0
     # -data-disassembly -f basics.c -l $line_main_body -- 0
 
+
     mi_gdb_test "print/x \$pc" "" ""
     mi_gdb_test "111-data-disassemble -s \$pc -e \"\$pc + 12\" -- 0" \
            "111\\^done,asm_insns=\\\[\{address=\"$hex\",func-name=\"main\",offset=\"$decimal\",inst=\".*\"\},\{address=\"$hex\",func-name=\"main\",offset=\"$decimal\",inst=\".*\"\}.*\]" \
              "data-disassemble from pc to pc+12 assembly only"
 
+    mi_gdb_test "112-data-disassemble -a \$pc -- 0" \
+           "112\\^done,asm_insns=\\\[\{address=\"$hex\",func-name=\"main\",offset=\"$decimal\",inst=\".*\"\},\{address=\"$hex\",func-name=\"main\",offset=\"$decimal\",inst=\".*\"\}.*\]" \
+             "data-disassemble function around pc assembly only"
+
+    mi_gdb_test "113-data-disassemble -a callee4 -- 0" \
+           "113\\^done,asm_insns=\\\[\{address=\"$hex\",func-name=\"callee4\",offset=\"$decimal\",inst=\".*\"\},\{address=\"$hex\",func-name=\"callee4\",offset=\"$decimal\",inst=\".*\"\}.*\]" \
+             "data-disassemble function callee4 assembly only"
+
     mi_gdb_test "222-data-disassemble  -f basics.c -l $line_main_body -- 0" \
            "222\\^done,asm_insns=\\\[\{address=\"$hex\",func-name=\"main\",offset=\"0\",inst=\".*\"\},.*,\{address=\"$hex\",func-name=\"main\",offset=\"$decimal\",inst=\".*\"\}\\\]" \
               "data-disassemble file & line, assembly only"
@@ -207,6 +218,7 @@ proc test_disassembly_bogus_args {} {
     # Tests:
     # -data-disassembly -f foo -l abc -n 0 -- 0
     # -data-disassembly -s foo -e bar -- 0
+    # -data-disassembly -a foo -- 0
     # -data-disassembly -s $pc -f basics.c -- 0
     # -data-disassembly -f basics.c -l 32 -- 9
 
@@ -216,10 +228,14 @@ proc test_disassembly_bogus_args {} {
 
     mi_gdb_test "321-data-disassemble -s foo -e bar -- 0" \
              "321\\^error,msg=\"No symbol \\\\\"foo\\\\\" in current context.\"" \
-             "data-disassemble bogus address"
+             "data-disassemble bogus address, -s -e"
+
+    mi_gdb_test "322-data-disassemble -a foo -- 0" \
+             "322\\^error,msg=\"No symbol \\\\\"foo\\\\\" in current context.\"" \
+             "data-disassemble bogus address, -a"
 
     mi_gdb_test "456-data-disassemble -s \$pc -f basics.c -- 0" \
-             "456\\^error,msg=\"-data-disassemble: Usage: \\( .-f filename -l linenum .-n howmany.. \\| .-s startaddr -e endaddr.\\) .--. mode.\"" \
+             "456\\^error,msg=\"-data-disassemble: Usage: \\( .-f filename -l linenum .-n howmany.. \\| .-s startaddr -e endaddr. \\| .-a addr. \\) .--. mode.\"" \
              "data-disassemble mix different args"
 
     mi_gdb_test "789-data-disassemble -f basics.c -l $line_main_body -- 9" \