aboutsummaryrefslogtreecommitdiff
path: root/gdb/stack.c
diff options
context:
space:
mode:
authorFred Fish <fnf@specifix.com>1993-03-11 17:44:39 +0000
committerFred Fish <fnf@specifix.com>1993-03-11 17:44:39 +0000
commitbd5d07d94c9a05601299885ae906ec2d6f000ba9 (patch)
tree2f6f4768ac5c148645c516212720566bec9602ba /gdb/stack.c
parent0b96ed0655e98bdbca122e06b420ac35181215ca (diff)
downloadgdb-bd5d07d94c9a05601299885ae906ec2d6f000ba9.zip
gdb-bd5d07d94c9a05601299885ae906ec2d6f000ba9.tar.gz
gdb-bd5d07d94c9a05601299885ae906ec2d6f000ba9.tar.bz2
* 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.
Diffstat (limited to 'gdb/stack.c')
-rw-r--r--gdb/stack.c139
1 files changed, 61 insertions, 78 deletions
diff --git a/gdb/stack.c b/gdb/stack.c
index a8037c4..e9757d0 100644
--- a/gdb/stack.c
+++ b/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? "))