[RFA] partial fix for 14643
dje@google.com
dje@google.com
Mon Oct 1 18:08:00 GMT 2012
Hi.
This patch fixes two problems I found with linespec parsing:
b thread.c:42
b thread
It does not fix "b foo:: thread ::bar()".
My fix for that is a bit hackish, and that case isn't as important.
Ok to check in?
[It depends on this patch,
http://sourceware.org/ml/gdb-patches/2012-10/msg00011.html
but only because it passes "message" to gdb_breakpoint.]
2012-10-01 Doug Evans <dje@google.com>
PR 14643.
* linespec.c (struct ls_parser): New member keyword_ok.
(linespec_lexer_lex_string): Add comment.
(linespec_lexer_lex_one): Ignore keywords if it's the wrong place
for one.
(parse_linespec): Set keyword_ok.
testsuite/
* gdb.linespec/ls-errs.exp: Change tests of "b if|task|thread".
* gdb.linespec/thread.c: New file.
* gdb.linespec/thread.exp: New file.
Index: linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.170
diff -u -p -r1.170 linespec.c
--- linespec.c 25 Sep 2012 12:22:54 -0000 1.170
+++ linespec.c 1 Oct 2012 15:35:47 -0000
@@ -286,6 +286,11 @@ struct ls_parser
/* Is the entire linespec quote-enclosed? */
int is_quote_enclosed;
+ /* Is a keyword syntactically valid at this point?
+ In, e.g., "break thread thread 1", the leading "keyword" must not
+ be interpreted as such. */
+ int keyword_ok;
+
/* The state of the parse. */
struct linespec_state state;
#define PARSER_STATE(PPTR) (&(PPTR)->state)
@@ -607,6 +612,10 @@ linespec_lexer_lex_string (linespec_pars
if (isspace (*PARSER_STREAM (parser)))
{
p = skip_spaces (PARSER_STREAM (parser));
+ /* When we get here we know we've found something followed by
+ a space (we skip over parens and templates below).
+ So if we find a keyword now, we know it is a keyword and not,
+ say, a function name. */
if (linespec_lexer_lex_keyword (p) != NULL)
{
LS_TOKEN_STOKEN (token).ptr = start;
@@ -716,8 +725,10 @@ linespec_lexer_lex_one (linespec_parser
/* Skip any whitespace. */
PARSER_STREAM (parser) = skip_spaces (PARSER_STREAM (parser));
- /* Check for a keyword. */
- keyword = linespec_lexer_lex_keyword (PARSER_STREAM (parser));
+ /* Check for a keyword, they end the linespec. */
+ keyword = NULL;
+ if (parser->keyword_ok)
+ keyword = linespec_lexer_lex_keyword (PARSER_STREAM (parser));
if (keyword != NULL)
{
parser->lexer.current.type = LSTOKEN_KEYWORD;
@@ -2024,6 +2035,10 @@ parse_linespec (linespec_parser *parser,
}
}
+ /* A keyword at the start cannot be interpreted as such.
+ Consider "b thread thread 42". */
+ parser->keyword_ok = 0;
+
parser->lexer.saved_arg = *argptr;
parser->lexer.stream = argptr;
file_exception.reason = 0;
@@ -2098,6 +2113,9 @@ parse_linespec (linespec_parser *parser,
else if (token.type != LSTOKEN_STRING && token.type != LSTOKEN_NUMBER)
unexpected_linespec_error (parser);
+ /* Now we can recognize keywords. */
+ parser->keyword_ok = 1;
+
/* Shortcut: If the next token is not LSTOKEN_COLON, we know that
this token cannot represent a filename. */
token = linespec_lexer_peek_token (parser);
Index: testsuite/gdb.linespec/ls-errs.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.linespec/ls-errs.exp,v
retrieving revision 1.4
diff -u -p -r1.4 ls-errs.exp
--- testsuite/gdb.linespec/ls-errs.exp 30 Jul 2012 17:45:37 -0000 1.4
+++ testsuite/gdb.linespec/ls-errs.exp 1 Oct 2012 15:35:48 -0000
@@ -171,7 +171,7 @@ foreach x {"3" "+100" "-100" "foo"} {
}
foreach x {"if" "task" "thread"} {
- add the_tests $x unexpected_opt "keyword" $x
+ add the_tests $x invalid_function $x
}
add the_tests "'main.c'flubber" unexpected_opt "string" "flubber"
Index: testsuite/gdb.linespec/thread.c
===================================================================
RCS file: testsuite/gdb.linespec/thread.c
diff -N testsuite/gdb.linespec/thread.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.linespec/thread.c 1 Oct 2012 15:35:48 -0000
@@ -0,0 +1,31 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 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/>. */
+
+/* http://sourceware.org/bugzilla/show_bug.cgi?id=14643 */
+
+static void
+thread ()
+{
+}
+
+int
+main ()
+{
+ int x = 0;
+ thread (); /* set breakpoint 1 here */
+ return x;
+}
Index: testsuite/gdb.linespec/thread.exp
===================================================================
RCS file: testsuite/gdb.linespec/thread.exp
diff -N testsuite/gdb.linespec/thread.exp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.linespec/thread.exp 1 Oct 2012 15:35:48 -0000
@@ -0,0 +1,41 @@
+# Copyright 2012 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/>.
+
+# http://sourceware.org/bugzilla/show_bug.cgi?id=14643
+# gdb 7.5 thinks "thread" is a linespec keyword.
+
+standard_testfile
+set exefile $testfile
+
+if {[prepare_for_testing $testfile $exefile $srcfile {debug}]} {
+ return -1
+}
+
+if ![runto_main] {
+ fail "Can't run to main"
+ return 0
+}
+
+set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
+
+gdb_test "break $srcfile:$bp_location1" \
+ "Breakpoint.*at.* file .*$srcfile, line $bp_location1\\." \
+ "breakpoint line number in file"
+
+gdb_continue_to_breakpoint "$bp_location1"
+
+gdb_breakpoint "thread" "message"
+
+gdb_continue_to_breakpoint "thread function"
More information about the Gdb-patches
mailing list