* 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)
* 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;
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)
{

View File

@ -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. */

View File

@ -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? "))

View File

@ -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);
}
}

View File

@ -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