From eeb1af437c6f1ca111bc31b63eefc5344b553681 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Tue, 9 Feb 2016 10:02:53 -0800 Subject: [PATCH] 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. --- gdb/ChangeLog | 10 +++++++ gdb/location.c | 87 ++++++++++++++++++++++++++++++++++------------------------ gdb/location.h | 14 +++++++++- 3 files changed, 74 insertions(+), 37 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2d4713f..1077d60 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2016-02-09 Keith Seitz + + * 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 * configure.ac: Use AC_CONFIG_FILES instead of passing arguments diff --git a/gdb/location.c b/gdb/location.c index e43ebf1..bbd2696 100644 --- a/gdb/location.c +++ b/gdb/location.c @@ -522,11 +522,13 @@ string_to_explicit_location (const char **argp, struct event_location *location; /* 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 || *argp == '\0' || *argp[0] != '-' - || !isalpha ((*argp)[1])) + || !isalpha ((*argp)[1]) + || ((*argp)[0] == '-' && (*argp)[1] == 'p')) return NULL; location = new_explicit_location (NULL); @@ -634,51 +636,36 @@ string_to_explicit_location (const char **argp, /* See description in location.h. */ struct event_location * -string_to_event_location (char **stringp, - const struct language_defn *language) +string_to_event_location_basic (char **stringp, + const struct language_defn *language) { struct event_location *location; + const char *arg, *orig, *cs; - /* First, check if the string is an address location. */ - if (*stringp != NULL && **stringp == '*') + /* Try the input as a probe spec. */ + cs = *stringp; + if (cs != NULL && probe_linespec_to_ops (&cs) != NULL) { - 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; + location = new_probe_location (*stringp); + *stringp += strlen (*stringp); } else { - const char *cs; - - /* Next, 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; - /* 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); - } + 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); } } @@ -687,6 +674,34 @@ string_to_event_location (char **stringp, /* See description in location.h. */ +struct event_location * +string_to_event_location (char **stringp, + const struct language_defn *language) +{ + struct event_location *location; + const char *arg, *orig; + + /* 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 "basic" linespec, address, or probe + location. */ + location = string_to_event_location_basic (stringp, language); + } + + return location; +} + +/* See description in location.h. */ + int event_location_empty_p (const struct event_location *location) { diff --git a/gdb/location.h b/gdb/location.h index b2cf45e..8b19f34 100644 --- a/gdb/location.h +++ b/gdb/location.h @@ -207,12 +207,24 @@ extern struct event_location * but invalid, input, e.g., if it is called with missing argument parameters 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 * string_to_event_location (char **argp, 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. ARGP is advanced past any processed input. Returns an event_location (malloc'd) if an explicit location was successfully found in *ARGP, -- 2.7.4