Remove cplus_specific from general_symbol_info.

This patch reverts the addition of cplus_specific added here:

2010-07-16  Sami Wagiaalla  <swagiaal@redhat.com>

	* symtab.h (symbol_set_demangled_name): Now takes an optional objfile*
	argument.
	(cplus_specific): New struct.
	* symtab.c (symbol_set_demangled_name): Updated.
	Use cplus_specific for cplus symbols.
	(symbol_get_demangled_name): Retrive the name from the cplus_specific
	struct for cplus symbols.
	(symbol_init_language_specific): Set cplus_specific for cplus symbols.
	(symbol_set_names): Pass objfile to symbol_set_demangled_name.
	* symtab.c (symbol_init_cplus_specific): New function.

It was added in anticipation of improved template support:

https://sourceware.org/ml/gdb-patches/2010-05/msg00594.html
https://sourceware.org/ml/gdb-patches/2010-07/msg00284.html

However, minsyms pay the price for this space too.
For my standard benchmark this patch gets back 44MB of memory
when gdb starts.  [There's still ~440MB of memory used
by the demangled ELF symbols of this benchmark, but that's another topic.]

When the improved templated support is added,
I wonder if this can be moved to struct symbol.
Hmmm, we already have a special version of
struct symbol for templates (struct template_symbol).

gdb/ChangeLog:

	* symtab.c (symbol_init_cplus_specific): Delete.
	(symbol_set_demangled_name): Remove special c++ support.
	(symbol_get_demangled_name, symbol_set_language): Ditto.
	* symtab.h (struct cplus_specific): Delete.
	(struct general_symbol_info) <language_specific>: Remove
	cplus_specific.
This commit is contained in:
Doug Evans 2014-12-02 16:54:16 -08:00
parent 31c0ebfe8b
commit 7c5fdd25eb
3 changed files with 15 additions and 48 deletions

View File

@ -1,3 +1,12 @@
2014-12-02 Doug Evans <dje@google.com>
* symtab.c (symbol_init_cplus_specific): Delete.
(symbol_set_demangled_name): Remove special c++ support.
(symbol_get_demangled_name, symbol_set_language): Ditto.
* symtab.h (struct cplus_specific): Delete.
(struct general_symbol_info) <language_specific>: Remove
cplus_specific.
2014-12-02 Doug Evans <dje@google.com>
PR symtab/17602

View File

@ -473,40 +473,15 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id)
return (mangled_name);
}
/* Initialize the cplus_specific structure. 'cplus_specific' should
only be allocated for use with cplus symbols. */
static void
symbol_init_cplus_specific (struct general_symbol_info *gsymbol,
struct obstack *obstack)
{
/* A language_specific structure should not have been previously
initialized. */
gdb_assert (gsymbol->language_specific.cplus_specific == NULL);
gdb_assert (obstack != NULL);
gsymbol->language_specific.cplus_specific =
OBSTACK_ZALLOC (obstack, struct cplus_specific);
}
/* Set the demangled name of GSYMBOL to NAME. NAME must be already
correctly allocated. For C++ symbols a cplus_specific struct is
allocated so OBJFILE must not be NULL. If this is a non C++ symbol
OBJFILE can be NULL. */
correctly allocated. */
void
symbol_set_demangled_name (struct general_symbol_info *gsymbol,
const char *name,
struct obstack *obstack)
{
if (gsymbol->language == language_cplus)
{
if (gsymbol->language_specific.cplus_specific == NULL)
symbol_init_cplus_specific (gsymbol, obstack);
gsymbol->language_specific.cplus_specific->demangled_name = name;
}
else if (gsymbol->language == language_ada)
if (gsymbol->language == language_ada)
{
if (name == NULL)
{
@ -528,14 +503,7 @@ symbol_set_demangled_name (struct general_symbol_info *gsymbol,
const char *
symbol_get_demangled_name (const struct general_symbol_info *gsymbol)
{
if (gsymbol->language == language_cplus)
{
if (gsymbol->language_specific.cplus_specific != NULL)
return gsymbol->language_specific.cplus_specific->demangled_name;
else
return NULL;
}
else if (gsymbol->language == language_ada)
if (gsymbol->language == language_ada)
{
if (!gsymbol->ada_mangled)
return NULL;
@ -555,7 +523,8 @@ symbol_set_language (struct general_symbol_info *gsymbol,
struct obstack *obstack)
{
gsymbol->language = language;
if (gsymbol->language == language_d
if (gsymbol->language == language_cplus
|| gsymbol->language == language_d
|| gsymbol->language == language_go
|| gsymbol->language == language_java
|| gsymbol->language == language_objc
@ -568,8 +537,6 @@ symbol_set_language (struct general_symbol_info *gsymbol,
gdb_assert (gsymbol->ada_mangled == 0);
gsymbol->language_specific.obstack = obstack;
}
else if (gsymbol->language == language_cplus)
gsymbol->language_specific.cplus_specific = NULL;
else
{
memset (&gsymbol->language_specific, 0,

View File

@ -80,13 +80,6 @@ struct common_block;
--chastain 2003-08-21 */
/* Struct for storing C++ specific information. Allocated when needed. */
struct cplus_specific
{
const char *demangled_name;
};
/* Define a structure for the information that is common to all symbol types,
including minimal symbols, partial symbols, and full symbols. In a
multilanguage environment, some language specific information may need to
@ -141,14 +134,12 @@ struct general_symbol_info
struct obstack *obstack;
/* This is used by languages which wish to store a demangled name.
currently used by Ada, Java, and Objective C. */
currently used by Ada, C++, Java, and Objective C. */
struct mangled_lang
{
const char *demangled_name;
}
mangled_lang;
struct cplus_specific *cplus_specific;
}
language_specific;