[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