From 7e56227dfffddbbb5b648c386c85345929fa0529 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Mon, 1 Jun 2020 14:53:55 +0100 Subject: [PATCH] gdb: Convert language la_collect_symbol_completion_matches field to a method This commit changes the language_data::la_collect_symbol_completion_matches function pointer member variable into a member function of language_defn. There should be no user visible changes after this commit. gdb/ChangeLog: * ada-lang.c (ada_collect_symbol_completion_matches): Rename to ada_language::collect_symbol_completion_matches. (ada_language_data): Delete la_collect_symbol_completion_matches initializer. (ada_language::collect_symbol_completion_matches): New member function, implementation from ada_collect_symbol_completion_matches. * c-lang.c (c_language_data): Delete la_collect_symbol_completion_matches initializer. (cplus_language_data): Likewise. (asm_language_data): Likewise. (minimal_language_data): Likewise. * d-lang.c (d_language_data): Likewise. * f-lang.c (f_collect_symbol_completion_matches): Rename to f_language::collect_symbol_completion_matches. (f_language_data): Delete la_collect_symbol_completion_matches initializer. (f_language::collect_symbol_completion_matches) New member function, implementation from f_collect_symbol_completion_matches. * go-lang.c (go_language_data): Delete la_collect_symbol_completion_matches initializer. * language.c (unknown_language_data): Likewise. (auto_language_data): Likewise. * language.h (language_data): Delete la_collect_symbol_completion_matches field. (language_defn::collect_symbol_completion_matches): New member function. * m2-lang.c (m2_language_data): Delete la_collect_symbol_completion_matches initializer. * objc-lang.c (objc_language_data): Likewise. * opencl-lang.c (opencl_language_data): Likewise. * p-lang.c (pascal_language_data): Likewise. * rust-lang.c (rust_language_data): Likewise. * symtab.c (default_collect_symbol_completion_matches): Delete. (collect_symbol_completion_matches): Update call to collect_symbol_completion_matches. (collect_symbol_completion_matches_type): Likewise. * symtab.h (default_collect_symbol_completion_matches): Delete declaration. --- gdb/ChangeLog | 42 ++++++++ gdb/ada-lang.c | 255 +++++++++++++++++++++++----------------------- gdb/c-lang.c | 4 - gdb/d-lang.c | 1 - gdb/f-lang.c | 33 +++--- gdb/go-lang.c | 1 - gdb/language.c | 2 - gdb/language.h | 31 +++--- gdb/m2-lang.c | 1 - gdb/objc-lang.c | 1 - gdb/opencl-lang.c | 1 - gdb/p-lang.c | 1 - gdb/rust-lang.c | 1 - gdb/symtab.c | 27 ++--- gdb/symtab.h | 7 -- 15 files changed, 210 insertions(+), 198 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 18c608b03c..52cfc4ccc1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,45 @@ +2020-06-17 Andrew Burgess + + * ada-lang.c (ada_collect_symbol_completion_matches): Rename to + ada_language::collect_symbol_completion_matches. + (ada_language_data): Delete la_collect_symbol_completion_matches + initializer. + (ada_language::collect_symbol_completion_matches): New member + function, implementation from + ada_collect_symbol_completion_matches. + * c-lang.c (c_language_data): Delete + la_collect_symbol_completion_matches initializer. + (cplus_language_data): Likewise. + (asm_language_data): Likewise. + (minimal_language_data): Likewise. + * d-lang.c (d_language_data): Likewise. + * f-lang.c (f_collect_symbol_completion_matches): Rename to + f_language::collect_symbol_completion_matches. + (f_language_data): Delete la_collect_symbol_completion_matches + initializer. + (f_language::collect_symbol_completion_matches) New member + function, implementation from f_collect_symbol_completion_matches. + * go-lang.c (go_language_data): Delete + la_collect_symbol_completion_matches initializer. + * language.c (unknown_language_data): Likewise. + (auto_language_data): Likewise. + * language.h (language_data): Delete + la_collect_symbol_completion_matches field. + (language_defn::collect_symbol_completion_matches): New member + function. + * m2-lang.c (m2_language_data): Delete + la_collect_symbol_completion_matches initializer. + * objc-lang.c (objc_language_data): Likewise. + * opencl-lang.c (opencl_language_data): Likewise. + * p-lang.c (pascal_language_data): Likewise. + * rust-lang.c (rust_language_data): Likewise. + * symtab.c (default_collect_symbol_completion_matches): Delete. + (collect_symbol_completion_matches): Update call to + collect_symbol_completion_matches. + (collect_symbol_completion_matches_type): Likewise. + * symtab.h (default_collect_symbol_completion_matches): Delete + declaration. + 2020-06-17 Andrew Burgess * ada-lang.c (ada_get_gdb_completer_word_break_characters): Delete. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 137f4a9b5b..306cf3acaf 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -6272,134 +6272,6 @@ ada_lookup_name_info::matches return true; } -/* Add the list of possible symbol names completing TEXT to TRACKER. - WORD is the entire command on which completion is made. */ - -static void -ada_collect_symbol_completion_matches (completion_tracker &tracker, - complete_symbol_mode mode, - symbol_name_match_type name_match_type, - const char *text, const char *word, - enum type_code code) -{ - struct symbol *sym; - const struct block *b, *surrounding_static_block = 0; - struct block_iterator iter; - - gdb_assert (code == TYPE_CODE_UNDEF); - - lookup_name_info lookup_name (text, name_match_type, true); - - /* First, look at the partial symtab symbols. */ - expand_symtabs_matching (NULL, - lookup_name, - NULL, - NULL, - ALL_DOMAIN); - - /* At this point scan through the misc symbol vectors and add each - symbol you find to the list. Eventually we want to ignore - anything that isn't a text symbol (everything else will be - handled by the psymtab code above). */ - - for (objfile *objfile : current_program_space->objfiles ()) - { - for (minimal_symbol *msymbol : objfile->msymbols ()) - { - QUIT; - - if (completion_skip_symbol (mode, msymbol)) - continue; - - language symbol_language = msymbol->language (); - - /* Ada minimal symbols won't have their language set to Ada. If - we let completion_list_add_name compare using the - default/C-like matcher, then when completing e.g., symbols in a - package named "pck", we'd match internal Ada symbols like - "pckS", which are invalid in an Ada expression, unless you wrap - them in '<' '>' to request a verbatim match. - - Unfortunately, some Ada encoded names successfully demangle as - C++ symbols (using an old mangling scheme), such as "name__2Xn" - -> "Xn::name(void)" and thus some Ada minimal symbols end up - with the wrong language set. Paper over that issue here. */ - if (symbol_language == language_auto - || symbol_language == language_cplus) - symbol_language = language_ada; - - completion_list_add_name (tracker, - symbol_language, - msymbol->linkage_name (), - lookup_name, text, word); - } - } - - /* Search upwards from currently selected frame (so that we can - complete on local vars. */ - - for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) - { - if (!BLOCK_SUPERBLOCK (b)) - surrounding_static_block = b; /* For elmin of dups */ - - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - if (completion_skip_symbol (mode, sym)) - continue; - - completion_list_add_name (tracker, - sym->language (), - sym->linkage_name (), - lookup_name, text, word); - } - } - - /* Go through the symtabs and check the externs and statics for - symbols which match. */ - - for (objfile *objfile : current_program_space->objfiles ()) - { - for (compunit_symtab *s : objfile->compunits ()) - { - QUIT; - b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), GLOBAL_BLOCK); - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - if (completion_skip_symbol (mode, sym)) - continue; - - completion_list_add_name (tracker, - sym->language (), - sym->linkage_name (), - lookup_name, text, word); - } - } - } - - for (objfile *objfile : current_program_space->objfiles ()) - { - for (compunit_symtab *s : objfile->compunits ()) - { - QUIT; - b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), STATIC_BLOCK); - /* Don't do this block twice. */ - if (b == surrounding_static_block) - continue; - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - if (completion_skip_symbol (mode, sym)) - continue; - - completion_list_add_name (tracker, - sym->language (), - sym->linkage_name (), - lookup_name, text, word); - } - } - } -} - /* Field Access */ /* Return non-zero if TYPE is a pointer to the GNAT dispatch table used @@ -13911,7 +13783,6 @@ extern const struct language_data ada_language_data = ada_op_print_tab, /* expression operators for printing */ 0, /* c-style arrays */ 1, /* String lower bound */ - ada_collect_symbol_completion_matches, ada_watch_location_expression, &ada_varobj_ops, ada_is_string_type, @@ -14105,6 +13976,132 @@ public: return ada_completer_word_break_characters; } + /* See language.h. */ + + void collect_symbol_completion_matches (completion_tracker &tracker, + complete_symbol_mode mode, + symbol_name_match_type name_match_type, + const char *text, const char *word, + enum type_code code) const override + { + struct symbol *sym; + const struct block *b, *surrounding_static_block = 0; + struct block_iterator iter; + + gdb_assert (code == TYPE_CODE_UNDEF); + + lookup_name_info lookup_name (text, name_match_type, true); + + /* First, look at the partial symtab symbols. */ + expand_symtabs_matching (NULL, + lookup_name, + NULL, + NULL, + ALL_DOMAIN); + + /* At this point scan through the misc symbol vectors and add each + symbol you find to the list. Eventually we want to ignore + anything that isn't a text symbol (everything else will be + handled by the psymtab code above). */ + + for (objfile *objfile : current_program_space->objfiles ()) + { + for (minimal_symbol *msymbol : objfile->msymbols ()) + { + QUIT; + + if (completion_skip_symbol (mode, msymbol)) + continue; + + language symbol_language = msymbol->language (); + + /* Ada minimal symbols won't have their language set to Ada. If + we let completion_list_add_name compare using the + default/C-like matcher, then when completing e.g., symbols in a + package named "pck", we'd match internal Ada symbols like + "pckS", which are invalid in an Ada expression, unless you wrap + them in '<' '>' to request a verbatim match. + + Unfortunately, some Ada encoded names successfully demangle as + C++ symbols (using an old mangling scheme), such as "name__2Xn" + -> "Xn::name(void)" and thus some Ada minimal symbols end up + with the wrong language set. Paper over that issue here. */ + if (symbol_language == language_auto + || symbol_language == language_cplus) + symbol_language = language_ada; + + completion_list_add_name (tracker, + symbol_language, + msymbol->linkage_name (), + lookup_name, text, word); + } + } + + /* Search upwards from currently selected frame (so that we can + complete on local vars. */ + + for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) + { + if (!BLOCK_SUPERBLOCK (b)) + surrounding_static_block = b; /* For elmin of dups */ + + ALL_BLOCK_SYMBOLS (b, iter, sym) + { + if (completion_skip_symbol (mode, sym)) + continue; + + completion_list_add_name (tracker, + sym->language (), + sym->linkage_name (), + lookup_name, text, word); + } + } + + /* Go through the symtabs and check the externs and statics for + symbols which match. */ + + for (objfile *objfile : current_program_space->objfiles ()) + { + for (compunit_symtab *s : objfile->compunits ()) + { + QUIT; + b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), GLOBAL_BLOCK); + ALL_BLOCK_SYMBOLS (b, iter, sym) + { + if (completion_skip_symbol (mode, sym)) + continue; + + completion_list_add_name (tracker, + sym->language (), + sym->linkage_name (), + lookup_name, text, word); + } + } + } + + for (objfile *objfile : current_program_space->objfiles ()) + { + for (compunit_symtab *s : objfile->compunits ()) + { + QUIT; + b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), STATIC_BLOCK); + /* Don't do this block twice. */ + if (b == surrounding_static_block) + continue; + ALL_BLOCK_SYMBOLS (b, iter, sym) + { + if (completion_skip_symbol (mode, sym)) + continue; + + completion_list_add_name (tracker, + sym->language (), + sym->linkage_name (), + lookup_name, text, word); + } + } + } + } + protected: /* See language.h. */ diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 79c4839bd9..3d1116b5b5 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -914,7 +914,6 @@ extern const struct language_data c_language_data = c_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &c_varobj_ops, c_is_string_type_p, @@ -1027,7 +1026,6 @@ extern const struct language_data cplus_language_data = c_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &cplus_varobj_ops, c_is_string_type_p, @@ -1228,7 +1226,6 @@ extern const struct language_data asm_language_data = c_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, c_is_string_type_p, @@ -1296,7 +1293,6 @@ extern const struct language_data minimal_language_data = c_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, c_is_string_type_p, diff --git a/gdb/d-lang.c b/gdb/d-lang.c index 56feda1268..67c82e4215 100644 --- a/gdb/d-lang.c +++ b/gdb/d-lang.c @@ -157,7 +157,6 @@ extern const struct language_data d_language_data = d_op_print_tab, /* Expression operators for printing. */ 1, /* C-style arrays. */ 0, /* String lower bound. */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, c_is_string_type_p, diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 27495cf63f..0540ab233d 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -165,21 +165,6 @@ enum f_primitive_types { nr_f_primitive_types }; -/* Consider the modules separator :: as a valid symbol name character - class. */ - -static void -f_collect_symbol_completion_matches (completion_tracker &tracker, - complete_symbol_mode mode, - symbol_name_match_type compare_name, - const char *text, const char *word, - enum type_code code) -{ - default_collect_symbol_completion_matches_break_on (tracker, mode, - compare_name, - text, word, ":", code); -} - /* Special expression evaluation cases for Fortran. */ static struct value * @@ -593,7 +578,6 @@ extern const struct language_data f_language_data = f_op_print_tab, /* expression operators for printing */ 0, /* arrays are first-class (not c-style) */ 1, /* String lower bound */ - f_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, f_is_string_type_p, @@ -698,6 +682,23 @@ public: return retval; } + + /* See language.h. */ + + void collect_symbol_completion_matches (completion_tracker &tracker, + complete_symbol_mode mode, + symbol_name_match_type name_match_type, + const char *text, const char *word, + enum type_code code) const override + { + /* Consider the modules separator :: as a valid symbol name character + class. */ + default_collect_symbol_completion_matches_break_on (tracker, mode, + name_match_type, + text, word, ":", + code); + } + protected: /* See language.h. */ diff --git a/gdb/go-lang.c b/gdb/go-lang.c index 1b3372a774..c060ad5643 100644 --- a/gdb/go-lang.c +++ b/gdb/go-lang.c @@ -542,7 +542,6 @@ extern const struct language_data go_language_data = go_op_print_tab, /* Expression operators for printing. */ 1, /* C-style arrays. */ 0, /* String lower bound. */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, go_is_string_type_p, diff --git a/gdb/language.c b/gdb/language.c index 167a68c920..f4e99fc392 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -779,7 +779,6 @@ extern const struct language_data unknown_language_data = unk_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, default_is_string_type_p, @@ -851,7 +850,6 @@ extern const struct language_data auto_language_data = unk_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, default_is_string_type_p, diff --git a/gdb/language.h b/gdb/language.h index 8c6f7e3fb1..5872db39db 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -319,19 +319,6 @@ struct language_data /* Index to use for extracting the first element of a string. */ char string_lower_bound; - /* Add to the completion tracker all symbols which are possible - completions for TEXT. WORD is the entire command on which the - completion is being made. If CODE is TYPE_CODE_UNDEF, then all - symbols should be examined; otherwise, only STRUCT_DOMAIN - symbols whose type has a code of CODE should be matched. */ - void (*la_collect_symbol_completion_matches) - (completion_tracker &tracker, - complete_symbol_mode mode, - symbol_name_match_type match_type, - const char *text, - const char *word, - enum type_code code); - /* Return an expression that can be used for a location watchpoint. TYPE is a pointer type that points to the memory to watch, and ADDR is the address of the watched memory. */ @@ -535,6 +522,24 @@ struct language_defn : language_data return default_word_break_characters (); } + /* Add to the completion tracker all symbols which are possible + completions for TEXT. WORD is the entire command on which the + completion is being made. If CODE is TYPE_CODE_UNDEF, then all + symbols should be examined; otherwise, only STRUCT_DOMAIN symbols + whose type has a code of CODE should be matched. */ + + virtual void collect_symbol_completion_matches + (completion_tracker &tracker, + complete_symbol_mode mode, + symbol_name_match_type name_match_type, + const char *text, + const char *word, + enum type_code code) const + { + return default_collect_symbol_completion_matches_break_on + (tracker, mode, name_match_type, text, word, "", code); + } + /* List of all known languages. */ static const struct language_defn *languages[nr_languages]; diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index 331ad5a3e6..d21a5c9705 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -376,7 +376,6 @@ extern const struct language_data m2_language_data = m2_op_print_tab, /* expression operators for printing */ 0, /* arrays are first-class (not c-style) */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, m2_is_string_type_p, diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index 3bd71896ae..5f9e971036 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -351,7 +351,6 @@ extern const struct language_data objc_language_data = objc_op_print_tab, /* Expression operators for printing */ 1, /* C-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, c_is_string_type_p, diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index 3f0fb1fa94..d93ce0bc47 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1030,7 +1030,6 @@ extern const struct language_data opencl_language_data = c_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, c_is_string_type_p, diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 22ed912c6f..f94f4c5314 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -407,7 +407,6 @@ extern const struct language_data pascal_language_data = pascal_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, c_watch_location_expression, &default_varobj_ops, pascal_is_string_type_p, diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 53d1ee2bc8..47fc3dbc4a 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -2062,7 +2062,6 @@ extern const struct language_data rust_language_data = c_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - default_collect_symbol_completion_matches, rust_watch_location_expression, &default_varobj_ops, rust_is_string_type_p, diff --git a/gdb/symtab.c b/gdb/symtab.c index ec0d94b87d..b0e22eeb38 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -5806,19 +5806,6 @@ default_collect_symbol_completion_matches_break_on } } -void -default_collect_symbol_completion_matches (completion_tracker &tracker, - complete_symbol_mode mode, - symbol_name_match_type name_match_type, - const char *text, const char *word, - enum type_code code) -{ - return default_collect_symbol_completion_matches_break_on (tracker, mode, - name_match_type, - text, word, "", - code); -} - /* Collect all symbols (regardless of class) which begin by matching TEXT. */ @@ -5828,10 +5815,10 @@ collect_symbol_completion_matches (completion_tracker &tracker, symbol_name_match_type name_match_type, const char *text, const char *word) { - current_language->la_collect_symbol_completion_matches (tracker, mode, - name_match_type, - text, word, - TYPE_CODE_UNDEF); + current_language->collect_symbol_completion_matches (tracker, mode, + name_match_type, + text, word, + TYPE_CODE_UNDEF); } /* Like collect_symbol_completion_matches, but only collect @@ -5848,9 +5835,9 @@ collect_symbol_completion_matches_type (completion_tracker &tracker, gdb_assert (code == TYPE_CODE_UNION || code == TYPE_CODE_STRUCT || code == TYPE_CODE_ENUM); - current_language->la_collect_symbol_completion_matches (tracker, mode, - name_match_type, - text, word, code); + current_language->collect_symbol_completion_matches (tracker, mode, + name_match_type, + text, word, code); } /* Like collect_symbol_completion_matches, but collects a list of diff --git a/gdb/symtab.h b/gdb/symtab.h index 9972e8125b..bf02828d12 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1952,13 +1952,6 @@ extern void default_collect_symbol_completion_matches_break_on symbol_name_match_type name_match_type, const char *text, const char *word, const char *break_on, enum type_code code); -extern void default_collect_symbol_completion_matches - (completion_tracker &tracker, - complete_symbol_mode, - symbol_name_match_type name_match_type, - const char *, - const char *, - enum type_code); extern void collect_symbol_completion_matches (completion_tracker &tracker, complete_symbol_mode mode,