linespec rewrite:

* linespec.c (decode_compound): Remove.
	(enum offset_relative_sign): New enum.
	(struct line_offset): New struct.
	(struct linespec): New struct.
	(struct linespec_state): Move file_symtabs,
	user_filename, and user_function into struct linespec.
	Make result an anonymous struct holding vectors of
	symbolp and minsym_and_objfile_d.
	Add language member.
	(enum ls_token_type): New enum.
	(linespec_keywords): New array.
	(struct ls_token): New struct.
	(struct ls_parser): New struct.
	(linespec_lexer_lex_number): New function.
	(linespec_lexer_lex_keyword): New function.
	(is_ada_operator): New function.
	(skip_quote_char): New function.
	(copy_token_string): New function.
	(is_closing_quote_enclosed): New function.
	(find_parameter_list_end): New function.
	(linespec_lexer_lex_string): New function.
	(linespec_lexer_lex_one): New function.
	(linespec_lexer_consume_token): New function.
	(linespec_lexer_peek_token): New function.
	(cplusplus_error): Remove unused function.
	(find_methods): Update comment.
	(find_toplevel_char): Return const.
	(is_objc_method_format): Remove unused function.
	(find_toplevel_string): New function.
	(is_linespec_boundary): Remove.
	(symbol_not_found_error): New function.
	(find_method_overload_end): Remove function.
	(unexpected_linespec_error): New function.
	(keep_name_info): Remove.
	(linespec_parse_line_offset): New function.
	(linespec_parse_basic): New function.
	(canonicalize_linespec): New function.
	(decode_line_internal): Remove.
	(create_sals_line_offset): New function adapted from
	decode_all_digits.
	(convert_linespec_to_sals): New function.
	(parse_linespec): New function.
	(linespec_parser_new): New function.
	(linespec_state_destructor): Change parameter type to
	struct linespec_state *.
	Add language parameter.
	Remove freeing of moved members.
	(linespec_parser_delete): New function.
	(decode_line_full): Use parse_linespec and linespec_parser_new.
	(decode_line_1): Likewise.
	(decode_indirect): Rename to ...
	(linespec_expression_to_pc): ... this and rewrite
	to simply find CORE_ADDR, storing this result for later
	conversion to SALs.
	(locate_first_half): Remove.
	(deocde_objc): Add parameter LS.
	Initialize new struct collect_info members.
	Handle minimal symbols, too.
	(decode_compound): Delete.
	(lookup_prefix_sym): Rewrite.
	(compare_msymbols): New function.
	(find_method): Rewrite.
	Do not call cplusplus_error.
	(symtabs_from_filename): Rewrite.
	(collect_function_symbols): Delete.
	(find_function_symbols): Rewrite without ARGPTR-style
	processing.
	(decode_all_digits): Delete. (Rewritten as create_sals_line_offset.)
	(decode_dollar): Adapted and renamed to ...
	(linespec_parse_variable): ... this.
	(find_linespec_symbols): New function.
	(decode_label): Adapted and renamed to ...
	(find_label_symbols): ... this.
	(decode_digits_list_mode): Add and use LS argument.
	(decode_digits_ordinary): Likewise.
	(collect_symbols): Do not collect SALs, just symbols and msymbols.
	If in list mode, allow any symbol class.  Otherwise, only
	permit LOC_BLOCK symbols.
	(minsym_found): Update comments.
	(search_minsyms_for_name): Do not convert the matching symbol
	into a SAL.  Simply push the symbol and objfile into the
	result vector.
	(decode_variable): Delete. Contents adapted into
	find_linespec_symbols.

	* cp-support.c (SKIP_SPACE): Remove.
	(operator_tokens): Remove unused global.
	(cp_validate_operator): Remove.
	* cp-support.h (cp_validate_operator): Remove declaration.

	* gdb.base/advance.exp: Update error message for
	"advance malformed" test.
	* gdb.base/break.exp: Likewise for "breakpoint with
	trailing garbage" test.
	* gdb.base/hbreak2.exp: Likewise for "hardware breakpoint
	with trailing garbage" test.
	* gdb.base/jump.exp: Likewise for "jump with trailing
	argument junk" test.
	* gdb.base/sepdebug.exp: Likewise for "breakpoint with
	trailng garbage" test.
	* gdb.base/until.exp: Likewise for "malformed until" test.
	* gdb.cp/ovldbreak.exp: Create the breakpoint table
	for "breakpoint info (after setting on all)".
	* gdb.cp/userdef.exp: Remove quoting for "break A2::operator+"
	tests.
	* gdb.cp/cplabel.cc: New file.
	* gdb.cp/cplabel.exp: New test.
	* gdb.linespec/ls-errs.c: New file.
	* gdb.linespec/ls-errs.exp: New test.
This commit is contained in:
Keith Seitz
2012-04-05 18:50:29 +00:00
parent 9d236627e7
commit 40e084e177
17 changed files with 2325 additions and 1663 deletions

View File

@@ -73,19 +73,6 @@ struct cmd_list_element *maint_cplus_cmd_list = NULL;
static void maint_cplus_command (char *arg, int from_tty);
static void first_component_command (char *arg, int from_tty);
/* Operator validation.
NOTE: Multi-byte operators (usually the assignment variety
operator) must appear before the single byte version, i.e., "+="
before "+". */
static const char *operator_tokens[] =
{
"++", "+=", "+", "->*", "->", "--", "-=", "-", "*=", "*",
"/=", "/", "%=", "%", "!=", "==", "!", "&&", "<<=", "<<",
">>=", ">>", "<=", "<", ">=", ">", "~", "&=", "&", "|=",
"||", "|", "^=", "^", "=", "()", "[]", ",", "new", "delete"
/* new[] and delete[] require special whitespace handling */
};
/* A list of typedefs which should not be substituted by replace_typedefs. */
static const char * const ignore_typedefs[] =
{
@@ -1459,110 +1446,6 @@ first_component_command (char *arg, int from_tty)
extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */
#define SKIP_SPACE(P) \
do \
{ \
while (*(P) == ' ' || *(P) == '\t') \
++(P); \
} \
while (0)
/* Returns the length of the operator name or 0 if INPUT does not
point to a valid C++ operator. INPUT should start with
"operator". */
int
cp_validate_operator (const char *input)
{
int i;
char *copy;
const char *p;
struct expression *expr;
struct value *val;
volatile struct gdb_exception except;
p = input;
if (strncmp (p, "operator", 8) == 0)
{
int valid = 0;
p += 8;
SKIP_SPACE (p);
for (i = 0;
i < sizeof (operator_tokens) / sizeof (operator_tokens[0]);
++i)
{
int length = strlen (operator_tokens[i]);
/* By using strncmp here, we MUST have operator_tokens
ordered! See additional notes where operator_tokens is
defined above. */
if (strncmp (p, operator_tokens[i], length) == 0)
{
const char *op = p;
valid = 1;
p += length;
if (strncmp (op, "new", 3) == 0
|| strncmp (op, "delete", 6) == 0)
{
/* Special case: new[] and delete[]. We must be
careful to swallow whitespace before/in "[]". */
SKIP_SPACE (p);
if (*p == '[')
{
++p;
SKIP_SPACE (p);
if (*p == ']')
++p;
else
valid = 0;
}
}
if (valid)
return (p - input);
}
}
/* Check input for a conversion operator. */
/* Skip past base typename. */
while (*p != '*' && *p != '&' && *p != 0 && *p != ' ')
++p;
SKIP_SPACE (p);
/* Add modifiers '*' / '&'. */
while (*p == '*' || *p == '&')
{
++p;
SKIP_SPACE (p);
}
/* Check for valid type. [Remember: input starts with
"operator".] */
copy = savestring (input + 8, p - input - 8);
expr = NULL;
val = NULL;
TRY_CATCH (except, RETURN_MASK_ALL)
{
expr = parse_expression (copy);
val = evaluate_type (expr);
}
xfree (copy);
if (expr)
xfree (expr);
if (val != NULL && value_type (val) != NULL)
return (p - input);
}
return 0;
}
/* Implement "info vtbl". */