forked from Imagelibrary/binutils-gdb
Breakpoints in symbols with ABI tags (PR c++/19436)
Trying to set a breakpoint in a function with an ABI tag does not work currently. E.g., debugging gdb itself, we see this with the "string_printf" function: (top-gdb) b string_print [TAB] (top-gdb) b string_printf[abi:cxx11](char const*, ...) [RET] No source file named string_printf[abi. Make breakpoint pending on future shared library load? (y or [n]) Quoting doesn't help: (top-gdb) b 'string_printf[abi:cxx11]'(char const*, ...) malformed linespec error: unexpected string, "(char const*, ...)" (top-gdb) b 'string_printf[abi:cxx11](char const*, ...)' No source file named string_printf[abi. Make breakpoint pending on future shared library load? (y or [n]) n This patch fixes this, and takes it a bit further. The actual symbol name as demangled by libiberty's demangler is really string_printf[abi:cxx11](char const*, ...) however, this patch makes it possible to set the breakpoint with string_printf(char const*, ...) too. I.e., ignoring the ABI tag. And to match, it teaches the completer to complete the symbol name without the ABI tag, i.e., "string_pri<TAB>" -> "string_printf(char const*, ...)" If however, you really want to break on a symbol with the tag, then you simply start writing the tag, and GDB will preserve it, like: "string_printf[a<TAB>" -> "string_printf[abi:cxx11](char const*, ...)" Grows the gdb.linespec/ tests like this: -# of expected passes 8977 +# of expected passes 9176 gdb/ChangeLog: 2017-11-29 Pedro Alves <palves@redhat.com> PR c++/19436 * NEWS: Mention setting breakpoints on functions with C++ ABI tags. * completer.h (completion_match_for_lcd) <match, mark_ignored_range>: New methods. <finish>: Consider ignored ranges. <clear>: Clear ignored ranges. <m_ignored_ranges, m_finished_storage>: New fields. * cp-support.c (cp_search_name_hash): Ignore ABI tags. (cp_symbol_name_matches_1, cp_fq_symbol_name_matches): Pass the completion_match_for_lcd pointer to strncmp_iw_with_mode. (test_cp_symbol_name_cmp): Add [abi:...] tags unit tests. * language.c (default_symbol_name_matcher): Pass the completion_match_for_lcd pointer to strncmp_iw_with_mode. * linespec.c (linespec_lexer_lex_string): Don't tokenize ABI tags. * utils.c (skip_abi_tag): New function. (strncmp_iw_with_mode): Add completion_match_for_lcd parameter. Handle ABI tags. * utils.h (strncmp_iw_with_mode): Add completion_match_for_lcd parameter. gdb/testsuite/ChangeLog: 2017-11-29 Pedro Alves <palves@redhat.com> PR c++/19436 * gdb.linespec/cpls-abi-tag.cc: New file. * gdb.linespec/cpls-abi-tag.exp: New file. gdb/doc/ChangeLog: 2017-11-29 Pedro Alves <palves@redhat.com> PR c++/19436 * gdb.texinfo (Debugging C Plus Plus): Document setting breakpoints in functions with ABI tags.
This commit is contained in:
16
gdb/utils.h
16
gdb/utils.h
@@ -49,15 +49,19 @@ enum class strncmp_iw_mode
|
||||
/* Helper for strcmp_iw and strncmp_iw. Exported so that languages
|
||||
can implement both NORMAL and MATCH_PARAMS variants in a single
|
||||
function and defer part of the work to strncmp_iw_with_mode.
|
||||
|
||||
LANGUAGE is used to implement some context-sensitive
|
||||
language-specific comparisons. For example, for C++,
|
||||
"string1=operator()" should not match "string2=operator" even in
|
||||
MATCH_PARAMS mode. */
|
||||
extern int strncmp_iw_with_mode (const char *string1,
|
||||
const char *string2,
|
||||
size_t string2_len,
|
||||
strncmp_iw_mode mode,
|
||||
enum language language);
|
||||
MATCH_PARAMS mode.
|
||||
|
||||
MATCH_FOR_LCD is passed down so that the function can mark parts of
|
||||
the symbol name as ignored for completion matching purposes (e.g.,
|
||||
to handle abi tags). */
|
||||
extern int strncmp_iw_with_mode
|
||||
(const char *string1, const char *string2, size_t string2_len,
|
||||
strncmp_iw_mode mode, enum language language,
|
||||
completion_match_for_lcd *match_for_lcd = NULL);
|
||||
|
||||
/* Do a strncmp() type operation on STRING1 and STRING2, ignoring any
|
||||
differences in whitespace. STRING2_LEN is STRING2's length.
|
||||
|
||||
Reference in New Issue
Block a user