Commit 5759831a authored by Tankut Baris Aktemur's avatar Tankut Baris Aktemur
Browse files

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".
parent 21e051b3
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
......
......@@ -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)
......
......@@ -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)
......
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.
......
......@@ -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"
}
}
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment