* 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)
|
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.
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
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
|
/* 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. */
|
||||||
|
|
||||||
|
|
139
gdb/stack.c
139
gdb/stack.c
|
@ -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? "))
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
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 "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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue