From patchwork Sat Jul 14 17:39:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Vrany X-Patchwork-Id: 28395 Received: (qmail 62362 invoked by alias); 14 Jul 2018 17:39:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 62348 invoked by uid 89); 14 Jul 2018 17:39:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.2 spammy=H*r:user, callee4, 20180702, Changes X-HELO: relay.fit.cvut.cz Received: from relay.fit.cvut.cz (HELO relay.fit.cvut.cz) (147.32.232.237) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 14 Jul 2018 17:39:46 +0000 Received: from imap.fit.cvut.cz (imap.fit.cvut.cz [IPv6:2001:718:2:2901:0:0:0:238] (may be forged)) by relay.fit.cvut.cz (8.15.2/8.15.2) with ESMTPS id w6EHdfZg053213 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=OK); Sat, 14 Jul 2018 19:39:43 +0200 (CEST) (envelope-from jan.vrany@fit.cvut.cz) Received: from localhost (ip-89-177-23-5.net.upcbroadband.cz [89.177.23.5]) (authenticated bits=0 as user vranyj1) by imap.fit.cvut.cz (8.15.2/8.15.2) with ESMTPSA id w6EHde7l035405 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Sat, 14 Jul 2018 19:39:41 +0200 (CEST) (envelope-from jan.vrany@fit.cvut.cz) From: Jan Vrany To: gdb-patches@sourceware.org Cc: Jan Vrany Subject: [RFC] mi: add -a option to the "-data-disassemble" command Date: Sat, 14 Jul 2018 18:39:31 +0100 Message-Id: <20180714173931.10006-1-jan.vrany@fit.cvut.cz> In-Reply-To: <83r2kglev4.fsf@gnu.org> References: <83r2kglev4.fsf@gnu.org> A CLI command "disassemble" allows use to specify a single address - in that case function surrounding that address is disassembled. This commit adds this feature to MI command "-data-disassemble". gdb/ChangeLog: * mi/mi-cmd-disas.c (mi_cmd_disassemble): Added -a option. If used, use find_pc_partial_function to find address range to disassemble. * mi/mi-main.c (mi/mi-main.c): Add new feature data-disassemble-a-option to indicate that -data-disassemble supports -a. * NEWS: Mention new -data-disassemble option -a gdb/doc/ChangeLog: * gdb.texinfo (GDB/MI Data Manipulation): Document "-data-disassemble -a addr". (GDB/MI Support Commands): Document data-disassemble-a-option feature gdb/testsuite/ChangeLog: * gdb.mi/mi-disassemble.exp (test_disassembly_only): Added tests for -data-disassemble -a. (test_disassembly_bogus_args): Likewise. --- gdb/ChangeLog | 10 +++++++++ gdb/NEWS | 3 +++ gdb/doc/ChangeLog | 7 +++++++ gdb/doc/gdb.texinfo | 9 ++++++++ gdb/mi/mi-cmd-disas.c | 28 ++++++++++++++++++------- gdb/mi/mi-main.c | 1 + gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.mi/mi-disassemble.exp | 20 ++++++++++++++++-- 8 files changed, 75 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0f601bdbf0..53a417706f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2018-07-05 Jan Vrany + + * mi/mi-cmd-disas.c (mi_cmd_disassemble): Added -a option. + If used, use find_pc_partial_function to find address range + to disassemble. + * mi/mi-main.c (mi/mi-main.c): Add new feature + data-disassemble-a-option to indicate that -data-disassemble + supports -a. + * NEWS: Mention new -data-disassemble option -a + 2018-07-02 Sebastian Huber * riscv-tdep.c (riscv_register_aliases): Swap "fp" and "s0" entries. diff --git a/gdb/NEWS b/gdb/NEWS index 839466e7e0..3367be4375 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,9 @@ *** Changes since GDB 8.1 +* The '-data-disassemble' MI command now accepts an '-a' option to disassemble + the whole function surrounding given program counter value or function name. + * The 'symbol-file' command now accepts an '-o' option to add a relative offset to all sections. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 6954398e43..f52074f2df 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,10 @@ +2018-07-05 Jan Vrany + + * gdb.texinfo (GDB/MI Data Manipulation): Document + "-data-disassemble -a addr". + (GDB/MI Support Commands): Document data-disassemble-a-option + feature + 2018-06-28 Petr Tesarik * gdb.texinfo (Files): Document "add-symbol-file -o offset". diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 7fb6ac5636..114054244c 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -30947,6 +30947,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 @@ -30959,6 +30960,11 @@ Where: is the beginning address (or @code{$pc}) @item @var{end-addr} is the end address +@item @var{addr} +is the address anywhere in function code (or function name). If @var{addr} +is specified, the whole function surrounding that address will be disassembled. +Id @var{addr} is a function name, the whole function with that name will be +disassembled. @item @var{filename} is the name of the file to disassemble @item @var{linenum} @@ -33095,6 +33101,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 diff --git a/gdb/mi/mi-cmd-disas.c b/gdb/mi/mi-cmd-disas.c index e704e35b34..51f9aa2594 100644 --- a/gdb/mi/mi-cmd-disas.c +++ b/gdb/mi/mi-cmd-disas.c @@ -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,6 +125,10 @@ 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; @@ -130,15 +137,16 @@ mi_cmd_disassemble (const char *command, char **argv, int argc) /* Allow only filename + linenum (with how_many which is not 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) - || (!line_seen && !file_seen && !num_seen && start_seen && end_seen))) + if (!((line_seen && file_seen && num_seen && !start_seen && !end_seen && !addr_seen) + || (line_seen && file_seen && !num_seen && !start_seen && !end_seen && !addr_seen) + || (!line_seen && !file_seen && !num_seen && start_seen && end_seen && !addr_seen) + || (!line_seen && !file_seen && !num_seen && !start_seen && !end_seen && addr_seen))) error (_("-data-disassemble: Usage: ( [-f filename -l linenum [-n " - "howmany]] | [-s startaddr -e endaddr]) [--] mode.")); + "howmany]] | [-s startaddr -e endaddr] | [-a addr] ) [--] mode.")); if (argc != 1) - error (_("-data-disassemble: Usage: [-f filename -l linenum " - "[-n howmany]] [-s startaddr -e endaddr] [--] mode.")); + 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 +192,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, diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 2177abd0ed..f503b3149e 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -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"); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 93c849c040..11d1440535 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-07-05 Jan Vrany + + * gdb.mi/mi-disassemble.exp (test_disassembly_only): Added + tests for -data-disassemble -a. + (test_disassembly_bogus_args): Likewise. + 2018-06-29 Pedro Alves * gdb.threads/names.exp: Adjust expected "info threads" output. diff --git a/gdb/testsuite/gdb.mi/mi-disassemble.exp b/gdb/testsuite/gdb.mi/mi-disassemble.exp index 6b1fcf5884..bbf29d7b63 100644 --- a/gdb/testsuite/gdb.mi/mi-disassemble.exp +++ b/gdb/testsuite/gdb.mi/mi-disassemble.exp @@ -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 "112-data-disassemble -a callee4 -- 0" \ + "112\\^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" \