229 lines
7.1 KiB
Diff
229 lines
7.1 KiB
Diff
|
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\\)"
|
|||
|
|