f314eb3eb5
Fix -O2 -g breakpoints internal error + prologue skipping (BZ 612253). Fix case insensitive symbols for Fortran by iFort (BZ 645773). Fix physname-related CU expansion issue for C++ (PR 12708). Fix Python access to inlined frames (BZ 694824).
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\\)"
|
||
|