http://sourceware.org/ml/gdb-patches/2010-12/msg00263.html Index: gdb-7.2.50.20110206/gdb/cp-support.c =================================================================== --- gdb-7.2.50.20110206.orig/gdb/cp-support.c 2011-02-06 23:12:16.000000000 +0100 +++ gdb-7.2.50.20110206/gdb/cp-support.c 2011-02-06 23:12:22.000000000 +0100 @@ -35,6 +35,7 @@ #include "exceptions.h" #include "expression.h" #include "value.h" +#include "language.h" #include "safe-ctype.h" @@ -936,7 +937,8 @@ make_symbol_overload_list_qualified (con ALL_OBJFILES (objfile) { if (objfile->sf) - objfile->sf->qf->expand_symtabs_for_function (objfile, func_name); + objfile->sf->qf->expand_symtabs_for_function (objfile, func_name, + language_cplus); } /* Search upwards from currently selected frame (so that we can Index: gdb-7.2.50.20110206/gdb/dwarf2read.c =================================================================== --- gdb-7.2.50.20110206.orig/gdb/dwarf2read.c 2011-02-06 23:12:22.000000000 +0100 +++ gdb-7.2.50.20110206/gdb/dwarf2read.c 2011-02-06 23:12:22.000000000 +0100 @@ -2373,7 +2373,8 @@ dw2_lookup_symtab (struct objfile *objfi static struct symtab * dw2_lookup_symbol (struct objfile *objfile, int block_index, - const char *name, domain_enum domain) + const char *name, domain_enum domain, + enum language language) { /* We do all the work in the pre_expand_symtabs_matching hook instead. */ @@ -2449,7 +2450,8 @@ dw2_relocate (struct objfile *objfile, s static void dw2_expand_symtabs_for_function (struct objfile *objfile, - const char *func_name) + const char *func_name, + enum language language) { dw2_do_expand_symtabs_matching (objfile, func_name); } @@ -2509,7 +2511,8 @@ dw2_expand_symtabs_with_filename (struct } static const char * -dw2_find_symbol_file (struct objfile *objfile, const char *name) +dw2_find_symbol_file (struct objfile *objfile, const char *name, + enum language language) { struct dwarf2_per_cu_data *per_cu; offset_type *vec; Index: gdb-7.2.50.20110206/gdb/linespec.c =================================================================== --- gdb-7.2.50.20110206.orig/gdb/linespec.c 2011-02-06 23:12:16.000000000 +0100 +++ gdb-7.2.50.20110206/gdb/linespec.c 2011-02-06 23:12:26.000000000 +0100 @@ -1226,7 +1226,7 @@ decode_objc (char **argptr, int funfirst static struct symtabs_and_lines decode_compound (char **argptr, int funfirstline, char ***canonical, - char *saved_arg, char *p, int *not_found_ptr) + char *the_real_saved_arg, char *p, int *not_found_ptr) { struct symtabs_and_lines values; char *p2; @@ -1237,7 +1237,23 @@ decode_compound (char **argptr, int funf struct symbol *sym_class; struct type *t; char *saved_java_argptr = NULL; + char *saved_arg; + /* THE_REAL_SAVED_ARG cannot be altered, so make a copy that can be. */ + saved_arg = alloca (strlen (the_real_saved_arg) + 1); + strcpy (saved_arg, the_real_saved_arg); + + /* If the user specified "'foo::bar(baz)'" (note the quotes -- often + added to workaround completer issues) -- saved_arg will be + encapsulated in single-quotes. They are superfluous, so just strip + them off. */ + if (*saved_arg == '\'') + { + char *end = skip_quoted (saved_arg); + memmove (saved_arg, saved_arg + 1, end - saved_arg); + memmove (end - 2, end, strlen (saved_arg) + 1); + } + /* First check for "global" namespace specification, of the form "::foo". If found, skip over the colons and jump to normal symbol processing. I.e. the whole line specification starts with @@ -1489,7 +1505,7 @@ decode_compound (char **argptr, int funf up. The quotes are important if copy is empty. */ if (not_found_ptr) *not_found_ptr = 1; - cplusplus_error (saved_arg, + cplusplus_error (the_real_saved_arg, "Can't find member of namespace, " "class, struct, or union named \"%s\"\n", copy); Index: gdb-7.2.50.20110206/gdb/psymtab.c =================================================================== --- gdb-7.2.50.20110206.orig/gdb/psymtab.c 2011-02-06 23:12:16.000000000 +0100 +++ gdb-7.2.50.20110206/gdb/psymtab.c 2011-02-06 23:12:54.000000000 +0100 @@ -33,6 +33,8 @@ #include "readline/readline.h" #include "gdb_regex.h" #include "dictionary.h" +#include "language.h" +#include "cp-support.h" #ifndef DEV_TTY #define DEV_TTY "/dev/tty" @@ -55,7 +57,8 @@ static struct partial_symbol *match_part static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, const char *, int, - domain_enum); + domain_enum, + enum language); static char *psymtab_to_fullname (struct partial_symtab *ps); @@ -418,15 +421,35 @@ fixup_psymbol_section (struct partial_sy static struct symtab * lookup_symbol_aux_psymtabs (struct objfile *objfile, int block_index, const char *name, - const domain_enum domain) + const domain_enum domain, enum language language) { struct partial_symtab *ps; const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0); ALL_OBJFILE_PSYMTABS (objfile, ps) { - if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain)) - return PSYMTAB_TO_SYMTAB (ps); + if (!ps->readin + && lookup_partial_symbol (ps, name, psymtab_index, domain, language)) + { + struct symbol *sym; + struct symtab *stab = PSYMTAB_TO_SYMTAB (ps); + sym = NULL; + + /* Some caution must be observed with overloaded functions + and methods, since the psymtab will not contain any overload + information (but NAME might contain it). */ + if (stab->primary) + { + struct blockvector *bv = BLOCKVECTOR (stab); + struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); + sym = lookup_block_symbol (block, name, domain); + } + + if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) + return stab; + + /* Keep looking through other psymtabs. */ + } } return NULL; @@ -519,22 +542,58 @@ pre_expand_symtabs_matching_psymtabs (st /* Nothing. */ } +/* Returns the name used to search psymtabs. Unlike symtabs, psymtabs do + not contain any method/function instance information (since this would + force reading type information while reading psymtabs). Therefore, + if NAME contains overload information, it must be stripped before searching + psymtabs. + + The caller is responsible for freeing the return result. */ + +static const char * +psymtab_search_name (const char *name, enum language language) +{ + switch (language) + { + case language_cplus: + case language_java: + { + if (strchr (name, '(')) + { + char *ret = cp_remove_params (name); + if (ret) + return ret; + } + } + + default: + break; + } + + return xstrdup (name); +} + /* Look, in partial_symtab PST, for symbol whose natural name is NAME. Check the global symbols if GLOBAL, the static symbols if not. */ static struct partial_symbol * lookup_partial_symbol (struct partial_symtab *pst, const char *name, - int global, domain_enum domain) + int global, domain_enum domain, enum language language) { struct partial_symbol **start, **psym; struct partial_symbol **top, **real_top, **bottom, **center; int length = (global ? pst->n_global_syms : pst->n_static_syms); int do_linear_search = 1; + const char *search_name; + struct cleanup *cleanup; if (length == 0) { return (NULL); } + + search_name = psymtab_search_name (name, language); + cleanup = make_cleanup (xfree, (void *) search_name); start = (global ? pst->objfile->global_psymbols.list + pst->globals_offset : pst->objfile->static_psymbols.list + pst->statics_offset); @@ -563,7 +622,8 @@ lookup_partial_symbol (struct partial_sy { do_linear_search = 1; } - if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center), name) >= 0) + if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center), + search_name) >= 0) { top = center; } @@ -577,11 +637,14 @@ lookup_partial_symbol (struct partial_sy _("failed internal consistency check")); while (top <= real_top - && SYMBOL_MATCHES_SEARCH_NAME (*top, name)) + && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name)) { if (symbol_matches_domain (SYMBOL_LANGUAGE (*top), SYMBOL_DOMAIN (*top), domain)) - return (*top); + { + do_cleanups (cleanup); + return (*top); + } top++; } } @@ -595,11 +658,15 @@ lookup_partial_symbol (struct partial_sy { if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym), SYMBOL_DOMAIN (*psym), domain) - && SYMBOL_MATCHES_SEARCH_NAME (*psym, name)) - return (*psym); + && SYMBOL_MATCHES_SEARCH_NAME (*psym, search_name)) + { + do_cleanups (cleanup); + return (*psym); + } } } + do_cleanups (cleanup); return (NULL); } @@ -911,7 +978,8 @@ dump_psymtabs_for_objfile (struct objfil by matching FUNC_NAME. Make sure we read that symbol table in. */ static void -read_symtabs_for_function (struct objfile *objfile, const char *func_name) +read_symtabs_for_function (struct objfile *objfile, const char *func_name, + enum language language) { struct partial_symtab *ps; @@ -920,9 +988,9 @@ read_symtabs_for_function (struct objfil if (ps->readin) continue; - if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN) + if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN, language) != NULL) - || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN) + || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN, language) != NULL)) psymtab_to_symtab (ps); } @@ -1042,13 +1110,14 @@ psymtab_to_fullname (struct partial_symt } static const char * -find_symbol_file_from_partial (struct objfile *objfile, const char *name) +find_symbol_file_from_partial (struct objfile *objfile, const char *name, + enum language language) { struct partial_symtab *pst; ALL_OBJFILE_PSYMTABS (objfile, pst) { - if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN)) + if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN, language)) return pst->filename; } return NULL; Index: gdb-7.2.50.20110206/gdb/symfile.h =================================================================== --- gdb-7.2.50.20110206.orig/gdb/symfile.h 2011-02-06 23:12:16.000000000 +0100 +++ gdb-7.2.50.20110206/gdb/symfile.h 2011-02-06 23:12:22.000000000 +0100 @@ -167,14 +167,15 @@ struct quick_symbol_functions /* Check to see if the symbol is defined in a "partial" symbol table of OBJFILE. KIND should be either GLOBAL_BLOCK or STATIC_BLOCK, depending on whether we want to search global symbols or static - symbols. NAME is the name of the symbol to look for. DOMAIN - indicates what sort of symbol to search for. + symbols. NAME (valid in LANGUAGE) is the name of the symbol to look for. + DOMAIN indicates what sort of symbol to search for. Returns the newly-expanded symbol table in which the symbol is defined, or NULL if no such symbol table exists. */ struct symtab *(*lookup_symbol) (struct objfile *objfile, int kind, const char *name, - domain_enum domain); + domain_enum domain, + enum language language); /* This is called to expand symbol tables before looking up a symbol. A backend can choose to implement this and then have its @@ -200,10 +201,11 @@ struct quick_symbol_functions struct section_offsets *new_offsets, struct section_offsets *delta); - /* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that - the corresponding symbol tables are loaded. */ + /* Find all the symbols in OBJFILE named FUNC_NAME (valid in LANGUAGE), + and ensure that the corresponding symbol tables are loaded. */ void (*expand_symtabs_for_function) (struct objfile *objfile, - const char *func_name); + const char *func_name, + enum language language); /* Read all symbol tables associated with OBJFILE. */ void (*expand_all_symtabs) (struct objfile *objfile); @@ -217,8 +219,10 @@ struct quick_symbol_functions const char *filename); /* Return the file name of the file holding the symbol in OBJFILE - named NAME. If no such symbol exists in OBJFILE, return NULL. */ - const char *(*find_symbol_file) (struct objfile *objfile, const char *name); + named NAME (valid in LANGUAGE). If no such symbol exists in OBJFILE, + return NULL. */ + const char *(*find_symbol_file) (struct objfile *objfile, const char *name, + enum language language); /* Find global or static symbols in all tables that are in NAMESPACE and for which MATCH (symbol name, NAME) == 0, passing each to Index: gdb-7.2.50.20110206/gdb/symtab.c =================================================================== --- gdb-7.2.50.20110206.orig/gdb/symtab.c 2011-02-06 23:12:16.000000000 +0100 +++ gdb-7.2.50.20110206/gdb/symtab.c 2011-02-06 23:12:22.000000000 +0100 @@ -1380,7 +1380,8 @@ lookup_symbol_aux_quick (struct objfile if (!objfile->sf) return NULL; - symtab = objfile->sf->qf->lookup_symbol (objfile, kind, name, domain); + symtab = objfile->sf->qf->lookup_symbol (objfile, kind, name, domain, + current_language->la_language); if (!symtab) return NULL; @@ -1554,7 +1555,8 @@ basic_lookup_transparent_type_quick (str if (!objfile->sf) return NULL; - symtab = objfile->sf->qf->lookup_symbol (objfile, kind, name, STRUCT_DOMAIN); + symtab = objfile->sf->qf->lookup_symbol (objfile, kind, name, STRUCT_DOMAIN, + current_language->la_language); if (!symtab) return NULL; @@ -1686,7 +1688,8 @@ find_main_filename (void) if (!objfile->sf) continue; - result = objfile->sf->qf->find_symbol_file (objfile, name); + result = objfile->sf->qf->find_symbol_file (objfile, name, + current_language->la_language); if (result) return result; } Index: gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-1.cc =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-1.cc 2011-02-06 23:12:22.000000000 +0100 @@ -0,0 +1,30 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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 . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@gnu.org */ + +#include "pr11734.h" + +int +main () +{ + pr11734 *p = new pr11734; + p->foo (); + return 0; +} + Index: gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-2.cc =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-2.cc 2011-02-06 23:12:22.000000000 +0100 @@ -0,0 +1,27 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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 . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@gnu.org */ + +#include "pr11734.h" + +void +pr11734::foo(void) +{ +} + Index: gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-3.cc =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-3.cc 2011-02-06 23:12:22.000000000 +0100 @@ -0,0 +1,27 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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 . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@gnu.org */ + +#include "pr11734.h" + +void +pr11734::foo (int a) +{ +} + Index: gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-4.cc =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734-4.cc 2011-02-06 23:12:22.000000000 +0100 @@ -0,0 +1,27 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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 . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@gnu.org */ + +#include "pr11734.h" + +void +pr11734::foo (char *a) +{ +} + Index: gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734.exp 2011-02-06 23:12:22.000000000 +0100 @@ -0,0 +1,55 @@ +# Copyright 2010 Free Software Foundation, Inc. +# +# Contributed by Red Hat, originally written by Keith Seitz. +# +# 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 . + +# This file is part of the gdb testsuite. + +if { [skip_cplus_tests] } { continue } + +set testfile "pr11734" +set class $testfile + +set srcfiles {} +for {set i 1} {$i < 5} {incr i} { + lappend srcfiles $testfile-$i.cc +} + +prepare_for_testing pr11734 $testfile $srcfiles {c++ debug} + +if {![runto_main]} { + perror "couldn't run to breakpoint" + continue +} + +# An array holding the overload types for the method pr11734::foo. The +# first element is the overloaded method parameter. The second element +# is the expected source file number, e.g. "pr11734-?.cc". +array set tests { + "char*" 4 + "int" 3 + "" 2 +} + +# Test each overload instance twice: once quoted, once unquoted +foreach ovld [array names tests] { + set method "${class}::foo\($ovld\)" + set result "Breakpoint (\[0-9\]).*file .*/$class-$tests($ovld).*" + gdb_test "break $method" $result + gdb_test "break '$method'" $result +} + +gdb_exit +return 0 Index: gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.2.50.20110206/gdb/testsuite/gdb.cp/pr11734.h 2011-02-06 23:12:22.000000000 +0100 @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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 . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@gnu.org */ + +class pr11734 +{ + public: + void foo (); + void foo (int); + void foo (char *); +}; +