aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2011-05-06 13:47:07 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2011-05-06 13:47:07 +0000
commit1976171a47ef25e0b893222c5d704c89a8678ed7 (patch)
tree79d7bd281caae5d952e075f99706c3829d314c5f
parent7db6f30f9d4707b04e7292d7d8bfa5d37eaff67f (diff)
downloadgdb-1976171a47ef25e0b893222c5d704c89a8678ed7.zip
gdb-1976171a47ef25e0b893222c5d704c89a8678ed7.tar.gz
gdb-1976171a47ef25e0b893222c5d704c89a8678ed7.tar.bz2
gdb/
* 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/ * gdb.cp/psymtab-parameter.cc: New file. * gdb.cp/psymtab-parameter.exp: New file.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/symtab.c65
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.cp/psymtab-parameter.cc22
-rw-r--r--gdb/testsuite/gdb.cp/psymtab-parameter.exp39
5 files changed, 127 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 98b5fb8..b92b762 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2011-05-06 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.
+
2011-05-05 Thiago Jung Bauermann <bauerman@br.ibm.com>
Demote to sw watchpoint only in update_watchpoint.
diff --git a/gdb/symtab.c b/gdb/symtab.c
index d98ac57..7f8877f 100644
--- 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 *));
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 040b63a..e335652 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2011-05-06 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * gdb.cp/psymtab-parameter.cc: New file.
+ * gdb.cp/psymtab-parameter.exp: New file.
+
+2011-05-06 Jan Kratochvil <jan.kratochvil@redhat.com>
+
Fix a race.
* gdb.cp/static-print-quit.exp (print c): Split to ...
(print c - <return>, print c - q <return>, print c - to quit):
diff --git a/gdb/testsuite/gdb.cp/psymtab-parameter.cc b/gdb/testsuite/gdb.cp/psymtab-parameter.cc
new file mode 100644
index 0000000..a578c88
--- /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)
+{
+}
diff --git a/gdb/testsuite/gdb.cp/psymtab-parameter.exp b/gdb/testsuite/gdb.cp/psymtab-parameter.exp
new file mode 100644
index 0000000..7032239
--- /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\\)"