diff options
author | Joel Brobecker <brobecker@gnat.com> | 2012-01-26 04:20:36 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2012-01-26 04:20:36 +0000 |
commit | 74ccd7f58b78303b1de7c7823d39821119592c20 (patch) | |
tree | 80d5cc92610d9679038af4766b25179729e3999c | |
parent | b8b196db1ef731b7d9de7f332dd745f3240d8623 (diff) | |
download | gdb-74ccd7f58b78303b1de7c7823d39821119592c20.zip gdb-74ccd7f58b78303b1de7c7823d39821119592c20.tar.gz gdb-74ccd7f58b78303b1de7c7823d39821119592c20.tar.bz2 |
Ada: allow unqualified function names in linespecs
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.
-rw-r--r-- | gdb/ChangeLog | 18 | ||||
-rw-r--r-- | gdb/ada-lang.c | 14 | ||||
-rw-r--r-- | gdb/c-lang.c | 8 | ||||
-rw-r--r-- | gdb/d-lang.c | 2 | ||||
-rw-r--r-- | gdb/f-lang.c | 2 | ||||
-rw-r--r-- | gdb/jv-lang.c | 2 | ||||
-rw-r--r-- | gdb/language.c | 6 | ||||
-rw-r--r-- | gdb/language.h | 29 | ||||
-rw-r--r-- | gdb/linespec.c | 24 | ||||
-rw-r--r-- | gdb/m2-lang.c | 2 | ||||
-rw-r--r-- | gdb/objc-lang.c | 2 | ||||
-rw-r--r-- | gdb/opencl-lang.c | 2 | ||||
-rw-r--r-- | gdb/p-lang.c | 2 | ||||
-rw-r--r-- | gdb/symfile.h | 8 |
14 files changed, 86 insertions, 35 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 15a7b6a..ab288c9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,21 @@ +2012-01-26 Joel Brobecker <brobecker@adacore.com> + + * 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. + 2012-01-25 Tom Tromey <tromey@redhat.com> * breakpoint.c (bpstat_stop_status): Check 'breakpoint_at' before diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 11ff73f..2f70980 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -12319,6 +12319,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, @@ -12355,7 +12367,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 c4d841f..6e92fb9 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 da2785c..29dcfe4 100644 --- a/gdb/d-lang.c +++ b/gdb/d-lang.c @@ -272,7 +272,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 4149cef..5f15402 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 2acf592..e6fcaee 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1196,7 +1196,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 d70ae81..46b7dce 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -933,7 +933,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 }; @@ -976,7 +976,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 }; @@ -1017,7 +1017,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 2ea2dca..7a1bcb7 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 0782c54..28fcf4d 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -321,6 +321,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. */ @@ -328,9 +339,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; } @@ -349,6 +360,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) { @@ -367,7 +385,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 e91ea32..d7b16f4 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 1c96309..94951fe 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -540,7 +540,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 6557a08..d779591 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 cd56630..b634b99 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 6b664cd..7af6094 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -258,12 +258,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. |