diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 51 | ||||
-rw-r--r-- | gdb/ada-lang.c | 78 | ||||
-rw-r--r-- | gdb/c-lang.c | 12 | ||||
-rw-r--r-- | gdb/cp-support.c | 9 | ||||
-rw-r--r-- | gdb/cp-support.h | 4 | ||||
-rw-r--r-- | gdb/d-lang.c | 18 | ||||
-rw-r--r-- | gdb/f-lang.c | 1 | ||||
-rw-r--r-- | gdb/go-lang.c | 18 | ||||
-rw-r--r-- | gdb/language.c | 19 | ||||
-rw-r--r-- | gdb/language.h | 44 | ||||
-rw-r--r-- | gdb/m2-lang.c | 1 | ||||
-rw-r--r-- | gdb/objc-lang.c | 18 | ||||
-rw-r--r-- | gdb/opencl-lang.c | 1 | ||||
-rw-r--r-- | gdb/p-lang.c | 1 | ||||
-rw-r--r-- | gdb/rust-lang.c | 20 | ||||
-rw-r--r-- | gdb/symtab.c | 4 |
16 files changed, 152 insertions, 147 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b8ce903..46ca011 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,56 @@ 2020-06-02 Andrew Burgess <andrew.burgess@embecosm.com> + * ada-lang.c (ada_sniff_from_mangled_name): Delete function, + implementation moves to... + (ada_language::sniff_from_mangled_name): ...here. Update return + type. + (ada_language_data): Delete la_sniff_from_mangled_name + initializer. + * c-lang.c (c_language_data): Likewise. + (cplus_language_data): Likewise. + (cplus_language::sniff_from_mangled_name): New member function, + implementation taken from gdb_sniff_from_mangled_name. + (asm_language_data): Delete la_sniff_from_mangled_name + initializer. + (minimal_language_data): Likewise. + * cp-support.c (gdb_sniff_from_mangled_name): Delete, + implementation moves to cplus_language::sniff_from_mangled_name. + * cp-support.h (gdb_sniff_from_mangled_name): Delete declaration. + * d-lang.c (d_sniff_from_mangled_name): Delete, implementation + moves to... + (d_language::sniff_from_mangled_name): ...here. + (d_language_data): Delete la_sniff_from_mangled_name initializer. + * f-lang.c (f_language_data): Likewise. + * go-lang.c (go_sniff_from_mangled_name): Delete, implementation + moves to... + (go_language::sniff_from_mangled_name): ...here. + (go_language_data): Delete la_sniff_from_mangled_name initializer. + * language.c (language_sniff_from_mangled_name): Delete. + (unknown_language_data): Delete la_sniff_from_mangled_name + initializer. + (auto_language_data): Likewise. + * language.h (language_data): Delete la_sniff_from_mangled_name + field. + (language_defn::sniff_from_mangled_name): New function. + (language_sniff_from_mangled_name): Delete declaration. + * m2-lang.c (m2_language_data): Delete la_sniff_from_mangled_name + field. + * objc-lang.c (objc_sniff_from_mangled_name): Delete, + implementation moves to... + (objc_language::sniff_from_mangled_name): ...here. + (objc_language_data): Delete la_sniff_from_mangled_name initializer. + * opencl-lang.c (opencl_language_data): Likewise. + * p-lang.c (pascal_language_data): Likewise. + * rust-lang.c (rust_sniff_from_mangled_name): Delete, + implementation moves to... + (rust_language::sniff_from_mangled_name): ...here. + (rust_language_data): Delete la_sniff_from_mangled_name + initializer. + * symtab.c (symbol_find_demangled_name): Call + sniff_from_mangled_name member function. + +2020-06-02 Andrew Burgess <andrew.burgess@embecosm.com> + * ada-lang.c (ada_language_data): Delete la_search_name_hash initializer. * c-lang.c (c_language_data): Likewise. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 0232f6b..6bfc025 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1377,45 +1377,6 @@ ada_la_decode (const char *encoded, int options) return xstrdup (ada_decode (encoded).c_str ()); } -/* Implement la_sniff_from_mangled_name for Ada. */ - -static int -ada_sniff_from_mangled_name (const char *mangled, char **out) -{ - std::string demangled = ada_decode (mangled); - - *out = NULL; - - if (demangled != mangled && demangled[0] != '<') - { - /* Set the gsymbol language to Ada, but still return 0. - Two reasons for that: - - 1. For Ada, we prefer computing the symbol's decoded name - on the fly rather than pre-compute it, in order to save - memory (Ada projects are typically very large). - - 2. There are some areas in the definition of the GNAT - encoding where, with a bit of bad luck, we might be able - to decode a non-Ada symbol, generating an incorrect - demangled name (Eg: names ending with "TB" for instance - are identified as task bodies and so stripped from - the decoded name returned). - - Returning 1, here, but not setting *DEMANGLED, helps us get a - little bit of the best of both worlds. Because we're last, - we should not affect any of the other languages that were - able to demangle the symbol before us; we get to correctly - tag Ada symbols as such; and even if we incorrectly tagged a - non-Ada symbol, which should be rare, any routing through the - Ada language should be transparent (Ada tries to behave much - like C/C++ with non-Ada symbols). */ - return 1; - } - - return 0; -} - /* Arrays */ @@ -13967,7 +13928,6 @@ extern const struct language_data ada_language_data = true, /* la_store_sym_names_in_linkage_form_p */ ada_lookup_symbol_nonlocal, /* Looking up non-local symbols. */ ada_la_decode, /* Language specific symbol demangler */ - ada_sniff_from_mangled_name, NULL, /* Language specific class_name_from_physname */ ada_op_print_tab, /* expression operators for printing */ @@ -14108,6 +14068,44 @@ public: return true; } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **out) const override + { + std::string demangled = ada_decode (mangled); + + *out = NULL; + + if (demangled != mangled && demangled[0] != '<') + { + /* Set the gsymbol language to Ada, but still return 0. + Two reasons for that: + + 1. For Ada, we prefer computing the symbol's decoded name + on the fly rather than pre-compute it, in order to save + memory (Ada projects are typically very large). + + 2. There are some areas in the definition of the GNAT + encoding where, with a bit of bad luck, we might be able + to decode a non-Ada symbol, generating an incorrect + demangled name (Eg: names ending with "TB" for instance + are identified as task bodies and so stripped from + the decoded name returned). + + Returning true, here, but not setting *DEMANGLED, helps us get + a little bit of the best of both worlds. Because we're last, + we should not affect any of the other languages that were + able to demangle the symbol before us; we get to correctly + tag Ada symbols as such; and even if we incorrectly tagged a + non-Ada symbol, which should be rare, any routing through the + Ada language should be transparent (Ada tries to behave much + like C/C++ with non-Ada symbols). */ + return true; + } + + return false; + } }; /* Single instance of the Ada language class. */ diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 8452760..a5f7d82 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -914,7 +914,6 @@ extern const struct language_data c_language_data = true, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -1017,7 +1016,6 @@ extern const struct language_data cplus_language_data = false, /* la_store_sym_names_in_linkage_form_p */ cp_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ gdb_demangle, /* Language specific symbol demangler */ - gdb_sniff_from_mangled_name, cp_class_name_from_physname, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -1130,6 +1128,14 @@ public: { return cp_search_name_hash (name); } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); + return *demangled != NULL; + } }; /* The single instance of the C++ language class. */ @@ -1168,7 +1174,6 @@ extern const struct language_data asm_language_data = true, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -1236,7 +1241,6 @@ extern const struct language_data minimal_language_data = true, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 11e54c2..3c3ede2 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -1676,15 +1676,6 @@ gdb_demangle (const char *name, int options) /* See cp-support.h. */ -int -gdb_sniff_from_mangled_name (const char *mangled, char **demangled) -{ - *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); - return *demangled != NULL; -} - -/* See cp-support.h. */ - unsigned int cp_search_name_hash (const char *search_name) { diff --git a/gdb/cp-support.h b/gdb/cp-support.h index 6ca8983..7c948b2 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -191,8 +191,4 @@ extern struct cmd_list_element *maint_cplus_cmd_list; char *gdb_demangle (const char *name, int options); -/* Like gdb_demangle, but suitable for use as la_sniff_from_mangled_name. */ - -int gdb_sniff_from_mangled_name (const char *mangled, char **demangled); - #endif /* CP_SUPPORT_H */ diff --git a/gdb/d-lang.c b/gdb/d-lang.c index c6ee6a2..23b9464 100644 --- a/gdb/d-lang.c +++ b/gdb/d-lang.c @@ -56,15 +56,6 @@ d_demangle (const char *symbol, int options) return gdb_demangle (symbol, options | DMGL_DLANG); } -/* la_sniff_from_mangled_name implementation for D. */ - -static int -d_sniff_from_mangled_name (const char *mangled, char **demangled) -{ - *demangled = d_demangle (mangled, 0); - return *demangled != NULL; -} - /* Table mapping opcodes into strings for printing operators and precedences of the operators. */ static const struct op_print d_op_print_tab[] = @@ -166,7 +157,6 @@ extern const struct language_data d_language_data = false, /* la_store_sym_names_in_linkage_form_p */ d_lookup_symbol_nonlocal, d_demangle, /* Language specific symbol demangler. */ - d_sniff_from_mangled_name, NULL, /* Language specific class_name_from_physname. */ d_op_print_tab, /* Expression operators for printing. */ @@ -254,6 +244,14 @@ public: lai->bool_type_symbol = "bool"; lai->bool_type_default = builtin->builtin_bool; } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = d_demangle (mangled, 0); + return *demangled != NULL; + } }; /* Single instance of the D language class. */ diff --git a/gdb/f-lang.c b/gdb/f-lang.c index a2df46a..804b282 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -623,7 +623,6 @@ extern const struct language_data f_language_data = and there is no DW_AT_producer available for inferiors with only the ELF symbols to check the mangling kind. */ NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ f_op_print_tab, /* expression operators for printing */ diff --git a/gdb/go-lang.c b/gdb/go-lang.c index 8491c97..dce7e6a 100644 --- a/gdb/go-lang.c +++ b/gdb/go-lang.c @@ -396,15 +396,6 @@ go_demangle (const char *mangled_name, int options) return result; } -/* la_sniff_from_mangled_name for Go. */ - -static int -go_sniff_from_mangled_name (const char *mangled, char **demangled) -{ - *demangled = go_demangle (mangled, 0); - return *demangled != NULL; -} - /* Given a Go symbol, return its package or NULL if unknown. Space for the result is malloc'd, caller must free. */ @@ -551,7 +542,6 @@ extern const struct language_data go_language_data = false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, go_demangle, /* Language specific symbol demangler. */ - go_sniff_from_mangled_name, NULL, /* Language specific class_name_from_physname. */ go_op_print_tab, /* Expression operators for printing. */ @@ -628,6 +618,14 @@ public: lai->bool_type_symbol = "bool"; lai->bool_type_default = builtin->builtin_bool; } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = go_demangle (mangled, 0); + return *demangled != NULL; + } }; /* Single instance of the Go language class. */ diff --git a/gdb/language.c b/gdb/language.c index 7a87134..2a66f1f 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -594,23 +594,6 @@ language_demangle (const struct language_defn *current_language, return NULL; } -/* See language.h. */ - -int -language_sniff_from_mangled_name (const struct language_defn *lang, - const char *mangled, char **demangled) -{ - gdb_assert (lang != NULL); - - if (lang->la_sniff_from_mangled_name == NULL) - { - *demangled = NULL; - return 0; - } - - return lang->la_sniff_from_mangled_name (mangled, demangled); -} - /* Return class name from physname or NULL. */ char * language_class_name_from_physname (const struct language_defn *lang, @@ -828,7 +811,6 @@ extern const struct language_data unknown_language_data = true, /* store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ unk_lang_demangle, /* Language specific symbol demangler */ - NULL, unk_lang_class_name, /* Language specific class_name_from_physname */ unk_op_print_tab, /* expression operators for printing */ @@ -892,7 +874,6 @@ extern const struct language_data auto_language_data = false, /* store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ unk_lang_demangle, /* Language specific symbol demangler */ - NULL, unk_lang_class_name, /* Language specific class_name_from_physname */ unk_op_print_tab, /* expression operators for printing */ diff --git a/gdb/language.h b/gdb/language.h index 5233c0f..d5013bf 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -318,22 +318,6 @@ struct language_data /* Return demangled language symbol, or NULL. */ char *(*la_demangle) (const char *mangled, int options); - /* Demangle a symbol according to this language's rules. Unlike - la_demangle, this does not take any options. - - *DEMANGLED will be set by this function. - - If this function returns 0, then *DEMANGLED must always be set - to NULL. - - If this function returns 1, the implementation may set this to - a xmalloc'd string holding the demangled form. However, it is - not required to. The string, if any, is owned by the caller. - - The resulting string should be of the form that will be - installed into a symbol. */ - int (*la_sniff_from_mangled_name) (const char *mangled, char **demangled); - /* Return class name of a mangled method name or NULL. */ char *(*la_class_name_from_physname) (const char *physname); @@ -512,6 +496,27 @@ struct language_defn : language_data /* Hash the given symbol search name. */ virtual unsigned int search_name_hash (const char *name) const; + /* Demangle a symbol according to this language's rules. Unlike + la_demangle, this does not take any options. + + *DEMANGLED will be set by this function. + + If this function returns false, then *DEMANGLED must always be set + to NULL. + + If this function returns true, the implementation may set this to + a xmalloc'd string holding the demangled form. However, it is + not required to. The string, if any, is owned by the caller. + + The resulting string should be of the form that will be + installed into a symbol. */ + virtual bool sniff_from_mangled_name (const char *mangled, + char **demangled) const + { + *demangled = nullptr; + return false; + } + /* List of all known languages. */ static const struct language_defn *languages[nr_languages]; }; @@ -666,13 +671,6 @@ extern CORE_ADDR skip_language_trampoline (struct frame_info *, CORE_ADDR pc); extern char *language_demangle (const struct language_defn *current_language, const char *mangled, int options); -/* A wrapper for la_sniff_from_mangled_name. The arguments and result - are as for the method. */ - -extern int language_sniff_from_mangled_name (const struct language_defn *lang, - const char *mangled, - char **demangled); - /* Return class name from physname, or NULL. */ extern char *language_class_name_from_physname (const struct language_defn *, const char *physname); diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index 2166470..fbfdcff 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -376,7 +376,6 @@ extern const struct language_data m2_language_data = false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ m2_op_print_tab, /* expression operators for printing */ diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index afbb1fb..3082a5d 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -281,15 +281,6 @@ objc_demangle (const char *mangled, int options) return NULL; /* Not an objc mangled name. */ } -/* la_sniff_from_mangled_name for ObjC. */ - -static int -objc_sniff_from_mangled_name (const char *mangled, char **demangled) -{ - *demangled = objc_demangle (mangled, 0); - return *demangled != NULL; -} - /* Determine if we are currently in the Objective-C dispatch function. If so, get the address of the method function that the dispatcher would call and use that as the function to step into instead. Also @@ -391,7 +382,6 @@ extern const struct language_data objc_language_data = false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ objc_demangle, /* Language specific symbol demangler */ - objc_sniff_from_mangled_name, NULL, /* Language specific class_name_from_physname */ objc_op_print_tab, /* Expression operators for printing */ @@ -422,6 +412,14 @@ public: { c_language_arch_info (gdbarch, lai); } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = objc_demangle (mangled, 0); + return *demangled != NULL; + } }; /* Single instance of the class representing the Objective-C language. */ diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index a3a51a5..4080c51 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1051,7 +1051,6 @@ extern const struct language_data opencl_language_data = false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 5d8c816..8d96dd1 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -407,7 +407,6 @@ extern const struct language_data pascal_language_data = false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ pascal_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 26e2ad5..d75f34d 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -2016,17 +2016,6 @@ rust_lookup_symbol_nonlocal (const struct language_defn *langdef, -/* la_sniff_from_mangled_name for Rust. */ - -static int -rust_sniff_from_mangled_name (const char *mangled, char **demangled) -{ - *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); - return *demangled != NULL; -} - - - /* la_watch_location_expression for Rust. */ static gdb::unique_xmalloc_ptr<char> @@ -2083,7 +2072,6 @@ extern const struct language_data rust_language_data = false, /* la_store_sym_names_in_linkage_form_p */ rust_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ gdb_demangle, /* Language specific symbol demangler */ - rust_sniff_from_mangled_name, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -2148,6 +2136,14 @@ public: lai->bool_type_default = types[rust_primitive_bool]; lai->string_char_type = types[rust_primitive_u8]; } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); + return *demangled != NULL; + } }; /* Single instance of the Rust language class. */ diff --git a/gdb/symtab.c b/gdb/symtab.c index aa3d84a..791ce11 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -807,7 +807,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, { const struct language_defn *lang = language_def (gsymbol->language ()); - language_sniff_from_mangled_name (lang, mangled, &demangled); + lang->sniff_from_mangled_name (mangled, &demangled); return demangled; } @@ -816,7 +816,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, enum language l = (enum language) i; const struct language_defn *lang = language_def (l); - if (language_sniff_from_mangled_name (lang, mangled, &demangled)) + if (lang->sniff_from_mangled_name (mangled, &demangled)) { gsymbol->m_language = l; return demangled; |