From 5759831a2d06600a7eae4697417a388444c8e13b Mon Sep 17 00:00:00 2001 From: Tankut Baris Aktemur Date: Mon, 7 Dec 2020 09:20:31 +0100 Subject: [PATCH] gdb/linespec: relax the position of the '-force-condition' flag The break command's "-force-condition" flag is currently required to be followed by the "if" keyword. This prevents flexibility when using other keywords, e.g. "thread": (gdb) break main -force-condition thread 1 if foo Function "main -force-condition" not defined. Make breakpoint pending on future shared library load? (y or [n]) n Remove the requirement that "-force-condition" is always followed by an "if", so that more flexibility is obtained when positioning keywords. gdb/ChangeLog: 2020-12-07 Tankut Baris Aktemur * linespec.c (linespec_lexer_lex_keyword): The "-force-condition" keyword may be followed by any keyword. * breakpoint.c (find_condition_and_thread): Advance 'tok' by 'toklen' in the case for "-force-condition". gdb/testsuite/ChangeLog: 2020-12-07 Tankut Baris Aktemur * gdb.linespec/keywords.exp: Add tests to check positional flexibility of "-force-condition". --- gdb/ChangeLog | 7 ++++ gdb/breakpoint.c | 2 +- gdb/linespec.c | 45 ++++++++++++++++--------- gdb/testsuite/ChangeLog | 5 +++ gdb/testsuite/gdb.linespec/keywords.exp | 12 +++++++ 5 files changed, 54 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 64e38aebd91..60b3ce44af2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2020-12-07 Tankut Baris Aktemur + + * linespec.c (linespec_lexer_lex_keyword): The "-force-condition" + keyword may be followed by any keyword. + * breakpoint.c (find_condition_and_thread): Advance 'tok' by + 'toklen' in the case for "-force-condition". + 2020-12-07 Tankut Baris Aktemur * main.c (catch_command_errors): Add a flag parameter; invoke diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 61fbc3b92b1..881686ff7a0 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -9263,7 +9263,7 @@ find_condition_and_thread (const char *tok, CORE_ADDR pc, } else if (toklen >= 1 && strncmp (tok, "-force-condition", toklen) == 0) { - tok = cond_start = end_tok + 1; + tok = tok + toklen; force = true; } else if (toklen >= 1 && strncmp (tok, "thread", toklen) == 0) diff --git a/gdb/linespec.c b/gdb/linespec.c index 3bf16c504a2..9af8e52f53f 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -477,32 +477,45 @@ linespec_lexer_lex_keyword (const char *p) { int len = strlen (linespec_keywords[i]); - /* If P begins with one of the keywords and the next - character is whitespace, we may have found a keyword. - It is only a keyword if it is not followed by another - keyword. */ - if (strncmp (p, linespec_keywords[i], len) == 0 - && isspace (p[len])) + /* If P begins with + + - "thread" or "task" and the next character is + whitespace, we may have found a keyword. It is only a + keyword if it is not followed by another keyword. + + - "-force-condition", the next character may be EOF + since this keyword does not take any arguments. Otherwise, + it should be followed by a keyword. + + - "if", ALWAYS stop the lexer, since it is not possible to + predict what is going to appear in the condition, which can + only be parsed after SaLs have been found. */ + if (strncmp (p, linespec_keywords[i], len) == 0) { int j; - /* Special case: "-force" is always followed by an "if". */ + if (i == FORCE_KEYWORD_INDEX && p[len] == '\0') + return linespec_keywords[i]; + + if (!isspace (p[len])) + continue; + if (i == FORCE_KEYWORD_INDEX) { p += len; p = skip_spaces (p); - int nextlen = strlen (linespec_keywords[IF_KEYWORD_INDEX]); - if (!(strncmp (p, linespec_keywords[IF_KEYWORD_INDEX], nextlen) == 0 - && isspace (p[nextlen]))) - return NULL; - } + for (j = 0; linespec_keywords[j] != NULL; ++j) + { + int nextlen = strlen (linespec_keywords[j]); - /* Special case: "if" ALWAYS stops the lexer, since it - is not possible to predict what is going to appear in - the condition, which can only be parsed after SaLs have - been found. */ + if (strncmp (p, linespec_keywords[j], nextlen) == 0 + && isspace (p[nextlen])) + return linespec_keywords[i]; + } + } else if (i != IF_KEYWORD_INDEX) { + /* We matched a "thread" or "task". */ p += len; p = skip_spaces (p); for (j = 0; linespec_keywords[j] != NULL; ++j) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 62228d44293..3c28bc75a66 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-12-07 Tankut Baris Aktemur + + * gdb.linespec/keywords.exp: Add tests to check positional + flexibility of "-force-condition". + 2020-12-07 Tankut Baris Aktemur * gdb.base/bp-cmds-run-with-ex.c: New file. diff --git a/gdb/testsuite/gdb.linespec/keywords.exp b/gdb/testsuite/gdb.linespec/keywords.exp index 93bdcc9fc64..645f44fbb83 100644 --- a/gdb/testsuite/gdb.linespec/keywords.exp +++ b/gdb/testsuite/gdb.linespec/keywords.exp @@ -75,3 +75,15 @@ gdb_test "break task task 123" "Unknown task 123\\." # Test NULL location with valid conditional containing a keyword. gdb_breakpoint "thread if thread == 0" gdb_breakpoint "task if task == 0" + +# Test the positional flexibility of the "-force-condition" flag. +foreach prefix {"" "thread 1 "} { + foreach suffix {"" " " " thread 1"} { + foreach cond {"" " if 1"} { + with_test_prefix "prefix: '$prefix', suffix: '$suffix', cond: '$cond'" { + gdb_breakpoint "main ${prefix}-force-condition${suffix}${cond}"\ + "message" + } + } + } +} -- 2.30.2