Use allocated cplus_specific for cplus symbols. 2010-07-15 Sami Wagiaalla * 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. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4510ccd..622331e 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -8674,7 +8674,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. */ diff --git a/gdb/symtab.c b/gdb/symtab.c index 2ed1bad..ec0e809 100644 --- a/gdb/symtab.c +++ b/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 diff --git a/gdb/symtab.h b/gdb/symtab.h index ceffe2b..e6ab26f 100644 --- a/gdb/symtab.h +++ b/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 *);