[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