From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28282 invoked by alias); 12 Mar 2013 09:20:19 -0000 Received: (qmail 28268 invoked by uid 22791); 12 Mar 2013 09:20:14 -0000 X-SWARE-Spam-Status: No, hits=-4.1 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,RCVD_IN_HOSTKARMA_NO,RP_MATCHES_RCVD,TW_YY X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 12 Mar 2013 09:19:58 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id E7E0A2E8F5 for ; Tue, 12 Mar 2013 05:19:57 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id rFaxE0niOJ7Y for ; Tue, 12 Mar 2013 05:19:57 -0400 (EDT) Received: from kwai.gnat.com (kwai.gnat.com [205.232.38.4]) by rock.gnat.com (Postfix) with ESMTP id CD4F82E11C for ; Tue, 12 Mar 2013 05:19:57 -0400 (EDT) Received: by kwai.gnat.com (Postfix, from userid 1345) id C8FC03FF09; Tue, 12 Mar 2013 05:19:57 -0400 (EDT) From: Paul Hilfinger To: gdb-patches@sourceware.org Subject: [commit] Allow 'thread' to be used as a variable name in expressions. In-Reply-To: <20130310153348.GC3264@adacore.com> Reply-to: Hilfinger@adacore.com Message-Id: <20130312091957.C8FC03FF09@kwai.gnat.com> Date: Tue, 12 Mar 2013 09:20:00 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-03/txt/msg00503.txt.bz2 Committed (after pre-approval by Joel Brobecker): http://sourceware.org/ml/gdb-cvs/2013-03/msg00100.html http://sourceware.org/ml/gdb-cvs/2013-03/msg00101.html -------------------------------------------------- GDB treats the identifiers 'if', 'thread', and 'task' unconditionally as expression delimiters in Ada mode, which is correct for 'if' and 'task', but wrong for 'thread' in cases such as print thread Borrowing from c-exp.y, we observe that 'thread' must be followed by numerals, whereas identifiers never are and treat them as delimiters only in that case. In the process, the current also refactors and incidentally fixes the code for rewinding the input to before the delimiting tokens. For example, the code watch expr if i > 2 fails because the input is only rewound to just before the 'i', leaving the 'if' as part of the expression (and thus making the rest look like trailing junk rather than a conditional clause). gdb/ChangeLog: * ada-lex.l (rules): Only recognize 'thread' as a delimiter when followed by numerals, as for c-exp.y. Use new rewind_to_char function to rewind the input for expression-delimiting tokens. (rewind_to_char): New function. gdb/testsuite/ChangeLog: * gdb.ada/expr_delims.exp: New file. * gdb.ada/expr_delims/foo.adb: New file. * gdb.ada/expr_delims/pck.ads: New file. * gdb.ada/expr_delims/pck.adb: New file. --- gdb/ChangeLog | 8 ++++ gdb/ada-lex.l | 39 +++++++++++++----- gdb/testsuite/ChangeLog | 7 ++++ gdb/testsuite/gdb.ada/expr_delims.exp | 64 +++++++++++++++++++++++++++++ gdb/testsuite/gdb.ada/expr_delims/foo.adb | 26 ++++++++++++ gdb/testsuite/gdb.ada/expr_delims/pck.adb | 23 +++++++++++ gdb/testsuite/gdb.ada/expr_delims/pck.ads | 20 +++++++++ 7 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/expr_delims.exp create mode 100644 gdb/testsuite/gdb.ada/expr_delims/foo.adb create mode 100644 gdb/testsuite/gdb.ada/expr_delims/pck.adb create mode 100644 gdb/testsuite/gdb.ada/expr_delims/pck.ads diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fcb47da..6bb26b5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2013-03-12 Paul Hilfinger + + * ada-lex.l (rules): Only recognize 'thread' as a + delimiter when followed by numerals, as for c-exp.y. + Use new rewind_to_char function to rewind the input for + expression-delimiting tokens. + (rewind_to_char): New function. + 2013-03-11 Pedro Alves Jan Kratochvil diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l index 2bad4a1..e4d72f2 100644 --- a/gdb/ada-lex.l +++ b/gdb/ada-lex.l @@ -53,6 +53,7 @@ static int processReal (const char *); static struct stoken processId (const char *, int); static int processAttribute (const char *); static int find_dot_all (const char *); +static void rewind_to_char (int); #undef YY_DECL #define YY_DECL static int yylex ( void ) @@ -157,18 +158,19 @@ static int find_dot_all (const char *); if { - while (*lexptr != 'i' && *lexptr != 'I') - lexptr -= 1; - yyrestart(NULL); + rewind_to_char ('i'); return 0; } -(task|thread) { +task { + rewind_to_char ('t'); + return 0; + } + +thread{WHITE}+{DIG} { /* This keyword signals the end of the expression and will be processed separately. */ - while (*lexptr != 't' && *lexptr != 'T') - lexptr--; - yyrestart(NULL); + rewind_to_char ('t'); return 0; } @@ -218,8 +220,7 @@ false { return FALSEKEYWORD; } "," { if (paren_depth == 0 && comma_terminates) { - lexptr -= 1; - yyrestart(NULL); + rewind_to_char (','); return 0; } else @@ -229,8 +230,7 @@ false { return FALSEKEYWORD; } "(" { paren_depth += 1; return '('; } ")" { if (paren_depth == 0) { - lexptr -= 1; - yyrestart(NULL); + rewind_to_char (')'); return 0; } else @@ -616,6 +616,23 @@ processAttribute (const char *str) return attributes[k].code; } +/* Back up lexptr by yyleng and then to the rightmost occurrence of + character CH, case-folded (there must be one). WARNING: since + lexptr points to the next input character that Flex has not yet + transferred to its internal buffer, the use of this function + depends on the assumption that Flex calls YY_INPUT only when it is + logically necessary to do so (thus, there is no reading ahead + farther than needed to identify the next token.) */ + +static void +rewind_to_char (int ch) +{ + lexptr -= yyleng; + while (toupper (*lexptr) != toupper (ch)) + lexptr -= 1; + yyrestart (NULL); +} + int yywrap(void) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index feb38c7..8488ca7 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-03-12 Paul Hilfinger + + * gdb.ada/expr_delims.exp: New file. + * gdb.ada/expr_delims/foo.adb: New file. + * gdb.ada/expr_delims/pck.ads: New file. + * gdb.ada/expr_delims/pck.adb: New file. + 2013-03-11 Keith Seitz * watchpoint.exp (test_no_hw_watchpoints): Add test using diff --git a/gdb/testsuite/gdb.ada/expr_delims.exp b/gdb/testsuite/gdb.ada/expr_delims.exp new file mode 100644 index 0000000..c2d0306 --- /dev/null +++ b/gdb/testsuite/gdb.ada/expr_delims.exp @@ -0,0 +1,64 @@ +# Copyright 2013 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib "ada.exp" + +standard_ada_testfile foo + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } { + return -1 +} + +clean_restart ${testfile} + +set ws "\[ \t\r\n\]+" + +# Start the program in order to have some tasks running... +set bp_location [gdb_get_line_number "STOP_HERE" ${testdir}/foo.adb] +gdb_test "break foo.adb:$bp_location" \ + "Breakpoint $decimal.*" \ + +gdb_run_cmd +gdb_test "" "Breakpoint $decimal, foo \\(\\).*" +gdb_test "continue" \ + "Continuing\\..*Breakpoint $decimal, foo \\(\\).*" + +# Make sure that "thread" may be used as a variable without being mistaken +# for an expression delimiter. +gdb_test "print thread" \ + "= 1" \ + "Print variable 'thread'" + +gdb_test_no_output "delete 1" + +gdb_test "watch thread" \ + ".*atchpoint \[0-9\]+: thread" \ + "Set plain watchpoint on variable 'thread'" + +# Make sure that 'if' when followed by an expression beginning +# with 'i' works. +gdb_test "watch thread if i = 2" \ + ".*atchpoint \[0-9\]+: thread" \ + "Set conditional watchpoint." + +gdb_test "info break" \ + ".*${ws}.*atchpoint${ws}keep${ws}y${ws}thread${ws}.*atchpoint${ws}keep${ws}y${ws}thread${ws}stop only if i = 2" \ + "Check that watchpoint is set correctly." + +# Check for right error when using both 'if' and 'thread' clauses. + +gdb_test "break foo.adb:$bp_location if thread = 10 thread 999" \ + ".*Unknown thread 999\\." \ + "Combination of 'if' and 'thread' delimiters." diff --git a/gdb/testsuite/gdb.ada/expr_delims/foo.adb b/gdb/testsuite/gdb.ada/expr_delims/foo.adb new file mode 100644 index 0000000..69b8ce3 --- /dev/null +++ b/gdb/testsuite/gdb.ada/expr_delims/foo.adb @@ -0,0 +1,26 @@ +-- Copyright 2013 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +with Pck; use Pck; + +procedure Foo is + Thread: Integer; +begin + Thread := 0; + for I in 1 .. 100 loop + Thread := Thread + I; -- STOP_HERE + end loop; + Put(Integer'Image(Thread)); +end Foo; diff --git a/gdb/testsuite/gdb.ada/expr_delims/pck.adb b/gdb/testsuite/gdb.ada/expr_delims/pck.adb new file mode 100644 index 0000000..ed5e510 --- /dev/null +++ b/gdb/testsuite/gdb.ada/expr_delims/pck.adb @@ -0,0 +1,23 @@ +-- Copyright 2013 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +package body Pck is + + procedure Put(S : String) is + begin + null; + end Put; + +end Pck; diff --git a/gdb/testsuite/gdb.ada/expr_delims/pck.ads b/gdb/testsuite/gdb.ada/expr_delims/pck.ads new file mode 100644 index 0000000..bd243aa --- /dev/null +++ b/gdb/testsuite/gdb.ada/expr_delims/pck.ads @@ -0,0 +1,20 @@ +-- Copyright 2013 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +package Pck is + + procedure Put(S : String); + +end Pck; -- 1.7.9.5