Use allocated cplus_specific for cplus symbols.
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.
This commit is contained in:
parent
502abbdf22
commit
29df156df4
|
@ -1,3 +1,16 @@
|
|||
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.
|
||||
|
||||
2010-07-16 Sami Wagiaalla <swagiaal@redhat.com>
|
||||
|
||||
* symtab.h (symbol_set_demangled_name): New function.
|
||||
|
|
|
@ -9744,7 +9744,9 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
|
|||
between gfortran, iFort etc. */
|
||||
if (cu->language == language_fortran
|
||||
&& symbol_get_demangled_name (&(sym->ginfo)) == NULL)
|
||||
symbol_set_demangled_name (&(sym->ginfo), (char *) dwarf2_full_name (name, die, cu));
|
||||
symbol_set_demangled_name (&(sym->ginfo),
|
||||
(char *) dwarf2_full_name (name, die, cu),
|
||||
NULL);
|
||||
|
||||
/* Default assumptions.
|
||||
Use the passed type or decode it from the die. */
|
||||
|
|
52
gdb/symtab.c
52
gdb/symtab.c
|
@ -340,20 +340,53 @@ 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 objfile *objfile)
|
||||
{
|
||||
/* A language_specific structure should not have been previously
|
||||
initialized. */
|
||||
gdb_assert (gsymbol->language_specific.cplus_specific == NULL);
|
||||
gdb_assert (objfile != NULL);
|
||||
|
||||
gsymbol->language_specific.cplus_specific =
|
||||
OBSTACK_ZALLOC (&objfile->objfile_obstack, struct cplus_specific);
|
||||
}
|
||||
|
||||
/* Set the demangled name of GSYMBOL to NAME. NAME must be already
|
||||
correctly allocated. */
|
||||
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. */
|
||||
void
|
||||
symbol_set_demangled_name (struct general_symbol_info *gsymbol,
|
||||
char *name)
|
||||
char *name,
|
||||
struct objfile *objfile)
|
||||
{
|
||||
gsymbol->language_specific.mangled_lang.demangled_name = name;
|
||||
if (gsymbol->language == language_cplus)
|
||||
{
|
||||
if (gsymbol->language_specific.cplus_specific == NULL)
|
||||
symbol_init_cplus_specific (gsymbol, objfile);
|
||||
|
||||
gsymbol->language_specific.cplus_specific->demangled_name = name;
|
||||
}
|
||||
else
|
||||
gsymbol->language_specific.mangled_lang.demangled_name = name;
|
||||
}
|
||||
|
||||
/* Return the demangled name of GSYMBOL. */
|
||||
char *
|
||||
symbol_get_demangled_name (const struct general_symbol_info *gsymbol)
|
||||
{
|
||||
return gsymbol->language_specific.mangled_lang.demangled_name;
|
||||
if (gsymbol->language == language_cplus)
|
||||
{
|
||||
gdb_assert (gsymbol->language_specific.cplus_specific != NULL);
|
||||
return gsymbol->language_specific.cplus_specific->demangled_name;
|
||||
}
|
||||
else
|
||||
return gsymbol->language_specific.mangled_lang.demangled_name;
|
||||
}
|
||||
|
||||
|
||||
|
@ -363,6 +396,7 @@ void
|
|||
symbol_init_language_specific (struct general_symbol_info *gsymbol,
|
||||
enum language language)
|
||||
{
|
||||
|
||||
gsymbol->language = language;
|
||||
if (gsymbol->language == language_cplus
|
||||
|| gsymbol->language == language_d
|
||||
|
@ -370,8 +404,10 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol,
|
|||
|| gsymbol->language == language_objc
|
||||
|| gsymbol->language == language_fortran)
|
||||
{
|
||||
symbol_set_demangled_name (gsymbol, NULL);
|
||||
symbol_set_demangled_name (gsymbol, NULL, NULL);
|
||||
}
|
||||
else if (gsymbol->language == language_cplus)
|
||||
gsymbol->language_specific.cplus_specific = NULL;
|
||||
else
|
||||
{
|
||||
memset (&gsymbol->language_specific, 0,
|
||||
|
@ -553,7 +589,7 @@ symbol_set_names (struct general_symbol_info *gsymbol,
|
|||
memcpy (gsymbol->name, linkage_name, len);
|
||||
gsymbol->name[len] = '\0';
|
||||
}
|
||||
symbol_set_demangled_name (gsymbol, NULL);
|
||||
symbol_set_demangled_name (gsymbol, NULL, NULL);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -649,9 +685,9 @@ symbol_set_names (struct general_symbol_info *gsymbol,
|
|||
|
||||
gsymbol->name = (*slot)->mangled + lookup_len - len;
|
||||
if ((*slot)->demangled[0] != '\0')
|
||||
symbol_set_demangled_name (gsymbol, (*slot)->demangled);
|
||||
symbol_set_demangled_name (gsymbol, (*slot)->demangled, objfile);
|
||||
else
|
||||
symbol_set_demangled_name (gsymbol, NULL);
|
||||
symbol_set_demangled_name (gsymbol, NULL, objfile);
|
||||
}
|
||||
|
||||
/* Return the source code name of a symbol. In languages where
|
||||
|
|
12
gdb/symtab.h
12
gdb/symtab.h
|
@ -75,7 +75,12 @@ struct program_space;
|
|||
|
||||
--chastain 2003-08-21 */
|
||||
|
||||
/* Struct for storing C++ specific information. Allocated when needed. */
|
||||
|
||||
struct cplus_specific
|
||||
{
|
||||
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
|
||||
|
@ -120,7 +125,7 @@ struct general_symbol_info
|
|||
value;
|
||||
|
||||
/* Since one and only one language can apply, wrap the language specific
|
||||
information inside a union. */
|
||||
information inside a union. */
|
||||
|
||||
union
|
||||
{
|
||||
|
@ -131,6 +136,8 @@ struct general_symbol_info
|
|||
char *demangled_name;
|
||||
}
|
||||
mangled_lang;
|
||||
|
||||
struct cplus_specific *cplus_specific;
|
||||
}
|
||||
language_specific;
|
||||
|
||||
|
@ -154,7 +161,8 @@ struct general_symbol_info
|
|||
struct obj_section *obj_section;
|
||||
};
|
||||
|
||||
extern void symbol_set_demangled_name (struct general_symbol_info *, char *);
|
||||
extern void symbol_set_demangled_name (struct general_symbol_info *, char *,
|
||||
struct objfile *);
|
||||
|
||||
extern char *symbol_get_demangled_name (const struct general_symbol_info *);
|
||||
|
||||
|
|
Loading…
Reference in New Issue