From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26474 invoked by alias); 12 Jan 2012 03:12:35 -0000 Received: (qmail 26461 invoked by uid 22791); 12 Jan 2012 03:12:33 -0000 X-SWARE-Spam-Status: No, hits=-1.2 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,TW_BJ X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 12 Jan 2012 03:12:19 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id BA4DB2BB263 for ; Wed, 11 Jan 2012 22:12:17 -0500 (EST) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id frgHGc7WQ3Y8 for ; Wed, 11 Jan 2012 22:12:17 -0500 (EST) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 7C1392BB237 for ; Wed, 11 Jan 2012 22:12:14 -0500 (EST) Received: by joel.gnat.com (Postfix, from userid 1000) id AACAF145615; Thu, 12 Jan 2012 07:11:50 +0400 (RET) Date: Thu, 12 Jan 2012 03:13:00 -0000 From: Joel Brobecker To: gdb-patches@sourceware.org Subject: Re: [RFA 2/3] Ada: allow unqualified function names in linespecs Message-ID: <20120112031150.GK31383@adacore.com> References: <20111221140128.GK23376@adacore.com> <1324636693-24034-3-git-send-email-brobecker@adacore.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1324636693-24034-3-git-send-email-brobecker@adacore.com> User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-01/txt/msg00392.txt.bz2 On Fri, Dec 23, 2011 at 02:38:12PM +0400, Joel Brobecker wrote: > This is the meat, where we replace the old la_symbol_name_compare > language method with the new ada_get_symbol_name_match_p. > It fixes the problem when trying to insert a breakpoint on "+". > > gdb/ChangeLog: > > * language.h (symbol_name_match_p_ftype): New typedef. > (struct language_defn): Replace field la_symbol_name_compare > by la_get_symbol_name_match_p. > * ada-lang.c (ada_get_symbol_name_match_p): New function. > (ada_language_defn): Use it. > * linespec.c (struct symbol_matcher_data): New type. > (iterate_name_matcher): Rewrite. > (iterate_over_all_matching_symtabs): Pass a pointer to > a symbol_matcher_data struct to expand_symtabs_matching > instead of just the lookup name. > * c-lang.c, d-lang.c, jv-lang.c, m2-lang.c, objc-lang.c, > opencl-lang.c, p-lang.c, language.c: Delete field > la_symbol_name_compare, and replace by NULL for new field > la_get_symbol_name_match_p. > * symfile.h (struct quick_symbol_functions): Update comment. Ping? http://www.sourceware.org/ml/gdb-patches/2011-12/msg00802.html Thank you! > > OK to commit? > Thanks, > -- > Joel > > --- > gdb/ada-lang.c | 14 +++++++++++++- > gdb/c-lang.c | 8 ++++---- > gdb/d-lang.c | 2 +- > gdb/f-lang.c | 2 +- > gdb/jv-lang.c | 2 +- > gdb/language.c | 6 +++--- > gdb/language.h | 29 +++++++++++++++++------------ > gdb/linespec.c | 24 +++++++++++++++++++++--- > gdb/m2-lang.c | 2 +- > gdb/objc-lang.c | 2 +- > gdb/opencl-lang.c | 2 +- > gdb/p-lang.c | 2 +- > gdb/symfile.h | 8 +++----- > 13 files changed, 68 insertions(+), 35 deletions(-) > > diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c > index 09ab38d..d871193 100644 > --- a/gdb/ada-lang.c > +++ b/gdb/ada-lang.c > @@ -12385,6 +12385,18 @@ static const struct exp_descriptor ada_exp_descriptor = { > ada_evaluate_subexp > }; > > +/* Implement the "la_get_symbol_name_match_p" language_defn method > + for Ada. */ > + > +static symbol_name_match_p_ftype > +ada_get_symbol_name_match_p (const char *lookup_name) > +{ > + if (should_use_wild_match (lookup_name)) > + return wild_match; > + else > + return compare_names; > +} > + > const struct language_defn ada_language_defn = { > "ada", /* Language name */ > language_ada, > @@ -12421,7 +12433,7 @@ const struct language_defn ada_language_defn = { > ada_print_array_index, > default_pass_by_reference, > c_get_string, > - compare_names, > + ada_get_symbol_name_match_p, /* la_get_symbol_name_match_p */ > ada_iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/c-lang.c b/gdb/c-lang.c > index 7be916c..1545d08 100644 > --- a/gdb/c-lang.c > +++ b/gdb/c-lang.c > @@ -863,7 +863,7 @@ const struct language_defn c_language_defn = > default_print_array_index, > default_pass_by_reference, > c_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > @@ -986,7 +986,7 @@ const struct language_defn cplus_language_defn = > default_print_array_index, > cp_pass_by_reference, > c_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > @@ -1027,7 +1027,7 @@ const struct language_defn asm_language_defn = > default_print_array_index, > default_pass_by_reference, > c_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > @@ -1073,7 +1073,7 @@ const struct language_defn minimal_language_defn = > default_print_array_index, > default_pass_by_reference, > c_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/d-lang.c b/gdb/d-lang.c > index fb6bacd..0af328d 100644 > --- a/gdb/d-lang.c > +++ b/gdb/d-lang.c > @@ -273,7 +273,7 @@ static const struct language_defn d_language_defn = > default_print_array_index, > default_pass_by_reference, > c_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > NULL, > LANG_MAGIC > }; > diff --git a/gdb/f-lang.c b/gdb/f-lang.c > index 00926fb..ab8fcca 100644 > --- a/gdb/f-lang.c > +++ b/gdb/f-lang.c > @@ -309,7 +309,7 @@ const struct language_defn f_language_defn = > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c > index 80fe4a1..2504151 100644 > --- a/gdb/jv-lang.c > +++ b/gdb/jv-lang.c > @@ -1197,7 +1197,7 @@ const struct language_defn java_language_defn = > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/language.c b/gdb/language.c > index 1bbbfba..739c79e 100644 > --- a/gdb/language.c > +++ b/gdb/language.c > @@ -1200,7 +1200,7 @@ const struct language_defn unknown_language_defn = > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > @@ -1243,7 +1243,7 @@ const struct language_defn auto_language_defn = > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > @@ -1284,7 +1284,7 @@ const struct language_defn local_language_defn = > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/language.h b/gdb/language.h > index 65d55db..da25ed8 100644 > --- a/gdb/language.h > +++ b/gdb/language.h > @@ -136,6 +136,16 @@ struct language_arch_info > struct type *bool_type_default; > }; > > +/* A pointer to a function expected to return nonzero if > + SYMBOL_SEARCH_NAME matches the given LOOKUP_NAME. > + > + SYMBOL_SEARCH_NAME should be a symbol's "search" name. > + LOOKUP_NAME should be the name of an entity after it has been > + transformed for lookup. */ > + > +typedef int (*symbol_name_match_p_ftype) (const char *symbol_search_name, > + const char *lookup_name); > + > /* Structure tying together assorted information about a language. */ > > struct language_defn > @@ -318,19 +328,14 @@ struct language_defn > void (*la_get_string) (struct value *value, gdb_byte **buffer, int *length, > struct type **chartype, const char **charset); > > - /* Compare two symbol names according to language rules. For > - instance, in C++, we might want to ignore whitespaces in > - the symbol name. Or some case-insensitive language might > - want to ignore casing during the match. > - > - Both STR1 and STR2 are expected to be demangled name, except > - for Ada, where STR1 and STR2 are expected to be encoded names. > - The latter is because searches are performed using the encoded > - name in Ada. > - > - The return value follows the same spirit as strcmp. */ > + /* Return a pointer to the function that should be used to match > + a symbol name against LOOKUP_NAME. This is mostly for languages > + such as Ada where the matching algorithm depends on LOOKUP_NAME. > > - int (*la_symbol_name_compare) (const char *str1, const char *str2); > + This field may be NULL, in which case strcmp_iw will be used > + to perform the matching. */ > + symbol_name_match_p_ftype (*la_get_symbol_name_match_p) > + (const char *lookup_name); > > /* Find all symbols in the current program space matching NAME in > DOMAIN, according to this language's rules. > diff --git a/gdb/linespec.c b/gdb/linespec.c > index 9d753e5..6f463a4 100644 > --- a/gdb/linespec.c > +++ b/gdb/linespec.c > @@ -323,6 +323,17 @@ cplusplus_error (const char *name, const char *fmt, ...) > throw_error (NOT_FOUND_ERROR, "%s", message); > } > > +/* Some data for the expand_symtabs_matching callback. */ > + > +struct symbol_matcher_data > +{ > + /* The lookup name against which symbol name should be compared. */ > + const char *lookup_name; > + > + /* The routine to be used for comparison. */ > + symbol_name_match_p_ftype symbol_name_match_p; > +}; > + > /* A helper for iterate_over_all_matching_symtabs that is passed as a > callback to the expand_symtabs_matching method. */ > > @@ -330,9 +341,9 @@ static int > iterate_name_matcher (const struct language_defn *language, > const char *name, void *d) > { > - const char **dname = d; > + const struct symbol_matcher_data *data = d; > > - if (language->la_symbol_name_compare (name, *dname) == 0) > + if (data->symbol_name_match_p (name, data->lookup_name)) > return 1; > return 0; > } > @@ -351,6 +362,13 @@ iterate_over_all_matching_symtabs (const char *name, > { > struct objfile *objfile; > struct program_space *pspace; > + struct symbol_matcher_data matcher_data; > + > + matcher_data.lookup_name = name; > + matcher_data.symbol_name_match_p = > + current_language->la_get_symbol_name_match_p != NULL > + ? current_language->la_get_symbol_name_match_p (name) > + : strcmp_iw; > > ALL_PSPACES (pspace) > { > @@ -369,7 +387,7 @@ iterate_over_all_matching_symtabs (const char *name, > objfile->sf->qf->expand_symtabs_matching (objfile, NULL, > iterate_name_matcher, > ALL_DOMAIN, > - &name); > + &matcher_data); > > ALL_OBJFILE_SYMTABS (objfile, symtab) > { > diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c > index c850b1f..f572f54 100644 > --- a/gdb/m2-lang.c > +++ b/gdb/m2-lang.c > @@ -401,7 +401,7 @@ const struct language_defn m2_language_defn = > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c > index cb7fa0e..3c8c0cb 100644 > --- a/gdb/objc-lang.c > +++ b/gdb/objc-lang.c > @@ -541,7 +541,7 @@ const struct language_defn objc_language_defn = { > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c > index 1deb9d8..afde3b4 100644 > --- a/gdb/opencl-lang.c > +++ b/gdb/opencl-lang.c > @@ -1024,7 +1024,7 @@ const struct language_defn opencl_language_defn = > default_print_array_index, > default_pass_by_reference, > c_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/p-lang.c b/gdb/p-lang.c > index f66d471..e633582 100644 > --- a/gdb/p-lang.c > +++ b/gdb/p-lang.c > @@ -459,7 +459,7 @@ const struct language_defn pascal_language_defn = > default_print_array_index, > default_pass_by_reference, > default_get_string, > - strcmp_iw_ordered, > + NULL, /* la_get_symbol_name_match_p */ > iterate_over_symbols, > LANG_MAGIC > }; > diff --git a/gdb/symfile.h b/gdb/symfile.h > index 91605a2..ef1ca24 100644 > --- a/gdb/symfile.h > +++ b/gdb/symfile.h > @@ -260,12 +260,10 @@ struct quick_symbol_functions > file is skipped. If FILE_MATCHER is NULL such file is not skipped. > > Otherwise, if KIND does not match this symbol is skipped. > - > + > If even KIND matches, then NAME_MATCHER is called for each symbol > - defined in the file. The current language, the symbol name and > - DATA are passed to NAME_MATCHER. The symbol "search" name should > - be passed to NAME_MATCHER (see la_symbol_name_compare in struct > - language_defn for more details on this). > + defined in the file. The current language, the symbol "search" > + name and DATA are passed to NAME_MATCHER. > > If NAME_MATCHER returns zero, then this symbol is skipped. > > -- > 1.7.1 -- Joel