This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: wrapper for demangler
bfd_demangle returns NULL if it is passed a string that isn't a
mangled name, just like the libiberty demangler. The old binutils and
ld demangler returned their input string instead. I missed adjusting
a few places where the new demangler is called, resulting in segfaults.
binutils/
* prdbg.c (tg_variable): Adjust for changed demangler.
(tg_start_function): Likewise.
ld/
* ldcref.c (struct cref_hash_entry): Make "demangled" const.
(cref_fill_array): Adjust for changed demangler.
* ldlang.c (lang_one_common): Likewise.
Index: binutils/prdbg.c
===================================================================
RCS file: /cvs/src/src/binutils/prdbg.c,v
retrieving revision 1.17
diff -u -p -r1.17 prdbg.c
--- binutils/prdbg.c 26 Apr 2007 14:46:59 -0000 1.17
+++ binutils/prdbg.c 28 Apr 2007 02:57:29 -0000
@@ -2525,25 +2525,18 @@ tg_variable (void *p, const char *name,
bfd_vma val ATTRIBUTE_UNUSED)
{
struct pr_handle *info = (struct pr_handle *) p;
- char *t;
- const char *dname, *from_class;
+ char *t, *dname, *from_class;
t = pop_type (info);
if (t == NULL)
return FALSE;
- dname = name;
+ dname = NULL;
if (info->demangler)
- {
- dname = info->demangler (info->abfd, name, DMGL_ANSI | DMGL_PARAMS);
- if (strcmp (name, dname) == 0)
- {
- free ((char *) dname);
- dname = name;
- }
- }
+ dname = info->demangler (info->abfd, name, DMGL_ANSI | DMGL_PARAMS);
- if (dname != name)
+ from_class = NULL;
+ if (dname != NULL)
{
char *sep;
sep = strstr (dname, "::");
@@ -2554,14 +2547,9 @@ tg_variable (void *p, const char *name,
from_class = dname;
}
else
- {
- /* Obscure types as vts and type_info nodes. */
- name = dname;
- from_class = NULL;
- }
+ /* Obscure types as vts and type_info nodes. */
+ name = dname;
}
- else
- from_class = NULL;
fprintf (info->f, "%s\t%s\t0;\"\tkind:v\ttype:%s", name, info->filename, t);
@@ -2579,10 +2567,10 @@ tg_variable (void *p, const char *name,
}
if (from_class)
- {
- fprintf (info->f, "\tclass:%s",from_class);
- free ((char *) dname);
- }
+ fprintf (info->f, "\tclass:%s", from_class);
+
+ if (dname)
+ free (dname);
fprintf (info->f, "\n");
@@ -2597,28 +2585,22 @@ static bfd_boolean
tg_start_function (void *p, const char *name, bfd_boolean global)
{
struct pr_handle *info = (struct pr_handle *) p;
- const char *dname;
+ char *dname;
if (! global)
info->stack->flavor = "static";
else
info->stack->flavor = NULL;
- dname = name;
+ dname = NULL;
if (info->demangler)
- {
- dname = info->demangler (info->abfd, name, DMGL_ANSI | DMGL_PARAMS);
- if (strcmp (name, dname) == 0)
- {
- free ((char *) dname);
- dname = name;
- }
- }
+ dname = info->demangler (info->abfd, name, DMGL_ANSI | DMGL_PARAMS);
- if (! substitute_type (info, dname))
+ if (! substitute_type (info, dname ? dname : name))
return FALSE;
- if (dname != name)
+ info->stack->method = NULL;
+ if (dname != NULL)
{
char *sep;
sep = strstr (dname, "::");
@@ -2638,8 +2620,6 @@ tg_start_function (void *p, const char *
*sep = 0;
/* Obscure functions as type_info function. */
}
- else
- info->stack->method = NULL;
info->stack->parents = strdup (name);
Index: ld/ldcref.c
===================================================================
RCS file: /cvs/src/src/ld/ldcref.c,v
retrieving revision 1.18
diff -u -p -r1.18 ldcref.c
--- ld/ldcref.c 26 Apr 2007 14:46:59 -0000 1.18
+++ ld/ldcref.c 28 Apr 2007 02:57:46 -0000
@@ -57,7 +57,7 @@ struct cref_ref {
struct cref_hash_entry {
struct bfd_hash_entry root;
/* The demangled name. */
- char *demangled;
+ const char *demangled;
/* References to and definitions of this symbol. */
struct cref_ref *refs;
};
@@ -327,6 +327,8 @@ cref_fill_array (struct cref_hash_entry
ASSERT (h->demangled == NULL);
h->demangled = bfd_demangle (output_bfd, h->root.string,
DMGL_ANSI | DMGL_PARAMS);
+ if (h->demangled == NULL)
+ h->demangled = h->root.string;
**pph = h;
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.260
diff -u -p -r1.260 ldlang.c
--- ld/ldlang.c 26 Apr 2007 14:46:59 -0000 1.260
+++ ld/ldlang.c 28 Apr 2007 02:57:50 -0000
@@ -5269,9 +5269,17 @@ lang_one_common (struct bfd_link_hash_en
name = bfd_demangle (output_bfd, h->root.string,
DMGL_ANSI | DMGL_PARAMS);
- minfo ("%s", name);
- len = strlen (name);
- free (name);
+ if (name == NULL)
+ {
+ minfo ("%s", h->root.string);
+ len = strlen (h->root.string);
+ }
+ else
+ {
+ minfo ("%s", name);
+ len = strlen (name);
+ free (name);
+ }
if (len >= 19)
{
--
Alan Modra
IBM OzLabs - Linux Technology Centre