/* Print and select stack frames for GDB, the GNU debugger.
- Copyright 1986, 1987, 1989, 1991-1996, 1998-2000 Free Software Foundation, Inc.
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GDB.
#include "demangle.h"
#include "inferior.h"
#include "annotate.h"
-#include "symfile.h"
-#include "objfiles.h"
#ifdef UI_OUT
#include "ui-out.h"
#endif
static void frame_info (char *, int);
extern int addressprint; /* Print addresses, or stay symbolic only? */
-extern int info_verbose; /* Verbosity of symbol reading msgs */
extern int lines_to_list; /* # of lines "list" command shows by default */
/* The "selected" stack frame is used by default for local and arg access.
{
struct print_stack_frame_args *p = (struct print_stack_frame_args *) args;
- /* Reversed order of these so tuiDo() doesn't occur
- * in the middle of "Breakpoint 1 ... [location]" printing = RT
- */
- if (tui_version)
- print_frame_info_base (p->fi, p->level, p->source, p->args);
print_frame_info (p->fi, p->level, p->source, p->args);
return 0;
{
struct print_stack_frame_args *p = (struct print_stack_frame_args *) args;
- if (tui_version)
- print_frame_info (p->fi, p->level, p->source, p->args);
- else
- print_frame_info_base (p->fi, p->level, p->source, p->args);
+ print_frame_info_base (p->fi, p->level, p->source, p->args);
return 0;
}
fi->pc);
if (!done)
{
- if (addressprint && mid_statement && !tui_version)
+ if (addressprint && mid_statement)
{
#ifdef UI_OUT
ui_out_field_core_addr (uiout, "addr", fi->pc);
}
if (print_frame_info_listing_hook)
print_frame_info_listing_hook (sal.symtab, sal.line, sal.line + 1, 0);
- else if (!tui_version)
+ else
print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
}
current_source_line = max (sal.line - lines_to_list / 2, 1);
#ifdef UI_OUT
struct ui_stream *stb;
struct cleanup *old_chain;
+ struct cleanup *list_chain;
stb = ui_out_stream_new (uiout);
old_chain = make_cleanup_ui_out_stream_delete (stb);
annotate_frame_begin (level == -1 ? 0 : level, fi->pc);
#ifdef UI_OUT
- ui_out_list_begin (uiout, "frame");
+ list_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "frame");
#endif
if (level >= 0)
if (args)
{
struct print_args_args args;
+#ifdef UI_OUT
+ struct cleanup *args_list_chain;
+#endif
args.fi = fi;
args.func = func;
args.stream = gdb_stdout;
#ifdef UI_OUT
- ui_out_list_begin (uiout, "args");
+ args_list_chain = make_cleanup_ui_out_list_begin_end (uiout, "args");
catch_errors (print_args_stub, &args, "", RETURN_MASK_ALL);
/* FIXME: args must be a list. If one argument is a string it will
have " that will not be properly escaped. */
- ui_out_list_end (uiout);
+ /* Invoke ui_out_tuple_end. */
+ do_cleanups (args_list_chain);
#else
catch_errors (print_args_stub, &args, "", RETURN_MASK_ALL);
#endif
annotate_frame_source_end ();
}
-#ifdef PC_LOAD_SEGMENT
- /* If we couldn't print out function name but if can figure out what
- load segment this pc value is from, at least print out some info
- about its load segment. */
- if (!funname)
- {
- annotate_frame_where ();
-#ifdef UI_OUT
- ui_out_wrap_hint (uiout, " ");
- ui_out_text (uiout, " from ");
- ui_out_field_string (uiout, "from", PC_LOAD_SEGMENT (fi->pc));
-#else
- wrap_here (" ");
- printf_filtered (" from %s", PC_LOAD_SEGMENT (fi->pc));
-#endif
- }
-#endif /* PC_LOAD_SEGMENT */
-
#ifdef PC_SOLIB
if (!funname || (!sal.symtab || !sal.symtab->filename))
{
#endif /* PC_SOLIB */
#ifdef UI_OUT
- ui_out_list_end (uiout);
+ /* do_cleanups will call ui_out_tuple_end() for us. */
+ do_cleanups (list_chain);
ui_out_text (uiout, "\n");
do_cleanups (old_chain);
#else
}
\f
-#if 0
-void
-stack_publish_stopped_with_no_frame (void)
-{
- TUIDO (((TuiOpaqueFuncPtr) tuiUpdateOnEnd));
-
- return;
-}
-#endif
-
/* Show or print the frame info. If this is the tui, it will be shown in
the source display */
void
print_frame_info (struct frame_info *fi, register int level, int source,
int args)
{
- if (!tui_version)
- print_frame_info_base (fi, level, source, args);
- else
- {
- if (fi && (frame_in_dummy (fi) || fi->signal_handler_caller))
- print_frame_info_base (fi, level, source, args);
- else
- {
- TUIDO (((TuiOpaqueFuncPtr) tui_vShowFrameInfo, fi));
- }
- }
+ print_frame_info_base (fi, level, source, args);
}
/* Show the frame info. If this is the tui, it will be shown in
void
show_stack_frame (struct frame_info *fi)
{
- TUIDO (((TuiOpaqueFuncPtr) tui_vShowFrameInfo, fi));
}
\f
int numargs = 0;
#define MAXARGS 4
CORE_ADDR args[MAXARGS];
+ int level;
if (frame_exp)
{
addr_string = savestring (frame_exp, p - frame_exp);
{
+ struct value *vp;
+
tmp_cleanup = make_cleanup (xfree, addr_string);
- args[numargs++] = parse_and_eval_address (addr_string);
+
+ /* NOTE: we call parse_and_eval and then both
+ value_as_long and value_as_address rather than calling
+ parse_and_eval_long and parse_and_eval_address because
+ of the issue of potential side effects from evaluating
+ the expression. */
+ vp = parse_and_eval (addr_string);
+ if (numargs == 0)
+ level = value_as_long (vp);
+
+ args[numargs++] = value_as_address (vp);
do_cleanups (tmp_cleanup);
}
/* NOTREACHED */
case 1:
{
- int level = args[0];
struct frame_info *fid =
find_relative_frame (get_current_frame (), &level);
struct frame_info *tfid;
print_address_numeric (fi->saved_regs[SP_REGNUM], 1, gdb_stdout);
printf_filtered ("\n");
count = 0;
- numregs = ARCH_NUM_REGS;
+ numregs = NUM_REGS + NUM_PSEUDO_REGS;
for (i = 0; i < numregs; i++)
if (fi->saved_regs[i] && i != SP_REGNUM)
{
print_block_frame_locals (struct block *b, register struct frame_info *fi,
int num_tabs, register struct ui_file *stream)
{
- int nsyms;
register int i, j;
register struct symbol *sym;
register int values_printed = 0;
- nsyms = BLOCK_NSYMS (b);
-
- for (i = 0; i < nsyms; i++)
+ ALL_BLOCK_SYMBOLS (b, i, sym)
{
- sym = BLOCK_SYM (b, i);
switch (SYMBOL_CLASS (sym))
{
case LOC_LOCAL:
print_block_frame_labels (struct block *b, int *have_default,
register struct ui_file *stream)
{
- int nsyms;
register int i;
register struct symbol *sym;
register int values_printed = 0;
- nsyms = BLOCK_NSYMS (b);
-
- for (i = 0; i < nsyms; i++)
+ ALL_BLOCK_SYMBOLS (b, i, sym)
{
- sym = BLOCK_SYM (b, i);
if (STREQ (SYMBOL_NAME (sym), "default"))
{
if (*have_default)
{
struct symbol *func = get_frame_function (fi);
register struct block *b;
- int nsyms;
register int i;
register struct symbol *sym, *sym2;
register int values_printed = 0;
}
b = SYMBOL_BLOCK_VALUE (func);
- nsyms = BLOCK_NSYMS (b);
-
- for (i = 0; i < nsyms; i++)
+ ALL_BLOCK_SYMBOLS (b, i, sym)
{
- sym = BLOCK_SYM (b, i);
switch (SYMBOL_CLASS (sym))
{
case LOC_ARG:
break;
}
}
-
if (!values_printed)
{
fprintf_filtered (stream, "No arguments.\n");
{
set_language (s->language);
}
- /* elz: this if here fixes the problem with the pc not being displayed
- in the tui asm layout, with no debug symbols. The value of s
- would be 0 here, and select_source_symtab would abort the
- command by calling the 'error' function */
- if (s)
- {
- TUIDO (((TuiOpaqueFuncPtr) tui_vSelectSourceSymtab, s));
- }
}
}
\f
if (fi)
{
print_stack_frame (fi, level, 1);
- TUIDO (((TuiOpaqueFuncPtr) tui_vCheckDataValues, fi));
}
}
\f
-/* Select frame FI, noting that its stack level is LEVEL. Be silent if
- not the TUI */
-#if 0
-void
-select_and_maybe_print_frame (struct frame_info *fi, int level)
-{
- if (!tui_version)
- select_frame (fi, level);
- else
- select_and_print_frame (fi, level);
-}
-#endif
-
-
/* Store the selected frame and its level into *FRAMEP and *LEVELP.
If there is no selected frame, *FRAMEP is set to NULL. */
up_silently_command (char *count_exp, int from_tty)
{
up_silently_base (count_exp);
- if (tui_version)
- print_stack_frame (selected_frame, selected_frame_level, 1);
}
static void
down_silently_command (char *count_exp, int from_tty)
{
down_silently_base (count_exp);
- if (tui_version)
- print_stack_frame (selected_frame, selected_frame_level, 1);
}
static void
CORE_ADDR selected_frame_addr;
CORE_ADDR selected_frame_pc;
struct frame_info *frame;
- value_ptr return_value = NULL;
+ struct value *return_value = NULL;
if (selected_frame == NULL)
error ("No selected frame.");