[RFA 1/3] Linespec rewrite: Parsing

Keith Seitz keiths@redhat.com
Mon Mar 19 21:21:00 GMT 2012


Hello,

Let me again apologize for the size of this patch. Basically, this is 
going to be the "interesting" bits for reviewers. This patch is really 
huge. Bigger than linespec.c itself. Much of this is simply diff noise 
caused by some "new" functions looking too much like "old" functions and 
diff trying to be too clever.

There are some important points I'd like to mention about what this 
patch does that is different from what is done today (or otherwise 
noteworthy):

- This patch does make one incompatible change with current linespec 
handling: quoting. Users may not quote multiple "pieces" of the linespec 
anymore. [Although users may still use either \' or \".]

Currently, you may type "break 'source.c:3'". However, in an effort to 
halt the quoting insanity, users now must not put the two pieces 
"source.c" and "3" inside the (same) quotes. [In this case, quotes 
aren't needed at all.] I've pretty much implemented the quoting ideas 
discussed here: 
http://sourceware.org/ml/gdb-patches/2011-08/msg00506.html, with some 
exceptions: 1) Spaces need not be quoted. The lexer only cares about 
quotes and colons. 2) A colon in a linespec (not scope operator) /must/ 
be quoted, e.g., "file:foo.c" must be quoted: "break 'file::bar.c':3".
[Note: double-colon okay, since the lexer "mistakes" it for scope 
operator, e.g., "break foo::main.c:3" will "just (coincidentally) 
work."] Windows drive letters are okay, too.

- I've introduced a bunch of new error messages. We no longer see "Junk 
at end of arguments." Instead, you'll see messages like, 'malformed 
linespec error: unexpected string, "foobar"'. I encourage all reviewers 
to review these new error messages. [The new test, ls-errs.exp, may be 
helpful for this purpose.]

- The patch passes the test suite, giving /identical/ results with 
current CVS HEAD. I've enabled C, C++, Obj-C, Java, Ada, and Fortran in 
my testing (or at least think I have), but I would welcome people of 
other languages to give this a spin.

- I have kept the current "short-circuit" design for Obj-C unchanged, so 
Obj-C users will see no benefit/new features from this patch until 
someone addresses this.

- Canonicalization is consolidated -- both linespec canonicalization and 
input canonicalization (i.e., cp_canonicalize_string).

There's probably a lot more, but these are the most notable. The code 
tells all.

Again, I apologize for the size of this patch (and the ChangeLog). It 
really all boils down to this (grossly oversimplified) ChangeLog entry:

	* linespec.c: Rewrite.

Keith

ChangeLog
2012-03-19  Keith Seitz  <keiths@redhat.com>

	* 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.
	(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.
	(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 *.
	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.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: linespec-rewrite-parser.patch
Type: text/x-patch
Size: 117952 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20120319/8e541f6d/attachment.bin>


More information about the Gdb-patches mailing list