mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-23 02:51:56 +00:00
* 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:
parent
0b96ed0655
commit
bd5d07d94c
@ -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)
|
||||
|
||||
* Makefile.in (VERSION): Bump version to 4.8.2.
|
||||
|
@ -151,8 +151,8 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream)
|
||||
{
|
||||
int i;
|
||||
|
||||
fputs_demangled (prefix, stream, DMGL_ANSI | DMGL_PARAMS);
|
||||
fputs_demangled (varstring, stream, DMGL_ANSI | DMGL_PARAMS);
|
||||
fputs_demangled (prefix, stream, DMGL_ANSI, language_cplus);
|
||||
fputs_demangled (varstring, stream, DMGL_ANSI, language_cplus);
|
||||
fputs_filtered (" (", stream);
|
||||
if (args && args[!staticp] && args[!staticp]->code != TYPE_CODE_VOID)
|
||||
{
|
||||
|
49
gdb/defs.h
49
gdb/defs.h
@ -36,7 +36,7 @@ typedef unsigned int CORE_ADDR;
|
||||
/* Gdb does *lots* of string compares. Use macros to speed them up by
|
||||
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 STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)
|
||||
|
||||
@ -72,6 +72,23 @@ enum command_class
|
||||
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
|
||||
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
|
||||
@ -247,7 +264,7 @@ extern void
|
||||
fprint_symbol PARAMS ((FILE *, char *));
|
||||
|
||||
extern void
|
||||
fputs_demangled PARAMS ((char *, FILE *, int));
|
||||
fputs_demangled PARAMS ((char *, FILE *, int, enum language));
|
||||
|
||||
extern void
|
||||
perror_with_name PARAMS ((char *));
|
||||
@ -349,23 +366,6 @@ extern unsigned output_radix;
|
||||
/* Baud rate specified for communication with serial target systems. */
|
||||
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
|
||||
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
|
||||
@ -538,6 +538,17 @@ enum val_prettyprint
|
||||
# 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
|
||||
defined. */
|
||||
|
||||
|
139
gdb/stack.c
139
gdb/stack.c
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
@ -139,33 +139,9 @@ print_frame_info (fi, level, source, args)
|
||||
struct symtab_and_line sal;
|
||||
struct symbol *func;
|
||||
register char *funname = 0;
|
||||
enum language funlang = language_unknown;
|
||||
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
|
||||
CORE_NEEDS_RELOCATION(fi->pc);
|
||||
#endif
|
||||
@ -190,7 +166,7 @@ print_frame_info (fi, level, source, args)
|
||||
|
||||
struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||
if (msymbol != NULL
|
||||
&& (msymbol -> address
|
||||
&& (SYMBOL_VALUE_ADDRESS (msymbol)
|
||||
> BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
|
||||
{
|
||||
/* 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
|
||||
its address and name. */
|
||||
func = 0;
|
||||
funname = msymbol -> name;
|
||||
funname = SYMBOL_NAME (msymbol);
|
||||
funlang = SYMBOL_LANGUAGE (msymbol);
|
||||
}
|
||||
else
|
||||
funname = SYMBOL_NAME (func);
|
||||
{
|
||||
funname = SYMBOL_NAME (func);
|
||||
funlang = SYMBOL_LANGUAGE (func);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||
if (msymbol != NULL)
|
||||
funname = msymbol -> name;
|
||||
{
|
||||
funname = SYMBOL_NAME (msymbol);
|
||||
funlang = SYMBOL_LANGUAGE (msymbol);
|
||||
}
|
||||
}
|
||||
|
||||
if (source >= 0 || !sal.symtab)
|
||||
@ -218,7 +201,7 @@ print_frame_info (fi, level, source, args)
|
||||
if (addressprint)
|
||||
if (fi->pc != sal.pc || !sal.symtab)
|
||||
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
||||
fputs_demangled (funname ? funname : "??", stdout, 0);
|
||||
fputs_demangled (funname ? funname : "??", stdout, 0, funlang);
|
||||
wrap_here (" ");
|
||||
fputs_filtered (" (", stdout);
|
||||
if (args)
|
||||
@ -265,10 +248,6 @@ print_frame_info (fi, level, source, args)
|
||||
fflush (stdout);
|
||||
}
|
||||
|
||||
#ifdef FRAME_SPECIFICATION_DYADIC
|
||||
extern FRAME setup_arbitrary_frame ();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Read a frame specification in whatever the appropriate format is.
|
||||
* Call error() if the specification is in any way invalid (i.e.
|
||||
@ -279,7 +258,9 @@ parse_frame_specification (frame_exp)
|
||||
char *frame_exp;
|
||||
{
|
||||
int numargs = 0;
|
||||
int arg1, arg2;
|
||||
int arg1, arg2, arg3;
|
||||
#define MAXARGS 4
|
||||
int args[MAXARGS];
|
||||
|
||||
if (frame_exp)
|
||||
{
|
||||
@ -287,27 +268,25 @@ parse_frame_specification (frame_exp)
|
||||
struct cleanup *tmp_cleanup;
|
||||
|
||||
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);
|
||||
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
/* Skip spaces, move to possible next arg. */
|
||||
while (*p == ' ') p++;
|
||||
|
||||
if (*p)
|
||||
{
|
||||
numargs = 2;
|
||||
arg2 = parse_and_eval_address (p);
|
||||
}
|
||||
frame_exp = p;
|
||||
}
|
||||
}
|
||||
|
||||
@ -320,7 +299,7 @@ parse_frame_specification (frame_exp)
|
||||
/* NOTREACHED */
|
||||
case 1:
|
||||
{
|
||||
int level = arg1;
|
||||
int level = args[0];
|
||||
FRAME fid = find_relative_frame (get_current_frame (), &level);
|
||||
FRAME tfid;
|
||||
|
||||
@ -332,35 +311,33 @@ parse_frame_specification (frame_exp)
|
||||
(s)he gets. Still, give the highest one that matches. */
|
||||
|
||||
for (fid = get_current_frame ();
|
||||
fid && FRAME_FP (fid) != arg1;
|
||||
fid && FRAME_FP (fid) != args[0];
|
||||
fid = get_prev_frame (fid))
|
||||
;
|
||||
|
||||
if (fid)
|
||||
while ((tfid = get_prev_frame (fid)) &&
|
||||
(FRAME_FP (tfid) == arg1))
|
||||
(FRAME_FP (tfid) == args[0]))
|
||||
fid = tfid;
|
||||
|
||||
#ifdef FRAME_SPECIFICATION_DYADIC
|
||||
if (!fid)
|
||||
error ("Incorrect number of args in frame specification");
|
||||
|
||||
return fid;
|
||||
#else
|
||||
return create_new_frame (arg1, 0);
|
||||
#endif
|
||||
/* We couldn't identify the frame as an existing frame, but
|
||||
perhaps we can create one with a single argument.
|
||||
Fall through to default case; it's up to SETUP_ARBITRARY_FRAME
|
||||
to complain if it doesn't like a single arg. */
|
||||
}
|
||||
/* NOTREACHED */
|
||||
case 2:
|
||||
/* Must be addresses */
|
||||
#ifndef FRAME_SPECIFICATION_DYADIC
|
||||
error ("Incorrect number of args in frame specification");
|
||||
|
||||
default:
|
||||
#ifdef SETUP_ARBITRARY_FRAME
|
||||
return SETUP_ARBITRARY_FRAME (numargs, args);
|
||||
#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
|
||||
/* NOTREACHED */
|
||||
}
|
||||
fatal ("Internal: Error in parsing in parse_frame_specification");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
@ -391,6 +368,7 @@ frame_info (addr_exp, from_tty)
|
||||
FRAME calling_frame;
|
||||
int i, count;
|
||||
char *funname = 0;
|
||||
enum language funlang = language_unknown;
|
||||
|
||||
if (!target_has_stack)
|
||||
error ("No inferior or core file.");
|
||||
@ -404,12 +382,18 @@ frame_info (addr_exp, from_tty)
|
||||
func = get_frame_function (frame);
|
||||
s = find_pc_symtab(fi->pc);
|
||||
if (func)
|
||||
funname = SYMBOL_NAME (func);
|
||||
{
|
||||
funname = SYMBOL_NAME (func);
|
||||
funlang = SYMBOL_LANGUAGE (func);
|
||||
}
|
||||
else
|
||||
{
|
||||
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||
if (msymbol != NULL)
|
||||
funname = msymbol -> name;
|
||||
{
|
||||
funname = SYMBOL_NAME (msymbol);
|
||||
funlang = SYMBOL_LANGUAGE (msymbol);
|
||||
}
|
||||
}
|
||||
calling_frame = get_prev_frame (frame);
|
||||
|
||||
@ -429,7 +413,7 @@ frame_info (addr_exp, from_tty)
|
||||
if (funname)
|
||||
{
|
||||
printf_filtered (" in ");
|
||||
fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS);
|
||||
fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS, funlang);
|
||||
}
|
||||
wrap_here (" ");
|
||||
if (sal.symtab)
|
||||
@ -461,6 +445,10 @@ frame_info (addr_exp, from_tty)
|
||||
if (s)
|
||||
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. */
|
||||
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)
|
||||
{
|
||||
values_printed = 1;
|
||||
fprint_symbol (stream, SYMBOL_NAME (sym));
|
||||
fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
|
||||
fputs_filtered (" = ", stream);
|
||||
print_variable_value (sym, frame, stream);
|
||||
fprintf_filtered (stream, "\n");
|
||||
@ -693,7 +681,7 @@ print_block_frame_labels (b, have_default, stream)
|
||||
for (i = 0; i < nsyms; i++)
|
||||
{
|
||||
sym = BLOCK_SYM (b, i);
|
||||
if (! strcmp (SYMBOL_NAME (sym), "default"))
|
||||
if (STREQ (SYMBOL_NAME (sym), "default"))
|
||||
{
|
||||
if (*have_default)
|
||||
continue;
|
||||
@ -704,7 +692,7 @@ print_block_frame_labels (b, have_default, stream)
|
||||
struct symtab_and_line sal;
|
||||
sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
|
||||
values_printed = 1;
|
||||
fputs_demangled (SYMBOL_NAME (sym), stream, DMGL_ANSI | DMGL_PARAMS);
|
||||
fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
|
||||
if (addressprint)
|
||||
fprintf_filtered (stream, " %s",
|
||||
local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
|
||||
@ -879,7 +867,7 @@ print_frame_arg_vars (frame, stream)
|
||||
|| SYMBOL_CLASS (sym) == LOC_REGPARM)
|
||||
{
|
||||
values_printed = 1;
|
||||
fprint_symbol (stream, SYMBOL_NAME (sym));
|
||||
fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
|
||||
fputs_filtered (" = ", stream);
|
||||
/* We have to look up the symbol because arguments often have
|
||||
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;
|
||||
CORE_ADDR selected_frame_pc;
|
||||
FRAME frame;
|
||||
char *funcname;
|
||||
struct cleanup *back_to;
|
||||
value return_value;
|
||||
|
||||
if (selected_frame == NULL)
|
||||
@ -1153,14 +1139,11 @@ return_command (retval_exp, from_tty)
|
||||
{
|
||||
if (thisfun != 0)
|
||||
{
|
||||
funcname = strdup_demangled (SYMBOL_NAME (thisfun));
|
||||
back_to = make_cleanup (free, funcname);
|
||||
if (!query ("Make %s return now? ", funcname))
|
||||
if (!query ("Make %s return now? ", SYMBOL_SOURCE_NAME (thisfun)))
|
||||
{
|
||||
error ("Not confirmed.");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
do_cleanups (back_to);
|
||||
}
|
||||
else
|
||||
if (!query ("Make selected stack frame return now? "))
|
||||
|
@ -1389,7 +1389,8 @@ find_methods (t, name, sym_arr)
|
||||
else
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
166
gdb/utils.c
166
gdb/utils.c
@ -33,6 +33,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include "bfd.h"
|
||||
#include "target.h"
|
||||
#include "demangle.h"
|
||||
#include "expression.h"
|
||||
#include "language.h"
|
||||
|
||||
/* Prototypes for local functions */
|
||||
|
||||
@ -411,9 +413,33 @@ quit ()
|
||||
#else
|
||||
error ("Quit (expect signal %d when inferior is resumed)", SIGINT);
|
||||
#endif /* TIOCGPGRP */
|
||||
#else
|
||||
error ("Quit");
|
||||
#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 */
|
||||
|
||||
void
|
||||
@ -1110,71 +1136,50 @@ fputs_filtered (linebuffer, stream)
|
||||
}
|
||||
|
||||
|
||||
/* fputs_demangled is a variant of fputs_filtered that
|
||||
demangles g++ names.*/
|
||||
/* fputs_demangled attempts to demangle NAME, a symbol in language LANG, using
|
||||
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
|
||||
fputs_demangled (linebuffer, stream, arg_mode)
|
||||
char *linebuffer;
|
||||
fputs_demangled (name, stream, arg_mode, lang)
|
||||
char *name;
|
||||
FILE *stream;
|
||||
int arg_mode;
|
||||
enum language lang;
|
||||
{
|
||||
#define SYMBOL_MAX 1024
|
||||
char *demangled;
|
||||
|
||||
#define SYMBOL_CHAR(c) (isascii(c) \
|
||||
&& (isalnum(c) || (c) == '_' || (c) == CPLUS_MARKER))
|
||||
|
||||
char buf[SYMBOL_MAX+1];
|
||||
# define DMSLOP 5 /* How much room to leave in buf */
|
||||
char *p;
|
||||
|
||||
if (linebuffer == NULL)
|
||||
return;
|
||||
|
||||
/* If user wants to see raw output, no problem. */
|
||||
if (!demangle) {
|
||||
fputs_filtered (linebuffer, stream);
|
||||
return;
|
||||
}
|
||||
|
||||
p = linebuffer;
|
||||
|
||||
while ( *p != (char) 0 ) {
|
||||
int i = 0;
|
||||
|
||||
/* collect non-interesting characters into buf */
|
||||
while (*p != (char) 0 && !SYMBOL_CHAR(*p) && i < (int)sizeof(buf)-DMSLOP ) {
|
||||
buf[i++] = *p;
|
||||
p++;
|
||||
if (name != NULL)
|
||||
{
|
||||
/* If user wants to see raw output, no problem. */
|
||||
if (!demangle)
|
||||
{
|
||||
fputs_filtered (name, stream);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (lang)
|
||||
{
|
||||
case language_cplus:
|
||||
demangled = cplus_demangle (name, arg_mode);
|
||||
break;
|
||||
/* start-sanitize-chill */
|
||||
case language_chill:
|
||||
demangled = chill_demangle (name);
|
||||
break;
|
||||
/* end-sanitize-chill */
|
||||
default:
|
||||
demangled = NULL;
|
||||
break;
|
||||
}
|
||||
fputs_filtered (demangled ? demangled : name, stream);
|
||||
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
|
||||
@ -1361,34 +1366,34 @@ print_spaces_filtered (n, stream)
|
||||
|
||||
/* 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. */
|
||||
void
|
||||
fprint_symbol (stream, name)
|
||||
FILE *stream;
|
||||
char *name;
|
||||
{
|
||||
char *demangled;
|
||||
if ((!demangle)
|
||||
|| NULL == (demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI)))
|
||||
fputs_filtered (name, stream);
|
||||
char *demangled = NULL;
|
||||
|
||||
if (demangle)
|
||||
{
|
||||
/* 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
|
||||
{
|
||||
fputs_filtered (demangled, stream);
|
||||
@ -1534,3 +1539,4 @@ _initialize_utils ()
|
||||
#ifdef SIGWINCH_HANDLER_BODY
|
||||
SIGWINCH_HANDLER_BODY
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user