diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/ada-lex.l | 39 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/expr_delims.exp | 64 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/expr_delims/foo.adb | 26 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/expr_delims/pck.adb | 23 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/expr_delims/pck.ads | 20 |
7 files changed, 176 insertions, 11 deletions
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 <hilfingr@adacore.com> + + * 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 <palves@redhat.com> Jan Kratochvil <jan.kratochvil@redhat.com> 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 <hilfingr@adacore.com> + + * 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 <keiths@redhat.com> * 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 <http://www.gnu.org/licenses/>. + +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 <http://www.gnu.org/licenses/>. + +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 <http://www.gnu.org/licenses/>. + +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 <http://www.gnu.org/licenses/>. + +package Pck is + + procedure Put(S : String); + +end Pck; |