* utils.c (fputs_demangled): Complete rewrite to clean up and

add a language parameter that is used to select the demangling
	algorithm.
	* defs.h (enum language):  Move further up in file so enum can
	be used in prototypes.
	* defs.h (fputs_demangled):  Update prototype to add lang arg.
	* c-typeprint.c (cp_type_print_method_args):  Add language arg
	to fputs_demangled calls, remove DMGL_PARAMS flag.
	* stack.c (print_frame_info):  Remove obsolete code so we don't
	have to update fputs_demangled usage in it.
	* stack.c (print_frame_info, frame_info):  Add language variable
	to pass to fputs_demangled and initialize it from the symbol's
	language.  Call fputs_demangled with language arg.
	* symtab.c (find_methods):  Add language arg to fputs_demangled
	call.
This commit is contained in:
Fred Fish 1993-03-11 17:44:39 +00:00
parent 0b96ed0655
commit bd5d07d94c
6 changed files with 199 additions and 180 deletions

View File

@ -1,3 +1,21 @@
Thu Mar 11 09:33:01 1993 Fred Fish (fnf@cygnus.com)
* utils.c (fputs_demangled): Complete rewrite to clean up and
add a language parameter that is used to select the demangling
algorithm.
* defs.h (enum language): Move further up in file so enum can
be used in prototypes.
* defs.h (fputs_demangled): Update prototype to add lang arg.
* c-typeprint.c (cp_type_print_method_args): Add language arg
to fputs_demangled calls, remove DMGL_PARAMS flag.
* stack.c (print_frame_info): Remove obsolete code so we don't
have to update fputs_demangled usage in it.
* stack.c (print_frame_info, frame_info): Add language variable
to pass to fputs_demangled and initialize it from the symbol's
language. Call fputs_demangled with language arg.
* symtab.c (find_methods): Add language arg to fputs_demangled
call.
Wed Mar 10 17:37:11 1993 Fred Fish (fnf@cygnus.com) Wed Mar 10 17:37:11 1993 Fred Fish (fnf@cygnus.com)
* Makefile.in (VERSION): Bump version to 4.8.2. * Makefile.in (VERSION): Bump version to 4.8.2.

View File

@ -151,8 +151,8 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream)
{ {
int i; int i;
fputs_demangled (prefix, stream, DMGL_ANSI | DMGL_PARAMS); fputs_demangled (prefix, stream, DMGL_ANSI, language_cplus);
fputs_demangled (varstring, stream, DMGL_ANSI | DMGL_PARAMS); fputs_demangled (varstring, stream, DMGL_ANSI, language_cplus);
fputs_filtered (" (", stream); fputs_filtered (" (", stream);
if (args && args[!staticp] && args[!staticp]->code != TYPE_CODE_VOID) if (args && args[!staticp] && args[!staticp]->code != TYPE_CODE_VOID)
{ {

View File

@ -36,7 +36,7 @@ typedef unsigned int CORE_ADDR;
/* Gdb does *lots* of string compares. Use macros to speed them up by /* Gdb does *lots* of string compares. Use macros to speed them up by
avoiding function calls if the first characters are not the same. */ avoiding function calls if the first characters are not the same. */
#define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : *(a) - *(b)) #define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : (int)*(a) - (int)*(b))
#define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0) #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
#define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0) #define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)
@ -72,6 +72,23 @@ enum command_class
class_pseudo class_pseudo
}; };
/* Languages represented in the symbol table and elsewhere.
This should probably be in language.h, but since enum's can't
be forward declared to satisfy opaque references before their
actual definition, needs to be here. */
enum language
{
language_unknown, /* Language not known */
language_auto, /* Placeholder for automatic setting */
language_c, /* C */
language_cplus, /* C++ */
/* start-sanitize-chill */
language_chill, /* Chill */
/* end-sanitize-chill */
language_m2 /* Modula-2 */
};
/* the cleanup list records things that have to be undone /* the cleanup list records things that have to be undone
if an error happens (descriptors to be closed, memory to be freed, etc.) if an error happens (descriptors to be closed, memory to be freed, etc.)
Each link in the chain records a function to call and an Each link in the chain records a function to call and an
@ -247,7 +264,7 @@ extern void
fprint_symbol PARAMS ((FILE *, char *)); fprint_symbol PARAMS ((FILE *, char *));
extern void extern void
fputs_demangled PARAMS ((char *, FILE *, int)); fputs_demangled PARAMS ((char *, FILE *, int, enum language));
extern void extern void
perror_with_name PARAMS ((char *)); perror_with_name PARAMS ((char *));
@ -349,23 +366,6 @@ extern unsigned output_radix;
/* Baud rate specified for communication with serial target systems. */ /* Baud rate specified for communication with serial target systems. */
extern char *baud_rate; extern char *baud_rate;
/* Languages represented in the symbol table and elsewhere.
This should probably be in language.h, but since enum's can't
be forward declared to satisfy opaque references before their
actual definition, needs to be here. */
enum language
{
language_unknown, /* Language not known */
language_auto, /* Placeholder for automatic setting */
language_c, /* C */
language_cplus, /* C++ */
/* start-sanitize-chill */
language_chill, /* Chill */
/* end-sanitize-chill */
language_m2 /* Modula-2 */
};
/* Possibilities for prettyprint parameters to routines which print /* Possibilities for prettyprint parameters to routines which print
things. Like enum language, this should be in value.h, but needs things. Like enum language, this should be in value.h, but needs
to be here for the same reason. FIXME: If we can eliminate this to be here for the same reason. FIXME: If we can eliminate this
@ -538,6 +538,17 @@ enum val_prettyprint
# endif # endif
#endif #endif
/* If we picked up a copy of CHAR_BIT from a configuration file
(which may get it by including <limits.h>) then use it to set
the number of bits in a host char. If not, use the same size
as the target. */
#if defined (CHAR_BIT)
#define HOST_CHAR_BIT CHAR_BIT
#else
#define HOST_CHAR_BIT TARGET_CHAR_BIT
#endif
/* Assorted functions we can declare, now that const and volatile are /* Assorted functions we can declare, now that const and volatile are
defined. */ defined. */

View File

@ -1,5 +1,5 @@
/* Print and select stack frames for GDB, the GNU debugger. /* Print and select stack frames for GDB, the GNU debugger.
Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc. Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
@ -139,33 +139,9 @@ print_frame_info (fi, level, source, args)
struct symtab_and_line sal; struct symtab_and_line sal;
struct symbol *func; struct symbol *func;
register char *funname = 0; register char *funname = 0;
enum language funlang = language_unknown;
int numargs; int numargs;
#if 0 /* Symbol reading is fast enough now */
struct partial_symtab *pst;
/* Don't give very much information if we haven't readin the
symbol table yet. */
pst = find_pc_psymtab (fi->pc);
if (pst && !pst->readin)
{
/* Abbreviated information. */
char *fname;
if (!find_pc_partial_function (fi->pc, &fname, 0))
fname = "??";
printf_filtered ("#%-2d ", level);
if (addressprint)
printf_filtered ("%s in ", local_hex_string(fi->pc));
fputs_demangled (fname, stdout, 0);
fputs_filtered (" (...)\n", stdout);
return;
}
#endif
#ifdef CORE_NEEDS_RELOCATION #ifdef CORE_NEEDS_RELOCATION
CORE_NEEDS_RELOCATION(fi->pc); CORE_NEEDS_RELOCATION(fi->pc);
#endif #endif
@ -190,7 +166,7 @@ print_frame_info (fi, level, source, args)
struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
if (msymbol != NULL if (msymbol != NULL
&& (msymbol -> address && (SYMBOL_VALUE_ADDRESS (msymbol)
> BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
{ {
/* In this case we have no way of knowing the source file /* In this case we have no way of knowing the source file
@ -199,16 +175,23 @@ print_frame_info (fi, level, source, args)
/* We also don't know anything about the function besides /* We also don't know anything about the function besides
its address and name. */ its address and name. */
func = 0; func = 0;
funname = msymbol -> name; funname = SYMBOL_NAME (msymbol);
funlang = SYMBOL_LANGUAGE (msymbol);
} }
else else
funname = SYMBOL_NAME (func); {
funname = SYMBOL_NAME (func);
funlang = SYMBOL_LANGUAGE (func);
}
} }
else else
{ {
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
if (msymbol != NULL) if (msymbol != NULL)
funname = msymbol -> name; {
funname = SYMBOL_NAME (msymbol);
funlang = SYMBOL_LANGUAGE (msymbol);
}
} }
if (source >= 0 || !sal.symtab) if (source >= 0 || !sal.symtab)
@ -218,7 +201,7 @@ print_frame_info (fi, level, source, args)
if (addressprint) if (addressprint)
if (fi->pc != sal.pc || !sal.symtab) if (fi->pc != sal.pc || !sal.symtab)
printf_filtered ("%s in ", local_hex_string(fi->pc)); printf_filtered ("%s in ", local_hex_string(fi->pc));
fputs_demangled (funname ? funname : "??", stdout, 0); fputs_demangled (funname ? funname : "??", stdout, 0, funlang);
wrap_here (" "); wrap_here (" ");
fputs_filtered (" (", stdout); fputs_filtered (" (", stdout);
if (args) if (args)
@ -265,10 +248,6 @@ print_frame_info (fi, level, source, args)
fflush (stdout); fflush (stdout);
} }
#ifdef FRAME_SPECIFICATION_DYADIC
extern FRAME setup_arbitrary_frame ();
#endif
/* /*
* Read a frame specification in whatever the appropriate format is. * Read a frame specification in whatever the appropriate format is.
* Call error() if the specification is in any way invalid (i.e. * Call error() if the specification is in any way invalid (i.e.
@ -279,7 +258,9 @@ parse_frame_specification (frame_exp)
char *frame_exp; char *frame_exp;
{ {
int numargs = 0; int numargs = 0;
int arg1, arg2; int arg1, arg2, arg3;
#define MAXARGS 4
int args[MAXARGS];
if (frame_exp) if (frame_exp)
{ {
@ -287,27 +268,25 @@ parse_frame_specification (frame_exp)
struct cleanup *tmp_cleanup; struct cleanup *tmp_cleanup;
while (*frame_exp == ' ') frame_exp++; while (*frame_exp == ' ') frame_exp++;
for (p = frame_exp; *p && *p != ' '; p++)
;
if (*frame_exp) while (*frame_exp)
{ {
numargs = 1; if (numargs > MAXARGS)
error ("Too many args in frame specification");
/* Parse an argument. */
for (p = frame_exp; *p && *p != ' '; p++)
;
addr_string = savestring(frame_exp, p - frame_exp); addr_string = savestring(frame_exp, p - frame_exp);
{ {
tmp_cleanup = make_cleanup (free, addr_string); tmp_cleanup = make_cleanup (free, addr_string);
arg1 = parse_and_eval_address (addr_string); args[numargs++] = parse_and_eval_address (addr_string);
do_cleanups (tmp_cleanup); do_cleanups (tmp_cleanup);
} }
/* Skip spaces, move to possible next arg. */
while (*p == ' ') p++; while (*p == ' ') p++;
frame_exp = p;
if (*p)
{
numargs = 2;
arg2 = parse_and_eval_address (p);
}
} }
} }
@ -320,7 +299,7 @@ parse_frame_specification (frame_exp)
/* NOTREACHED */ /* NOTREACHED */
case 1: case 1:
{ {
int level = arg1; int level = args[0];
FRAME fid = find_relative_frame (get_current_frame (), &level); FRAME fid = find_relative_frame (get_current_frame (), &level);
FRAME tfid; FRAME tfid;
@ -332,35 +311,33 @@ parse_frame_specification (frame_exp)
(s)he gets. Still, give the highest one that matches. */ (s)he gets. Still, give the highest one that matches. */
for (fid = get_current_frame (); for (fid = get_current_frame ();
fid && FRAME_FP (fid) != arg1; fid && FRAME_FP (fid) != args[0];
fid = get_prev_frame (fid)) fid = get_prev_frame (fid))
; ;
if (fid) if (fid)
while ((tfid = get_prev_frame (fid)) && while ((tfid = get_prev_frame (fid)) &&
(FRAME_FP (tfid) == arg1)) (FRAME_FP (tfid) == args[0]))
fid = tfid; fid = tfid;
#ifdef FRAME_SPECIFICATION_DYADIC /* We couldn't identify the frame as an existing frame, but
if (!fid) perhaps we can create one with a single argument.
error ("Incorrect number of args in frame specification"); Fall through to default case; it's up to SETUP_ARBITRARY_FRAME
to complain if it doesn't like a single arg. */
return fid;
#else
return create_new_frame (arg1, 0);
#endif
} }
/* NOTREACHED */
case 2: default:
/* Must be addresses */ #ifdef SETUP_ARBITRARY_FRAME
#ifndef FRAME_SPECIFICATION_DYADIC return SETUP_ARBITRARY_FRAME (numargs, args);
error ("Incorrect number of args in frame specification");
#else #else
return setup_arbitrary_frame (arg1, arg2); /* Usual case. Do it here rather than have everyone supply
a SETUP_ARBITRARY_FRAME that does this. */
if (numargs == 1)
return create_new_frame (args[0], 0);
error ("Too many args in frame specification");
#endif #endif
/* NOTREACHED */ /* NOTREACHED */
} }
fatal ("Internal: Error in parsing in parse_frame_specification");
/* NOTREACHED */ /* NOTREACHED */
} }
@ -391,6 +368,7 @@ frame_info (addr_exp, from_tty)
FRAME calling_frame; FRAME calling_frame;
int i, count; int i, count;
char *funname = 0; char *funname = 0;
enum language funlang = language_unknown;
if (!target_has_stack) if (!target_has_stack)
error ("No inferior or core file."); error ("No inferior or core file.");
@ -404,12 +382,18 @@ frame_info (addr_exp, from_tty)
func = get_frame_function (frame); func = get_frame_function (frame);
s = find_pc_symtab(fi->pc); s = find_pc_symtab(fi->pc);
if (func) if (func)
funname = SYMBOL_NAME (func); {
funname = SYMBOL_NAME (func);
funlang = SYMBOL_LANGUAGE (func);
}
else else
{ {
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
if (msymbol != NULL) if (msymbol != NULL)
funname = msymbol -> name; {
funname = SYMBOL_NAME (msymbol);
funlang = SYMBOL_LANGUAGE (msymbol);
}
} }
calling_frame = get_prev_frame (frame); calling_frame = get_prev_frame (frame);
@ -429,7 +413,7 @@ frame_info (addr_exp, from_tty)
if (funname) if (funname)
{ {
printf_filtered (" in "); printf_filtered (" in ");
fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS); fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS, funlang);
} }
wrap_here (" "); wrap_here (" ");
if (sal.symtab) if (sal.symtab)
@ -461,6 +445,10 @@ frame_info (addr_exp, from_tty)
if (s) if (s)
printf_filtered(" source language %s.\n", language_str(s->language)); printf_filtered(" source language %s.\n", language_str(s->language));
#ifdef PRINT_EXTRA_FRAME_INFO
PRINT_EXTRA_FRAME_INFO (fi);
#endif
{ {
/* Address of the argument list for this frame, or 0. */ /* Address of the argument list for this frame, or 0. */
CORE_ADDR arg_list = FRAME_ARGS_ADDRESS_CORRECT (fi); CORE_ADDR arg_list = FRAME_ARGS_ADDRESS_CORRECT (fi);
@ -666,7 +654,7 @@ print_block_frame_locals (b, frame, stream)
|| SYMBOL_CLASS (sym) == LOC_STATIC) || SYMBOL_CLASS (sym) == LOC_STATIC)
{ {
values_printed = 1; values_printed = 1;
fprint_symbol (stream, SYMBOL_NAME (sym)); fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
fputs_filtered (" = ", stream); fputs_filtered (" = ", stream);
print_variable_value (sym, frame, stream); print_variable_value (sym, frame, stream);
fprintf_filtered (stream, "\n"); fprintf_filtered (stream, "\n");
@ -693,7 +681,7 @@ print_block_frame_labels (b, have_default, stream)
for (i = 0; i < nsyms; i++) for (i = 0; i < nsyms; i++)
{ {
sym = BLOCK_SYM (b, i); sym = BLOCK_SYM (b, i);
if (! strcmp (SYMBOL_NAME (sym), "default")) if (STREQ (SYMBOL_NAME (sym), "default"))
{ {
if (*have_default) if (*have_default)
continue; continue;
@ -704,7 +692,7 @@ print_block_frame_labels (b, have_default, stream)
struct symtab_and_line sal; struct symtab_and_line sal;
sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0); sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
values_printed = 1; values_printed = 1;
fputs_demangled (SYMBOL_NAME (sym), stream, DMGL_ANSI | DMGL_PARAMS); fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
if (addressprint) if (addressprint)
fprintf_filtered (stream, " %s", fprintf_filtered (stream, " %s",
local_hex_string(SYMBOL_VALUE_ADDRESS (sym))); local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
@ -879,7 +867,7 @@ print_frame_arg_vars (frame, stream)
|| SYMBOL_CLASS (sym) == LOC_REGPARM) || SYMBOL_CLASS (sym) == LOC_REGPARM)
{ {
values_printed = 1; values_printed = 1;
fprint_symbol (stream, SYMBOL_NAME (sym)); fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
fputs_filtered (" = ", stream); fputs_filtered (" = ", stream);
/* We have to look up the symbol because arguments often have /* We have to look up the symbol because arguments often have
two entries (one a parameter, one a register) and the one two entries (one a parameter, one a register) and the one
@ -1127,8 +1115,6 @@ return_command (retval_exp, from_tty)
FRAME_ADDR selected_frame_addr; FRAME_ADDR selected_frame_addr;
CORE_ADDR selected_frame_pc; CORE_ADDR selected_frame_pc;
FRAME frame; FRAME frame;
char *funcname;
struct cleanup *back_to;
value return_value; value return_value;
if (selected_frame == NULL) if (selected_frame == NULL)
@ -1153,14 +1139,11 @@ return_command (retval_exp, from_tty)
{ {
if (thisfun != 0) if (thisfun != 0)
{ {
funcname = strdup_demangled (SYMBOL_NAME (thisfun)); if (!query ("Make %s return now? ", SYMBOL_SOURCE_NAME (thisfun)))
back_to = make_cleanup (free, funcname);
if (!query ("Make %s return now? ", funcname))
{ {
error ("Not confirmed."); error ("Not confirmed.");
/* NOTREACHED */ /* NOTREACHED */
} }
do_cleanups (back_to);
} }
else else
if (!query ("Make selected stack frame return now? ")) if (!query ("Make selected stack frame return now? "))

View File

@ -1389,7 +1389,8 @@ find_methods (t, name, sym_arr)
else else
{ {
fputs_filtered("(Cannot find method ", stdout); fputs_filtered("(Cannot find method ", stdout);
fputs_demangled(phys_name, stdout, DMGL_PARAMS); fputs_demangled(phys_name, stdout, DMGL_PARAMS,
language_cplus);
fputs_filtered(" - possibly inlined.)\n", stdout); fputs_filtered(" - possibly inlined.)\n", stdout);
} }
} }

View File

@ -33,6 +33,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "bfd.h" #include "bfd.h"
#include "target.h" #include "target.h"
#include "demangle.h" #include "demangle.h"
#include "expression.h"
#include "language.h"
/* Prototypes for local functions */ /* Prototypes for local functions */
@ -411,9 +413,33 @@ quit ()
#else #else
error ("Quit (expect signal %d when inferior is resumed)", SIGINT); error ("Quit (expect signal %d when inferior is resumed)", SIGINT);
#endif /* TIOCGPGRP */ #endif /* TIOCGPGRP */
#else
error ("Quit");
#endif #endif
} }
#ifdef __GO32__
/* In the absence of signals, poll keyboard for a quit.
Called from #define QUIT pollquit() in xm-go32.h. */
void
pollquit()
{
if (kbhit ())
{
int k = getkey ();
if (k == 1)
quit_flag = 1;
else if (k == 2)
immediate_quit = 1;
quit ();
}
}
#endif
/* Control C comes here */ /* Control C comes here */
void void
@ -1110,71 +1136,50 @@ fputs_filtered (linebuffer, stream)
} }
/* fputs_demangled is a variant of fputs_filtered that /* fputs_demangled attempts to demangle NAME, a symbol in language LANG, using
demangles g++ names.*/ demangling args ARG_MODE, and print it filtered to STREAM. If the name is
not mangled, or the language for the name is unknown, or demangling is off,
the name is printed in its "raw" form. */
void void
fputs_demangled (linebuffer, stream, arg_mode) fputs_demangled (name, stream, arg_mode, lang)
char *linebuffer; char *name;
FILE *stream; FILE *stream;
int arg_mode; int arg_mode;
enum language lang;
{ {
#define SYMBOL_MAX 1024 char *demangled;
#define SYMBOL_CHAR(c) (isascii(c) \ if (name != NULL)
&& (isalnum(c) || (c) == '_' || (c) == CPLUS_MARKER)) {
/* If user wants to see raw output, no problem. */
char buf[SYMBOL_MAX+1]; if (!demangle)
# define DMSLOP 5 /* How much room to leave in buf */ {
char *p; fputs_filtered (name, stream);
}
if (linebuffer == NULL) else
return; {
switch (lang)
/* If user wants to see raw output, no problem. */ {
if (!demangle) { case language_cplus:
fputs_filtered (linebuffer, stream); demangled = cplus_demangle (name, arg_mode);
return; break;
} /* start-sanitize-chill */
case language_chill:
p = linebuffer; demangled = chill_demangle (name);
break;
while ( *p != (char) 0 ) { /* end-sanitize-chill */
int i = 0; default:
demangled = NULL;
/* collect non-interesting characters into buf */ break;
while (*p != (char) 0 && !SYMBOL_CHAR(*p) && i < (int)sizeof(buf)-DMSLOP ) { }
buf[i++] = *p; fputs_filtered (demangled ? demangled : name, stream);
p++; if (demangled != NULL)
{
free (demangled);
}
}
} }
if (i > 0) {
/* output the non-interesting characters without demangling */
buf[i] = (char) 0;
fputs_filtered(buf, stream);
i = 0; /* reset buf */
}
/* and now the interesting characters */
while (i < SYMBOL_MAX
&& *p != (char) 0
&& SYMBOL_CHAR(*p)
&& i < (int)sizeof(buf) - DMSLOP) {
buf[i++] = *p;
p++;
}
buf[i] = (char) 0;
if (i > 0) {
char * result;
if ( (result = cplus_demangle(buf, arg_mode)) != NULL ) {
fputs_filtered(result, stream);
free(result);
}
else {
fputs_filtered(buf, stream);
}
}
}
} }
/* Print a variable number of ARGS using format FORMAT. If this /* Print a variable number of ARGS using format FORMAT. If this
@ -1361,34 +1366,34 @@ print_spaces_filtered (n, stream)
/* C++ demangler stuff. */ /* C++ demangler stuff. */
/* Make a copy of a symbol, applying C++ demangling if demangling is enabled
and a demangled version exists. Note that the value returned from
cplus_demangle is already allocated in malloc'd memory. */
char *
strdup_demangled (name)
const char *name;
{
char *demangled = NULL;
if (demangle)
{
demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI);
}
return ((demangled != NULL) ? demangled : strdup (name));
}
/* Print NAME on STREAM, demangling if necessary. */ /* Print NAME on STREAM, demangling if necessary. */
void void
fprint_symbol (stream, name) fprint_symbol (stream, name)
FILE *stream; FILE *stream;
char *name; char *name;
{ {
char *demangled; char *demangled = NULL;
if ((!demangle)
|| NULL == (demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI))) if (demangle)
fputs_filtered (name, stream); {
/* Lacking a better method of knowing what demangler to use, pick
one appropriate for whatever the current language is. (FIXME) */
switch (current_language -> la_language)
{
case language_cplus:
demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI);
break;
/* start-sanitize-chill */
case language_chill:
demangled = chill_demangle (name);
break;
/* end-sanitize-chill */
}
}
if (demangled == NULL)
{
fputs_filtered (name, stream);
}
else else
{ {
fputs_filtered (demangled, stream); fputs_filtered (demangled, stream);
@ -1534,3 +1539,4 @@ _initialize_utils ()
#ifdef SIGWINCH_HANDLER_BODY #ifdef SIGWINCH_HANDLER_BODY
SIGWINCH_HANDLER_BODY SIGWINCH_HANDLER_BODY
#endif #endif