This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: "Unrecognized demangle component" error
- From: Ian Lance Taylor <ian at wasabisystems dot com>
- To: "Dave Korn" <dk at artimi dot com>
- Cc: <binutils at sources dot redhat dot com>, <gdb at sources dot redhat dot com>
- Date: 25 Oct 2004 11:26:19 -0400
- Subject: Re: "Unrecognized demangle component" error
- References: <NUTMEGwZvIPNTAbAWFs000001fe@NUTMEG.CAM.ARTIMI.COM>
"Dave Korn" <dk@artimi.com> writes:
> > I wonder which component it was. I should have had the error message
> > print it out the number. It would probably also be friendlier to
> > print a warning and then return debug_make_void_type (dhandle).
>
> OK, I quickly plumbed in those changes (using 2.15 release sources), and see
> that they're all without exception references to type #34 which I make out to be
> DEMANGLE_COMPONENT_FUNCTION_TYPE. Ummm. I would imagine that's a slightly
> surprising result, perhaps?
That's what I would expect from a static method which takes a function
pointer as a parameter. For example, I can recreate the problem with
this one-liner:
class C { static int foo(int (*pfn)(int)); };
So it's not especially unlikely, it's just not handled.
Since you bring it up, I just checked in this patch to handle it.
Ian
Index: stabs.c
===================================================================
RCS file: /cvs/src/src/binutils/stabs.c,v
retrieving revision 1.20
diff -u -p -r1.20 stabs.c
--- stabs.c 12 Jan 2004 21:08:00 -0000 1.20
+++ stabs.c 25 Oct 2004 15:24:44 -0000
@@ -203,6 +203,8 @@ static debug_type *stab_demangle_argtype
(void *, struct stab_handle *, const char *, bfd_boolean *, unsigned int);
static debug_type *stab_demangle_v3_argtypes
(void *, struct stab_handle *, const char *, bfd_boolean *);
+static debug_type *stab_demangle_v3_arglist
+ (void *, struct stab_handle *, struct demangle_component *, bfd_boolean *);
static debug_type stab_demangle_v3_arg
(void *, struct stab_handle *, struct demangle_component *, debug_type,
bfd_boolean *);
@@ -5073,7 +5075,6 @@ stab_demangle_v3_argtypes (void *dhandle
{
struct demangle_component *dc;
void *mem;
- unsigned int alloc, count;
debug_type *pargs;
dc = cplus_demangle_v3_components (physname, DMGL_PARAMS | DMGL_ANSI, &mem);
@@ -5093,13 +5094,35 @@ stab_demangle_v3_argtypes (void *dhandle
return NULL;
}
+ pargs = stab_demangle_v3_arglist (dhandle, info,
+ dc->u.s_binary.right->u.s_binary.right,
+ pvarargs);
+
+ free (mem);
+
+ return pargs;
+}
+
+/* Demangle an argument list in a struct demangle_component tree.
+ Returns a DEBUG_TYPE_NULL terminated array of argument types, and
+ sets *PVARARGS to indicate whether this is a varargs function. */
+
+static debug_type *
+stab_demangle_v3_arglist (void *dhandle, struct stab_handle *info,
+ struct demangle_component *arglist,
+ bfd_boolean *pvarargs)
+{
+ struct demangle_component *dc;
+ unsigned int alloc, count;
+ debug_type *pargs;
+
alloc = 10;
pargs = (debug_type *) xmalloc (alloc * sizeof *pargs);
*pvarargs = FALSE;
count = 0;
- for (dc = dc->u.s_binary.right->u.s_binary.right;
+ for (dc = arglist;
dc != NULL;
dc = dc->u.s_binary.right)
{
@@ -5108,8 +5131,8 @@ stab_demangle_v3_argtypes (void *dhandle
if (dc->type != DEMANGLE_COMPONENT_ARGLIST)
{
- fprintf (stderr, _("Unexpected type in demangle tree\n"));
- free (mem);
+ fprintf (stderr, _("Unexpected type in v3 arglist demangling\n"));
+ free (pargs);
return NULL;
}
@@ -5122,7 +5145,7 @@ stab_demangle_v3_argtypes (void *dhandle
*pvarargs = TRUE;
continue;
}
- free (mem);
+ free (pargs);
return NULL;
}
@@ -5138,8 +5161,6 @@ stab_demangle_v3_argtypes (void *dhandle
pargs[count] = DEBUG_TYPE_NULL;
- free (mem);
-
return pargs;
}
@@ -5173,12 +5194,12 @@ stab_demangle_v3_arg (void *dhandle, str
case DEMANGLE_COMPONENT_COMPLEX:
case DEMANGLE_COMPONENT_IMAGINARY:
case DEMANGLE_COMPONENT_VENDOR_TYPE:
- case DEMANGLE_COMPONENT_FUNCTION_TYPE:
case DEMANGLE_COMPONENT_ARRAY_TYPE:
case DEMANGLE_COMPONENT_PTRMEM_TYPE:
case DEMANGLE_COMPONENT_ARGLIST:
default:
- fprintf (stderr, _("Unrecognized demangle component\n"));
+ fprintf (stderr, _("Unrecognized demangle component %d\n"),
+ (int) dc->type);
return NULL;
case DEMANGLE_COMPONENT_NAME:
@@ -5269,6 +5290,34 @@ stab_demangle_v3_arg (void *dhandle, str
return debug_make_reference_type (dhandle, dt);
}
+ case DEMANGLE_COMPONENT_FUNCTION_TYPE:
+ {
+ debug_type *pargs;
+ bfd_boolean varargs;
+
+ if (dc->u.s_binary.left == NULL)
+ {
+ /* In this case the return type is actually unknown.
+ However, I'm not sure this will ever arise in practice;
+ normally an unknown return type would only appear at
+ the top level, which is handled above. */
+ dt = debug_make_void_type (dhandle);
+ }
+ else
+ dt = stab_demangle_v3_arg (dhandle, info, dc->u.s_binary.left, NULL,
+ NULL);
+ if (dt == NULL)
+ return NULL;
+
+ pargs = stab_demangle_v3_arglist (dhandle, info,
+ dc->u.s_binary.right,
+ &varargs);
+ if (pargs == NULL)
+ return NULL;
+
+ return debug_make_function_type (dhandle, dt, pargs, varargs);
+ }
+
case DEMANGLE_COMPONENT_BUILTIN_TYPE:
{
char *p;