From patchwork Thu Mar 13 02:32:30 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 61 Return-Path: X-Original-To: siddhesh@wilcox.dreamhost.com Delivered-To: siddhesh@wilcox.dreamhost.com Received: from homiemail-mx21.g.dreamhost.com (caibbdcaaahb.dreamhost.com [208.113.200.71]) by wilcox.dreamhost.com (Postfix) with ESMTP id 210FC360194 for ; Wed, 12 Mar 2014 19:35:38 -0700 (PDT) Received: by homiemail-mx21.g.dreamhost.com (Postfix, from userid 14314964) id 6C32EC38854; Wed, 12 Mar 2014 19:35:37 -0700 (PDT) X-Original-To: gdb@patchwork.siddhesh.in Delivered-To: x14314964@homiemail-mx21.g.dreamhost.com Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by homiemail-mx21.g.dreamhost.com (Postfix) with ESMTPS id E0A75C181B8 for ; Wed, 12 Mar 2014 19:35:36 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-type; q=dns; s=default; b=AjaiY f64BTOURPyS8c86wOANL65KNeytFcjKzw4KBjDRICHTy8MkA7qudbFNFx7/ZlEbP LS5vyFkv4yXX4377llicI4biQ5rSunQOpMAcfz5vVUI2Y14nO4rmiOYwU59KXUOd QClVaRjWJzYkj3OagAhmFXhLyie0iejBETRYnw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-type; s=default; bh=ArmzC/akPcy DYnEKZTy3+RwSHWw=; b=Ww2Nle7BC9FRQxEwkHGYU0aGydteuxkeFeByDJyT1IL 65rl0xRH8Od0HjS+yRXHuMvjKaRzqZiTUBfB/TMSSQp9BrxSjn6Gwj4PnBhfLlVV RSBiam4oFCO2A9PnPV386oAB6ebKG7v+vIy+qLEoxz7scztFysy+Vol8ZeTNuRWc = Received: (qmail 6235 invoked by alias); 13 Mar 2014 02:35:15 -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 6133 invoked by uid 89); 13 Mar 2014 02:35:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 13 Mar 2014 02:35:12 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1WNvUF-0001PU-BW from Yao_Qi@mentor.com for gdb-patches@sourceware.org; Wed, 12 Mar 2014 19:35:11 -0700 Received: from SVR-ORW-FEM-03.mgc.mentorg.com ([147.34.97.39]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Wed, 12 Mar 2014 19:35:11 -0700 Received: from qiyao.dyndns.org.com (147.34.91.1) by svr-orw-fem-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server id 14.2.247.3; Wed, 12 Mar 2014 19:35:10 -0700 From: Yao Qi To: Subject: [PATCH 5/5] Accept convenience variable in commands -break-passcount and -break-commands Date: Thu, 13 Mar 2014 10:32:30 +0800 Message-ID: <1394677950-4054-6-git-send-email-yao@codesourcery.com> In-Reply-To: <1394677950-4054-1-git-send-email-yao@codesourcery.com> References: <1394677950-4054-1-git-send-email-yao@codesourcery.com> MIME-Version: 1.0 X-IsSubscribed: yes X-DH-Original-To: gdb@patchwork.siddhesh.in Hi, When I modify a MI test case to avoid hard code breakpoint number in the testcase, commands -break-passcount and -break-commands only accepts numbers and rejects convenience variables, such as $bpnum, as invalid input. This patch teaches these commands to accept convenience variables, and avoid hard code breakpoint number in test case. I add a NEWS entry since it is user visible. However, I didn't update the manual because manual doesn't mention that commands 'enable' 'disable' accept convenience variable explicitly, likewise, doesn't mention this for MI commands. Some test cases are updated to replace hard code number with convenience variables. gdb: 2014-03-13 Yao Qi * cli/cli-utils.c (get_number_quiet): New function. * cli/cli-utils.h (get_number_quiet): Declare. * mi/mi-cmd-break.c: Include "cli/cli-utils.h". (mi_cmd_break_passcount): Use get_number_quiet instead of atoi. (mi_cmd_break_commands): Likewise. * NEWS: Mention that commands -break-passcount and -break-commands accept convenience variable. gdb/testsuite: 2014-03-13 Yao Qi * gdb.mi/mi-break.exp: Test the error messages to invalid input for -break-commands. * gdb.mi/mi-breakpoint-changed.exp (test_insert_delete_modify): Test command -break-passcount accepts convenience variable. * gdb.trace/mi-trace-frame-collected.exp: Test command -break-commands accepts convenience variable. * gdb.trace/mi-trace-unavailable.exp: Likewise. --- gdb/NEWS | 5 ++++ gdb/cli/cli-utils.c | 8 ++++++ gdb/cli/cli-utils.h | 4 +++ gdb/mi/mi-cmd-break.c | 26 +++++++++++++++---- gdb/testsuite/gdb.mi/mi-break.exp | 8 ++++++ gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp | 2 + .../gdb.trace/mi-trace-frame-collected.exp | 4 +- gdb/testsuite/gdb.trace/mi-trace-unavailable.exp | 4 +- 8 files changed, 51 insertions(+), 10 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 2a384ba..f667538 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -95,6 +95,11 @@ PowerPC64 GNU/Linux little-endian powerpc64le-*-linux* and "assf"), have been deprecated. Use the "sharedlibrary" command, or its alias "share", instead. +* MI changes + + ** The commands -break-passcount and -break-commands accept convenience + variable as breakpoint number. + *** Changes in GDB 7.7 * Improved support for process record-replay and reverse debugging on diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c index 53211a4..b906a0f 100644 --- a/gdb/cli/cli-utils.c +++ b/gdb/cli/cli-utils.c @@ -125,6 +125,14 @@ print_get_number_status (enum get_number_status status) /* See documentation in cli-utils.h. */ enum get_number_status +get_number_quiet (char **pp, int *number) +{ + return get_number_trailer (pp, '\0', number); +} + +/* See documentation in cli-utils.h. */ + +enum get_number_status get_number (char **pp, int *number) { enum get_number_status status; diff --git a/gdb/cli/cli-utils.h b/gdb/cli/cli-utils.h index eee23f4..fc938ec 100644 --- a/gdb/cli/cli-utils.h +++ b/gdb/cli/cli-utils.h @@ -51,6 +51,10 @@ enum get_number_status extern enum get_number_status get_number (char **pp, int *number); +/* Similar to get_number, but it doesn't print messages. */ + +extern enum get_number_status get_number_quiet (char **pp, int *number); + /* An object of this type is passed to get_number_or_range. It must be initialized by calling init_number_or_range. This type is defined here so that it can be stack-allocated, but all members diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c index 29e3fb3..4ef8eb5 100644 --- a/gdb/mi/mi-cmd-break.c +++ b/gdb/mi/mi-cmd-break.c @@ -32,6 +32,7 @@ #include "mi-cmd-break.h" #include "gdb_obstack.h" #include +#include "cli/cli-utils.h" enum { @@ -330,12 +331,18 @@ mi_cmd_break_passcount (char *command, char **argv, int argc) int n; int p; struct tracepoint *t; + char *s; if (argc != 2) error (_("Usage: tracepoint-number passcount")); - n = atoi (argv[0]); - p = atoi (argv[1]); + s = argv[0]; + if (get_number_quiet (&s, &n) != GET_NUMBER_OK) + error (_("Invalid tracepoint number \"%s\"."), argv[0]); + + s = argv[1]; + if (get_number_quiet (&s, &p) != GET_NUMBER_OK) + error (_("Invalid passcount number \"%s\"."), argv[1]); t = get_tracepoint (n); if (t) @@ -437,18 +444,25 @@ void mi_cmd_break_commands (char *command, char **argv, int argc) { struct command_line *break_command; - char *endptr; + int bnum; struct breakpoint *b; + char *p = argv[0]; + enum get_number_status status; if (argc < 1) error (_("USAGE: %s [ [...]]"), command); - bnum = strtol (argv[0], &endptr, 0); - if (endptr == argv[0]) + status = get_number_quiet (&p, &bnum); + + if (status == GET_NUMBER_E_HISTORY_VALUE_TYPE) + error (_("history value must have integer type")); + else if (status == GET_NUMBER_E_CONVENIENCE_TYPE) + error (_("convenience variable must have integer value")); + else if (status == GET_NUMBER_E_NOT_NUMBER) error (_("breakpoint number argument \"%s\" is not a number."), argv[0]); - else if (*endptr != '\0') + else if (status == GET_NUMBER_E_TRAILING_JUNK) error (_("junk at the end of breakpoint number argument \"%s\"."), argv[0]); diff --git a/gdb/testsuite/gdb.mi/mi-break.exp b/gdb/testsuite/gdb.mi/mi-break.exp index a9064fd..ea8fb37 100644 --- a/gdb/testsuite/gdb.mi/mi-break.exp +++ b/gdb/testsuite/gdb.mi/mi-break.exp @@ -232,6 +232,14 @@ proc test_breakpoint_commands {} { mi_create_breakpoint "basics.c:callee2" 7 keep callee2 ".*basics.c" $line_callee2_body $hex \ "breakpoint commands: insert breakpoint at basics.c:callee2" + mi_gdb_test "-break-commands xyz \"print 10\" \"continue\"" \ + "\\^error,msg=\"breakpoint number argument \\\\\"xyz\\\\\" is not a number\..*" \ + "breakpoint commands: not a number" + + mi_gdb_test "-break-commands 7.7 \"print 10\" \"continue\"" \ + "\\^error,msg=\"junk at the end of breakpoint number argument \\\\\"7\.7\\\\\".*" \ + "breakpoint commands: junk at the end" + mi_gdb_test "-break-commands 7 \"print 10\" \"continue\"" \ "\\^done" \ "breakpoint commands: set commands" diff --git a/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp b/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp index aa991cf..6049d2c 100644 --- a/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp +++ b/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp @@ -141,6 +141,8 @@ proc test_insert_delete_modify { } { # notification. mi_gdb_test "-break-passcount 4 1" "\\^done" \ "-break-passcount 4 1" + mi_gdb_test "-break-passcount \$tpnum 2" "\\^done" \ + "-break-passcount \$tpnum 2" # Delete some breakpoints and verify that '=breakpoint-deleted # notification is correctly emitted. diff --git a/gdb/testsuite/gdb.trace/mi-trace-frame-collected.exp b/gdb/testsuite/gdb.trace/mi-trace-frame-collected.exp index e0f5f8d..9b1c638 100644 --- a/gdb/testsuite/gdb.trace/mi-trace-frame-collected.exp +++ b/gdb/testsuite/gdb.trace/mi-trace-frame-collected.exp @@ -63,7 +63,7 @@ if [is_amd64_regs_target] { return -1 } -mi_gdb_test "-break-commands 3 \"collect gdb_char_test\" \"collect gdb_union1_test\" \"collect gdb_struct1_test.l\" \"collect gdb_arr_test\[0\]\" \"collect $${pcreg}\" \"teval \$tsv += 1\" \"collect \$tsv\" \"end\" " \ +mi_gdb_test "-break-commands \$bpnum \"collect gdb_char_test\" \"collect gdb_union1_test\" \"collect gdb_struct1_test.l\" \"collect gdb_arr_test\[0\]\" \"collect $${pcreg}\" \"teval \$tsv += 1\" \"collect \$tsv\" \"end\" " \ {\^done} "set action" mi_gdb_test "-break-insert -a gdb_c_test" \ @@ -73,7 +73,7 @@ mi_gdb_test "-break-insert -a gdb_c_test" \ # Define an action. # Collect a global variable to be sure no registers are collected # except PC. -mi_gdb_test "-break-commands 4 \"collect gdb_char_test\" \"end\" " \ +mi_gdb_test "-break-commands \$bpnum \"collect gdb_char_test\" \"end\" " \ {\^done} "set action on tracepoint 4" mi_gdb_test "-trace-start" {.*\^done} "trace start" diff --git a/gdb/testsuite/gdb.trace/mi-trace-unavailable.exp b/gdb/testsuite/gdb.trace/mi-trace-unavailable.exp index 6dd0415..4f5dd22 100644 --- a/gdb/testsuite/gdb.trace/mi-trace-unavailable.exp +++ b/gdb/testsuite/gdb.trace/mi-trace-unavailable.exp @@ -49,7 +49,7 @@ mi_gdb_test "-break-insert -a bar" \ "insert tracepoint on bar" # Define an action. -mi_gdb_test "-break-commands 3 \"collect array\" \"collect j\" \"end\" " \ +mi_gdb_test "-break-commands \$bpnum \"collect array\" \"collect j\" \"end\" " \ {\^done} "set action" mi_gdb_test "-break-insert -a foo" \ @@ -57,7 +57,7 @@ mi_gdb_test "-break-insert -a foo" \ "insert tracepoint on foo" # Collect 'main' to make sure no registers are collected except PC. -mi_gdb_test "-break-commands 4 \"collect main\" \"end\" " \ +mi_gdb_test "-break-commands \$bpnum \"collect main\" \"end\" " \ {\^done} "set action on tracepoint 4" mi_gdb_test "-trace-start" {.*\^done} "trace start"