Eliminate the two-level data structures behind location_specs
Currently, there's the location_spec hierarchy, and then some location_spec subclasses have their own struct type holding all their data fields. I.e., there is this: location_spec explicit_location_spec linespec_location_spec address_location_spec probe_location_spec and then these separate types: explicit_location linespec_location where: explicit_location_spec has-a explicit_location linespec_location_spec has-a linespec_location This patch eliminates explicit_location and linespec_location, inlining their members in the corresponding location_spec type. The location_spec subclasses were the ones currently defined in location.c, so they are moved to the header. Since the definitions of the classes are now visible, we no longer need location_spec_deleter. Some constructors that are used for cloning location_specs, like: explicit explicit_location_spec (const struct explicit_location *loc) ... were converted to proper copy ctors. In the process, initialize_explicit_location is eliminated, and some functions that returned the "data type behind a locspec", like get_linespec_location are converted to downcast functions, like as_linespec_location_spec. Change-Id: Ia31ccef9382b25a52b00fa878c8df9b8cf2a6c5a
This commit is contained in:
parent
264f98902f
commit
40d97ee21f
9 changed files with 434 additions and 488 deletions
106
gdb/linespec.c
106
gdb/linespec.c
|
@ -94,8 +94,8 @@ struct address_entry
|
|||
|
||||
struct linespec
|
||||
{
|
||||
/* An explicit location describing the SaLs. */
|
||||
struct explicit_location explicit_loc {};
|
||||
/* An explicit location spec describing the SaLs. */
|
||||
explicit_location_spec explicit_loc;
|
||||
|
||||
/* The list of symtabs to search to which to limit the search.
|
||||
|
||||
|
@ -342,8 +342,8 @@ struct linespec_parser
|
|||
struct completion_tracker *completion_tracker = nullptr;
|
||||
};
|
||||
|
||||
/* A convenience macro for accessing the explicit location result of
|
||||
the parser. */
|
||||
/* A convenience macro for accessing the explicit location spec result
|
||||
of the parser. */
|
||||
#define PARSER_EXPLICIT(PPTR) (&PARSER_RESULT ((PPTR))->explicit_loc)
|
||||
|
||||
/* Prototypes for local functions. */
|
||||
|
@ -1990,18 +1990,14 @@ linespec_parse_basic (linespec_parser *parser)
|
|||
static void
|
||||
canonicalize_linespec (struct linespec_state *state, const linespec *ls)
|
||||
{
|
||||
location_spec *canon;
|
||||
struct explicit_location *explicit_loc;
|
||||
|
||||
/* If canonicalization was not requested, no need to do anything. */
|
||||
if (!state->canonical)
|
||||
return;
|
||||
|
||||
/* Save everything as an explicit location. */
|
||||
state->canonical->locspec
|
||||
= new_explicit_location_spec (&ls->explicit_loc);
|
||||
canon = state->canonical->locspec.get ();
|
||||
explicit_loc = get_explicit_location (canon);
|
||||
state->canonical->locspec = ls->explicit_loc.clone ();
|
||||
explicit_location_spec *explicit_loc
|
||||
= as_explicit_location_spec (state->canonical->locspec.get ());
|
||||
|
||||
if (explicit_loc->label_name != NULL)
|
||||
{
|
||||
|
@ -2019,8 +2015,7 @@ canonicalize_linespec (struct linespec_state *state, const linespec *ls)
|
|||
/* If this location originally came from a linespec, save a string
|
||||
representation of it for display and saving to file. */
|
||||
if (state->is_linespec)
|
||||
set_location_spec_string (canon,
|
||||
explicit_location_to_linespec (explicit_loc));
|
||||
set_location_spec_string (explicit_loc, explicit_loc->to_linespec ());
|
||||
}
|
||||
|
||||
/* Given a line offset in LS, construct the relevant SALs. */
|
||||
|
@ -2307,17 +2302,18 @@ convert_linespec_to_sals (struct linespec_state *state, linespec *ls)
|
|||
return sals;
|
||||
}
|
||||
|
||||
/* Build RESULT from the explicit location components SOURCE_FILENAME,
|
||||
FUNCTION_NAME, LABEL_NAME and LINE_OFFSET. */
|
||||
/* Build RESULT from the explicit location spec components
|
||||
SOURCE_FILENAME, FUNCTION_NAME, LABEL_NAME and LINE_OFFSET. */
|
||||
|
||||
static void
|
||||
convert_explicit_location_to_linespec (struct linespec_state *self,
|
||||
linespec *result,
|
||||
const char *source_filename,
|
||||
const char *function_name,
|
||||
symbol_name_match_type fname_match_type,
|
||||
const char *label_name,
|
||||
struct line_offset line_offset)
|
||||
convert_explicit_location_spec_to_linespec
|
||||
(struct linespec_state *self,
|
||||
linespec *result,
|
||||
const char *source_filename,
|
||||
const char *function_name,
|
||||
symbol_name_match_type fname_match_type,
|
||||
const char *label_name,
|
||||
struct line_offset line_offset)
|
||||
{
|
||||
std::vector<bound_minimal_symbol> minimal_symbols;
|
||||
|
||||
|
@ -2382,16 +2378,17 @@ convert_explicit_location_to_linespec (struct linespec_state *self,
|
|||
/* Convert the explicit location EXPLICIT_LOC into SaLs. */
|
||||
|
||||
static std::vector<symtab_and_line>
|
||||
convert_explicit_location_to_sals (struct linespec_state *self,
|
||||
linespec *result,
|
||||
const struct explicit_location *explicit_loc)
|
||||
convert_explicit_location_spec_to_sals
|
||||
(struct linespec_state *self,
|
||||
linespec *result,
|
||||
const explicit_location_spec *explicit_spec)
|
||||
{
|
||||
convert_explicit_location_to_linespec (self, result,
|
||||
explicit_loc->source_filename,
|
||||
explicit_loc->function_name,
|
||||
explicit_loc->func_name_match_type,
|
||||
explicit_loc->label_name,
|
||||
explicit_loc->line_offset);
|
||||
convert_explicit_location_spec_to_linespec (self, result,
|
||||
explicit_spec->source_filename,
|
||||
explicit_spec->function_name,
|
||||
explicit_spec->func_name_match_type,
|
||||
explicit_spec->label_name,
|
||||
explicit_spec->line_offset);
|
||||
return convert_linespec_to_sals (self, result);
|
||||
}
|
||||
|
||||
|
@ -2694,10 +2691,6 @@ linespec_state_destructor (struct linespec_state *self)
|
|||
|
||||
linespec_parser::~linespec_parser ()
|
||||
{
|
||||
xfree (PARSER_EXPLICIT (this)->source_filename);
|
||||
xfree (PARSER_EXPLICIT (this)->label_name);
|
||||
xfree (PARSER_EXPLICIT (this)->function_name);
|
||||
|
||||
linespec_state_destructor (PARSER_STATE (this));
|
||||
}
|
||||
|
||||
|
@ -2855,12 +2848,12 @@ linespec_complete_label (completion_tracker &tracker,
|
|||
|
||||
try
|
||||
{
|
||||
convert_explicit_location_to_linespec (PARSER_STATE (&parser),
|
||||
PARSER_RESULT (&parser),
|
||||
source_filename,
|
||||
function_name,
|
||||
func_name_match_type,
|
||||
NULL, unknown_offset);
|
||||
convert_explicit_location_spec_to_linespec (PARSER_STATE (&parser),
|
||||
PARSER_RESULT (&parser),
|
||||
source_filename,
|
||||
function_name,
|
||||
func_name_match_type,
|
||||
NULL, unknown_offset);
|
||||
}
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
|
@ -3073,24 +3066,18 @@ location_spec_to_sals (linespec_parser *parser,
|
|||
{
|
||||
case LINESPEC_LOCATION_SPEC:
|
||||
{
|
||||
const linespec_location_spec *ls = as_linespec_location_spec (locspec);
|
||||
PARSER_STATE (parser)->is_linespec = 1;
|
||||
try
|
||||
{
|
||||
const linespec_location *ls = get_linespec_location (locspec);
|
||||
result = parse_linespec (parser,
|
||||
ls->spec_string, ls->match_type);
|
||||
}
|
||||
catch (const gdb_exception_error &except)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
result = parse_linespec (parser, ls->spec_string, ls->match_type);
|
||||
}
|
||||
break;
|
||||
|
||||
case ADDRESS_LOCATION_SPEC:
|
||||
{
|
||||
const char *addr_string = get_address_string_location (locspec);
|
||||
CORE_ADDR addr = get_address_location (locspec);
|
||||
const address_location_spec *addr_spec
|
||||
= as_address_location_spec (locspec);
|
||||
const char *addr_string = addr_spec->to_string ();
|
||||
CORE_ADDR addr;
|
||||
|
||||
if (addr_string != NULL)
|
||||
{
|
||||
|
@ -3099,6 +3086,8 @@ location_spec_to_sals (linespec_parser *parser,
|
|||
PARSER_STATE (parser)->canonical->locspec
|
||||
= copy_location_spec (locspec);
|
||||
}
|
||||
else
|
||||
addr = addr_spec->address;
|
||||
|
||||
result = convert_address_location_to_sals (PARSER_STATE (parser),
|
||||
addr);
|
||||
|
@ -3107,12 +3096,11 @@ location_spec_to_sals (linespec_parser *parser,
|
|||
|
||||
case EXPLICIT_LOCATION_SPEC:
|
||||
{
|
||||
const struct explicit_location *explicit_loc;
|
||||
|
||||
explicit_loc = get_explicit_location_const (locspec);
|
||||
result = convert_explicit_location_to_sals (PARSER_STATE (parser),
|
||||
PARSER_RESULT (parser),
|
||||
explicit_loc);
|
||||
const explicit_location_spec *explicit_locspec
|
||||
= as_explicit_location_spec (locspec);
|
||||
result = convert_explicit_location_spec_to_sals (PARSER_STATE (parser),
|
||||
PARSER_RESULT (parser),
|
||||
explicit_locspec);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue