[binutils-gdb] gdb/linespec: relax the position of the '-force-condition' flag

Tankut Baris Aktemur aktemur@sourceware.org
Mon Dec 7 08:43:12 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5759831a2d06600a7eae4697417a388444c8e13b

commit 5759831a2d06600a7eae4697417a388444c8e13b
Author: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Date:   Mon Dec 7 09:20:31 2020 +0100

    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  <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-12-07  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
    
            * gdb.linespec/keywords.exp: Add tests to check positional
            flexibility of "-force-condition".

Diff:
---
 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  <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".
+
 2020-12-07  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
 
 	* 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  <tankut.baris.aktemur@intel.com>
+
+	* gdb.linespec/keywords.exp: Add tests to check positional
+	flexibility of "-force-condition".
+
 2020-12-07  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
 
 	* 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"
+	    }
+	}
+    }
+}


More information about the Gdb-cvs mailing list