Refactor string_to_event_location for legacy linespec support.

This patch refactors string_to_event_location, breaking it into two
separate functions:

1) string_to_event_location_basic
A "basic" string parser that implements support for "legacy" linespecs
(linespec, address, and probe locations).  This function is intended to
be used by any UI wishing/needing to support this legacy behavior.

2) string_to_event_location
This is now intended as a CLI-only function which adds explicit location
parsing in a CLI-appropriate manner (in the form of traditional option/value
pairs).

Together these patches serve to simplify string-to-event location parsing
for all existing non-CLI interfaces (MI, guile, and python).

gdb/ChangeLog

	* location.c (string_to_explicit_location): Note that "-p" is
	reserved for probe locations and return NULL for any input
	that starts with that.
	(string_to_event_location): Move "legacy" linespec code to ...
	(string_to_event_location_basic): ... here.
	* location.h (string_to_event_location): Update comment.
	(string_to_event_location_basic): New function.
This commit is contained in:
Keith Seitz 2016-02-09 10:02:53 -08:00
parent 609332f15c
commit eeb1af437c
3 changed files with 76 additions and 39 deletions

View File

@ -1,3 +1,13 @@
2016-02-09 Keith Seitz <keiths@redhat.com>
* location.c (string_to_explicit_location): Note that "-p" is
reserved for probe locations and return NULL for any input
that starts with that.
(string_to_event_location): Move "legacy" linespec code to ...
(string_to_event_location_basic): ... here.
* location.h (string_to_event_location): Update comment.
(string_to_event_location_basic): New function.
2016-02-09 Simon Marchi <simon.marchi@ericsson.com> 2016-02-09 Simon Marchi <simon.marchi@ericsson.com>
* configure.ac: Use AC_CONFIG_FILES instead of passing arguments * configure.ac: Use AC_CONFIG_FILES instead of passing arguments

View File

@ -522,11 +522,13 @@ string_to_explicit_location (const char **argp,
struct event_location *location; struct event_location *location;
/* It is assumed that input beginning with '-' and a non-digit /* It is assumed that input beginning with '-' and a non-digit
character is an explicit location. */ character is an explicit location. "-p" is reserved, though,
for probe locations. */
if (argp == NULL if (argp == NULL
|| *argp == '\0' || *argp == '\0'
|| *argp[0] != '-' || *argp[0] != '-'
|| !isalpha ((*argp)[1])) || !isalpha ((*argp)[1])
|| ((*argp)[0] == '-' && (*argp)[1] == 'p'))
return NULL; return NULL;
location = new_explicit_location (NULL); location = new_explicit_location (NULL);
@ -633,53 +635,66 @@ string_to_explicit_location (const char **argp,
/* See description in location.h. */ /* See description in location.h. */
struct event_location *
string_to_event_location_basic (char **stringp,
const struct language_defn *language)
{
struct event_location *location;
const char *arg, *orig, *cs;
/* Try the input as a probe spec. */
cs = *stringp;
if (cs != NULL && probe_linespec_to_ops (&cs) != NULL)
{
location = new_probe_location (*stringp);
*stringp += strlen (*stringp);
}
else
{
/* Try an address location. */
if (*stringp != NULL && **stringp == '*')
{
const char *arg, *orig;
CORE_ADDR addr;
orig = arg = *stringp;
addr = linespec_expression_to_pc (&arg);
location = new_address_location (addr, orig, arg - orig);
*stringp += arg - orig;
}
else
{
/* Everything else is a linespec. */
location = new_linespec_location (stringp);
}
}
return location;
}
/* See description in location.h. */
struct event_location * struct event_location *
string_to_event_location (char **stringp, string_to_event_location (char **stringp,
const struct language_defn *language) const struct language_defn *language)
{ {
struct event_location *location; struct event_location *location;
const char *arg, *orig;
/* First, check if the string is an address location. */ /* Try an explicit location. */
if (*stringp != NULL && **stringp == '*') orig = arg = *stringp;
location = string_to_explicit_location (&arg, language, 0);
if (location != NULL)
{ {
const char *arg, *orig; /* It was a valid explicit location. Advance STRINGP to
CORE_ADDR addr; the end of input. */
orig = arg = *stringp;
addr = linespec_expression_to_pc (&arg);
location = new_address_location (addr, orig, arg - orig);
*stringp += arg - orig; *stringp += arg - orig;
} }
else else
{ {
const char *cs; /* Everything else is a "basic" linespec, address, or probe
location. */
/* Next, try the input as a probe spec. */ location = string_to_event_location_basic (stringp, language);
cs = *stringp;
if (cs != NULL && probe_linespec_to_ops (&cs) != NULL)
{
location = new_probe_location (*stringp);
*stringp += strlen (*stringp);
}
else
{
const char *arg, *orig;
/* Next, try an explicit location. */
orig = arg = *stringp;
location = string_to_explicit_location (&arg, language, 0);
if (location != NULL)
{
/* It was a valid explicit location. Advance STRINGP to
the end of input. */
*stringp += arg - orig;
}
else
{
/* Everything else is a linespec. */
location = new_linespec_location (stringp);
}
}
} }
return location; return location;

View File

@ -207,12 +207,24 @@ extern struct event_location *
but invalid, input, e.g., if it is called with missing argument parameters but invalid, input, e.g., if it is called with missing argument parameters
or invalid options. or invalid options.
The return result must be freed with delete_event_location. */ The return result must be freed with delete_event_location.
This function is intended to be used by CLI commands and will parse
explicit locations in a CLI-centric way. Other interfaces should use
string_to_event_location_basic if they want to maintain support for
legacy specifications of probe, address, and linespec locations. */
extern struct event_location * extern struct event_location *
string_to_event_location (char **argp, string_to_event_location (char **argp,
const struct language_defn *langauge); const struct language_defn *langauge);
/* Like string_to_event_location, but does not attempt to parse explicit
locations. */
extern struct event_location *
string_to_event_location_basic (char **argp,
const struct language_defn *language);
/* Attempt to convert the input string in *ARGP into an explicit location. /* Attempt to convert the input string in *ARGP into an explicit location.
ARGP is advanced past any processed input. Returns an event_location ARGP is advanced past any processed input. Returns an event_location
(malloc'd) if an explicit location was successfully found in *ARGP, (malloc'd) if an explicit location was successfully found in *ARGP,