* stabs.c (stab_demangle_v3_arglist): New static function, broken
out of stab_demangle_v3_argtypes. (stab_demangle_v3_argtypes): Call it. (stab_demangle_v3_arg): Handle DEMANGLE_COMPONENT_FUNCTION_TYPE. If we find an unrecognized component, print out its number.
This commit is contained in:
parent
1ffa9a1825
commit
2b4c4cc415
2 changed files with 66 additions and 9 deletions
|
@ -1,3 +1,11 @@
|
|||
2004-10-25 Ian Lance Taylor <ian@wasabisystems.com>
|
||||
|
||||
* stabs.c (stab_demangle_v3_arglist): New static function, broken
|
||||
out of stab_demangle_v3_argtypes.
|
||||
(stab_demangle_v3_argtypes): Call it.
|
||||
(stab_demangle_v3_arg): Handle DEMANGLE_COMPONENT_FUNCTION_TYPE.
|
||||
If we find an unrecognized component, print out its number.
|
||||
|
||||
2004-10-25 David Mosberger <davidm@hpl.hp.com>
|
||||
|
||||
* readelf.c (slurp_ia64_unwind_table): Support relocations against
|
||||
|
|
|
@ -203,6 +203,8 @@ static debug_type *stab_demangle_argtypes
|
|||
(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 stab_handle *info,
|
|||
{
|
||||
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, struct stab_handle *info,
|
|||
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, struct stab_handle *info,
|
|||
|
||||
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, struct stab_handle *info,
|
|||
*pvarargs = TRUE;
|
||||
continue;
|
||||
}
|
||||
free (mem);
|
||||
free (pargs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -5138,8 +5161,6 @@ stab_demangle_v3_argtypes (void *dhandle, struct stab_handle *info,
|
|||
|
||||
pargs[count] = DEBUG_TYPE_NULL;
|
||||
|
||||
free (mem);
|
||||
|
||||
return pargs;
|
||||
}
|
||||
|
||||
|
@ -5173,12 +5194,12 @@ stab_demangle_v3_arg (void *dhandle, struct stab_handle *info,
|
|||
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, struct stab_handle *info,
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue