aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2012-01-26 04:20:36 +0000
committerJoel Brobecker <brobecker@gnat.com>2012-01-26 04:20:36 +0000
commit74ccd7f58b78303b1de7c7823d39821119592c20 (patch)
tree80d5cc92610d9679038af4766b25179729e3999c
parentb8b196db1ef731b7d9de7f332dd745f3240d8623 (diff)
downloadgdb-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/ChangeLog18
-rw-r--r--gdb/ada-lang.c14
-rw-r--r--gdb/c-lang.c8
-rw-r--r--gdb/d-lang.c2
-rw-r--r--gdb/f-lang.c2
-rw-r--r--gdb/jv-lang.c2
-rw-r--r--gdb/language.c6
-rw-r--r--gdb/language.h29
-rw-r--r--gdb/linespec.c24
-rw-r--r--gdb/m2-lang.c2
-rw-r--r--gdb/objc-lang.c2
-rw-r--r--gdb/opencl-lang.c2
-rw-r--r--gdb/p-lang.c2
-rw-r--r--gdb/symfile.h8
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.