[PATCH] gdb/linespec: relax the position of the '-force-condition' flag
Aktemur, Tankut Baris
tankut.baris.aktemur@intel.com
Fri Nov 27 16:11:37 GMT 2020
Kindly pinging.
Thanks.
-Baris
On Wednesday, November 11, 2020 1:55 PM, Aktemur, Tankut Baris wrote:
> 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-11-11 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
>
> * 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-11-11 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
>
> * gdb.linespec/keywords.exp: Add tests to check positional
> flexibility of "-force-condition".
> ---
> gdb/breakpoint.c | 2 +-
> gdb/linespec.c | 45 ++++++++++++++++---------
> gdb/testsuite/gdb.linespec/keywords.exp | 12 +++++++
> 3 files changed, 42 insertions(+), 17 deletions(-)
>
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index 23278320d9d..d53b427904f 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 74560953d71..07f938b6f41 100644
> --- a/gdb/linespec.c
> +++ b/gdb/linespec.c
> @@ -478,32 +478,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/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.17.1
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Gary Kershaw
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
More information about the Gdb-patches
mailing list