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".
This commit is contained in:
parent
21e051b3d6
commit
5759831a2d
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user