gdb/gdb-physname-expand-complet...

229 lines
7.1 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

http://sourceware.org/ml/gdb-patches/2011-04/msg00551.html
Subject: [patch] physname-related CU expansion issue for C++ (PR 12708)
Hi,
http://sourceware.org/bugzilla/show_bug.cgi?id=12708#c1
The dependency on CU expansion is a physname regression.
But the feature of originally-typed-parameters symbols was not present before
physname at all so it is rather buggy-feature than a regression.
for
typedef int int_typedef;
void f (int_typedef x) {}
gdb -nx ./1b.o -ex 'set language c++' -ex "complete b 'f(" -ex q
+ prephysname (42284fdf9d8cdb20c8e833bdbdb2b56977fea525^)
b 'f(int)
+ prephysname -readnow
b 'f(int)
+ physname (42284fdf9d8cdb20c8e833bdbdb2b56977fea525)
b 'f(int)
+ physname -readnow
b 'f(int)
b 'f(int_typedef)
+ HEAD
b 'f(int)
+ HEAD -readnow
b 'f(int)
b 'f(int_typedef)
This is another issue from the fact that partial symtabs (and even gdbindex)
no longer contain parameters as before. 'f(' can never be found any partial
symtabs, only `f' will be present there.
No regressions on {x86_64,x86_64-m32,i686}-fedora15-linux-gnu.
Thanks,
Jan
gdb/
2011-04-28 Jan Kratochvil <jan.kratochvil@redhat.com>
* symtab.c (compare_symbol_name): New function.
(completion_list_add_name, expand_partial_symbol_name): Call it,
remove the variable ncmp.
(default_make_symbol_completion_list_break_on): Reduce SYM_TEXT_LEN,
gdb_assert it.
Gdb/testsuite/
2011-04-28 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.cp/psymtab-parameter.cc: New file.
* gdb.cp/psymtab-parameter.exp: New file.
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -3489,6 +3489,40 @@ rbreak_command (char *regexp, int from_tty)
}
+/* Evaluate if NAME matches SYM_TEXT and SYM_TEXT_LEN.
+
+ Either sym_text[sym_text_len] != '(' and then we search for any
+ symbol starting with SYM_TEXT text.
+
+ Otherwise sym_text[sym_text_len] == '(' and then we require symbol name to
+ be terminated at that point. Partial symbol tables do not have parameters
+ information. */
+
+static int
+compare_symbol_name (const char *name, const char *sym_text, int sym_text_len)
+{
+ int (*ncmp) (const char *, const char *, size_t);
+
+ ncmp = (case_sensitivity == case_sensitive_on ? strncmp : strncasecmp);
+
+ if (ncmp (name, sym_text, sym_text_len) != 0)
+ return 0;
+
+ if (sym_text[sym_text_len] == '(')
+ {
+ /* User searches for `name(someth...'. Require NAME to be terminated.
+ Normally psymtabs and gdbindex have no parameter types so '\0' will be
+ present but accept even parameters presence. In this case this
+ function is in fact strcmp_iw but whitespace skipping is not supported
+ for tab completion. */
+
+ if (name[sym_text_len] != '\0' && name[sym_text_len] != '(')
+ return 0;
+ }
+
+ return 1;
+}
+
/* Helper routine for make_symbol_completion_list. */
static int return_val_size;
@@ -3508,16 +3542,10 @@ completion_list_add_name (char *symname, char *sym_text, int sym_text_len,
char *text, char *word)
{
int newsize;
- int (*ncmp) (const char *, const char *, size_t);
-
- ncmp = (case_sensitivity == case_sensitive_on ? strncmp : strncasecmp);
/* Clip symbols that cannot match. */
-
- if (ncmp (symname, sym_text, sym_text_len) != 0)
- {
- return;
- }
+ if (!compare_symbol_name (symname, sym_text, sym_text_len))
+ return;
/* We have a match for a completion, so add SYMNAME to the current list
of matches. Note that the name is moved to freshly malloc'd space. */
@@ -3707,11 +3735,8 @@ static int
expand_partial_symbol_name (const char *name, void *user_data)
{
struct add_name_data *datum = (struct add_name_data *) user_data;
- int (*ncmp) (const char *, const char *, size_t);
-
- ncmp = (case_sensitivity == case_sensitive_on ? strncmp : strncasecmp);
- return ncmp (name, datum->sym_text, datum->sym_text_len) == 0;
+ return compare_symbol_name (name, datum->sym_text, datum->sym_text_len);
}
char **
@@ -3790,6 +3815,22 @@ default_make_symbol_completion_list_break_on (char *text, char *word,
sym_text_len = strlen (sym_text);
+ /* Prepare SYM_TEXT_LEN for compare_symbol_name. */
+
+ if (current_language->la_language == language_cplus
+ || current_language->la_language == language_java
+ || current_language->la_language == language_fortran)
+ {
+ /* These languages may have parameters entered by user but they are never
+ present in the partial symbol tables. */
+
+ const char *cs = memchr (sym_text, '(', sym_text_len);
+
+ if (cs)
+ sym_text_len = cs - sym_text;
+ }
+ gdb_assert (sym_text[sym_text_len] == '\0' || sym_text[sym_text_len] == '(');
+
return_val_size = 100;
return_val_index = 0;
return_val = (char **) xmalloc ((return_val_size + 1) * sizeof (char *));
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/psymtab-parameter.cc
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+typedef int typedefed;
+void func (typedefed param)
+{
+}
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/psymtab-parameter.exp
@@ -0,0 +1,39 @@
+# Copyright 2011 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+if { [skip_cplus_tests] } { continue }
+
+
+set testfile psymtab-parameter
+set executable ${testfile}.x
+set srcfile ${testfile}.cc
+set binfile ${objdir}/${subdir}/${executable}
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {debug c++}] != "" } {
+ untested ${testfile}.exp
+ return -1
+}
+
+clean_restart $executable
+
+# As `main' is not present GDB fails to find the proper inferior language.
+gdb_test_no_output "set language c++"
+
+# The goal is to keep the CU (Compilation Unit) unexpanded. It would be rather
+# XFAIL than FAIL here. For example -readnow breaks it.
+gdb_test_no_output "maintenance info symtabs"
+
+# GDB has shown only the `func(int)' entry before.
+gdb_test "complete break 'func(" "break 'func\\(int\\)\r\nbreak 'func\\(typedefed\\)"