diff options
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 43d6e3c..0329dd9 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1297,30 +1297,28 @@ static struct htab *decoded_names_store; when a decoded name is cached in it. */ const char * -ada_decode_symbol (const struct general_symbol_info *gsymbol) +ada_decode_symbol (const struct general_symbol_info *arg) { - struct general_symbol_info *gsymbol_rw - = (struct general_symbol_info *) gsymbol; - const char **resultp - = &gsymbol_rw->language_specific.mangled_lang.demangled_name; + struct general_symbol_info *gsymbol = (struct general_symbol_info *) arg; + const char **resultp = + &gsymbol->language_specific.mangled_lang.demangled_name; - if (*resultp == NULL) + if (!gsymbol->ada_mangled) { const char *decoded = ada_decode (gsymbol->name); + struct obstack *obstack = gsymbol->language_specific.obstack; - if (gsymbol->obj_section != NULL) - { - struct objfile *objf = gsymbol->obj_section->objfile; + gsymbol->ada_mangled = 1; - *resultp = obstack_copy0 (&objf->objfile_obstack, - decoded, strlen (decoded)); - } - /* Sometimes, we can't find a corresponding objfile, in which - case, we put the result on the heap. Since we only decode - when needed, we hope this usually does not cause a - significant memory leak (FIXME). */ - if (*resultp == NULL) + if (obstack != NULL) + *resultp = obstack_copy0 (obstack, decoded, strlen (decoded)); + else { + /* Sometimes, we can't find a corresponding objfile, in + which case, we put the result on the heap. Since we only + decode when needed, we hope this usually does not cause a + significant memory leak (FIXME). */ + char **slot = (char **) htab_find_slot (decoded_names_store, decoded, INSERT); |