public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb: Convert language la_sniff_from_mangled_name field to a method
@ 2020-06-02 13:13 Andrew Burgess
  0 siblings, 0 replies; only message in thread
From: Andrew Burgess @ 2020-06-02 13:13 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6f8270197a2909607f2c076018e30677bbac652e

commit 6f8270197a2909607f2c076018e30677bbac652e
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Wed May 13 18:04:30 2020 +0100

    gdb: Convert language la_sniff_from_mangled_name field to a method
    
    This commit changes the language_data::la_sniff_from_mangled_name
    function pointer member variable into a member function of
    language_defn.
    
    Previously the la_sniff_from_mangled_name pointer was NULL for some
    languages, however, all uses of this function pointer were through the
    function language_sniff_from_mangled_name which provided a default
    implementation.
    
    This default implementation now becomes the implementation in the base
    class language_defn, which is then overridden as required in various
    language sub-classes.
    
    There should be no user visible changes after this commit.
    
    gdb/ChangeLog:
    
            * 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.

Diff:
---
 gdb/ChangeLog     | 51 ++++++++++++++++++++++++++++++++++++
 gdb/ada-lang.c    | 78 +++++++++++++++++++++++++++----------------------------
 gdb/c-lang.c      | 12 ++++++---
 gdb/cp-support.c  |  9 -------
 gdb/cp-support.h  |  4 ---
 gdb/d-lang.c      | 18 ++++++-------
 gdb/f-lang.c      |  1 -
 gdb/go-lang.c     | 18 ++++++-------
 gdb/language.c    | 19 --------------
 gdb/language.h    | 44 +++++++++++++++----------------
 gdb/m2-lang.c     |  1 -
 gdb/objc-lang.c   | 18 ++++++-------
 gdb/opencl-lang.c |  1 -
 gdb/p-lang.c      |  1 -
 gdb/rust-lang.c   | 20 ++++++--------
 gdb/symtab.c      |  4 +--
 16 files changed, 152 insertions(+), 147 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b8ce9033cb8..46ca0113926 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,54 @@
+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
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 0232f6b9485..6bfc0256b66 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;
-}
-
 \f
 
                                 /* 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 8452760339c..a5f7d822866 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 11e54c272c5..3c3ede26a60 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 6ca898315bb..7c948b212cb 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 c6ee6a231e6..23b9464cb58 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 a2df46a8b4a..804b2823f31 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 8491c97f5e9..dce7e6ab769 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 7a871348d43..2a66f1fd6ea 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 5233c0f10c5..d5013bf8324 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 2166470467c..fbfdcff71f3 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 afbb1fbed73..3082a5d058a 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 a3a51a58095..4080c51854f 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 5d8c8167da2..8d96dd15832 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 26e2ad5ce25..d75f34d0d9a 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -2016,17 +2016,6 @@ rust_lookup_symbol_nonlocal (const struct language_defn *langdef,
 
 \f
 
-/* 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;
-}
-
-\f
-
 /* 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 aa3d84a62d5..791ce11a737 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;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-02 13:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-02 13:13 [binutils-gdb] gdb: Convert language la_sniff_from_mangled_name field to a method Andrew Burgess

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).