This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA 2/3] Ada: allow unqualified function names in linespecs


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]