/* Print and select stack frames for GDB, the GNU debugger.
- Copyright (C) 1986-2020 Free Software Foundation, Inc.
+ Copyright (C) 1986-2023 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdbsupport/def-vector.h"
#include "cli/cli-option.h"
#include "cli/cli-style.h"
+#include "gdbsupport/buildargv.h"
/* The possible choices of "set print frame-arguments", and the value
of this setting. */
/* print_frame_info_print_what[i] maps a choice to the corresponding
print_what enum. */
-static const gdb::optional<enum print_what> print_frame_info_print_what[] =
+static const std::optional<enum print_what> print_frame_info_print_what[] =
{{}, /* Empty value for "auto". */
SRC_LINE, LOCATION, SRC_AND_LOC, LOC_AND_ADDRESS, SHORT_LOCATION};
/* Prototypes for local functions. */
-static void print_frame_local_vars (struct frame_info *frame,
+static void print_frame_local_vars (frame_info_ptr frame,
bool quiet,
const char *regexp, const char *t_regexp,
int num_tabs, struct ui_file *stream);
static void print_frame (const frame_print_options &opts,
- frame_info *frame, int print_level,
+ frame_info_ptr frame, int print_level,
enum print_what print_what, int print_args,
struct symtab_and_line sal);
-static struct frame_info *find_frame_for_function (const char *);
-static struct frame_info *find_frame_for_address (CORE_ADDR);
+static frame_info_ptr find_frame_for_function (const char *);
+static frame_info_ptr find_frame_for_address (CORE_ADDR);
/* Zero means do things normally; we are interacting directly with the
user. One means print the full filename and linenumber when a
/* See stack.h. */
bool
-frame_show_address (struct frame_info *frame,
+frame_show_address (frame_info_ptr frame,
struct symtab_and_line sal)
{
/* If there is a line number, but no PC, then there is no location
/* See frame.h. */
void
-print_stack_frame_to_uiout (struct ui_out *uiout, struct frame_info *frame,
+print_stack_frame_to_uiout (struct ui_out *uiout, frame_info_ptr frame,
int print_level, enum print_what print_what,
int set_current_sal)
{
source line, the actual PC is printed at the beginning. */
void
-print_stack_frame (struct frame_info *frame, int print_level,
+print_stack_frame (frame_info_ptr frame, int print_level,
enum print_what print_what,
int set_current_sal)
{
argument (not just the first nameless argument). */
static void
-print_frame_nameless_args (struct frame_info *frame, long start, int num,
+print_frame_nameless_args (frame_info_ptr frame, long start, int num,
int first, struct ui_file *stream)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
arg_value = read_memory_integer (argsaddr + start,
sizeof (int), byte_order);
if (!first)
- fprintf_filtered (stream, ", ");
- fprintf_filtered (stream, "%ld", arg_value);
+ gdb_printf (stream, ", ");
+ gdb_printf (stream, "%ld", arg_value);
first = 0;
start += sizeof (int);
}
annotate_arg_emitter arg_emitter;
ui_out_emit_tuple tuple_emitter (uiout, NULL);
- fprintf_symbol_filtered (&stb, arg->sym->print_name (),
- arg->sym->language (), DMGL_PARAMS | DMGL_ANSI);
+ gdb_puts (arg->sym->print_name (), &stb);
if (arg->entry_kind == print_entry_values_compact)
{
/* It is OK to provide invalid MI-like stream as with
PRINT_ENTRY_VALUE_COMPACT we never use MI. */
stb.puts ("=");
- fprintf_symbol_filtered (&stb, arg->sym->print_name (),
- arg->sym->language (),
- DMGL_PARAMS | DMGL_ANSI);
+ gdb_puts (arg->sym->print_name (), &stb);
}
if (arg->entry_kind == print_entry_values_only
|| arg->entry_kind == print_entry_values_compact)
because our standard indentation here is 4 spaces, and
val_print indents 2 for each recurse. */
- annotate_arg_value (value_type (arg->val));
+ annotate_arg_value (arg->val->type ());
/* Use the appropriate language to display our symbol, unless the
user forced the language to a specific language. */
language = current_language;
get_no_prettyformat_print_options (&vp_opts);
- vp_opts.deref_ref = 1;
+ vp_opts.deref_ref = true;
vp_opts.raw = fp_opts.print_raw_frame_arguments;
/* True in "summary" mode, false otherwise. */
exception. */
void
-read_frame_local (struct symbol *sym, struct frame_info *frame,
+read_frame_local (struct symbol *sym, frame_info_ptr frame,
struct frame_arg *argp)
{
argp->sym = sym;
void
read_frame_arg (const frame_print_options &fp_opts,
- symbol *sym, frame_info *frame,
- struct frame_arg *argp, struct frame_arg *entryargp)
+ symbol *sym, frame_info_ptr frame,
+ struct frame_arg *argp, struct frame_arg *entryargp)
{
struct value *val = NULL, *entryval = NULL;
char *val_error = NULL, *entryval_error = NULL;
&& SYMBOL_COMPUTED_OPS (sym)->read_variable_at_entry != NULL
&& fp_opts.print_entry_values != print_entry_values_no
&& (fp_opts.print_entry_values != print_entry_values_if_needed
- || !val || value_optimized_out (val)))
+ || !val || val->optimized_out ()))
{
try
{
}
}
- if (entryval != NULL && value_optimized_out (entryval))
+ if (entryval != NULL && entryval->optimized_out ())
entryval = NULL;
if (fp_opts.print_entry_values == print_entry_values_compact
if (val && entryval && !current_uiout->is_mi_like_p ())
{
- struct type *type = value_type (val);
+ struct type *type = val->type ();
- if (value_lazy (val))
- value_fetch_lazy (val);
- if (value_lazy (entryval))
- value_fetch_lazy (entryval);
+ if (val->lazy ())
+ val->fetch_lazy ();
+ if (entryval->lazy ())
+ entryval->fetch_lazy ();
- if (value_contents_eq (val, 0, entryval, 0, TYPE_LENGTH (type)))
+ if (val->contents_eq (0, entryval, 0, type->length ()))
{
/* Initialize it just to avoid a GCC false warning. */
struct value *val_deref = NULL, *entryval_deref;
struct type *type_deref;
val_deref = coerce_ref (val);
- if (value_lazy (val_deref))
- value_fetch_lazy (val_deref);
- type_deref = value_type (val_deref);
+ if (val_deref->lazy ())
+ val_deref->fetch_lazy ();
+ type_deref = val_deref->type ();
entryval_deref = coerce_ref (entryval);
- if (value_lazy (entryval_deref))
- value_fetch_lazy (entryval_deref);
+ if (entryval_deref->lazy ())
+ entryval_deref->fetch_lazy ();
/* If the reference addresses match but dereferenced
content does not match print them. */
if (val != val_deref
- && value_contents_eq (val_deref, 0,
- entryval_deref, 0,
- TYPE_LENGTH (type_deref)))
+ && val_deref->contents_eq (0,
+ entryval_deref, 0,
+ type_deref->length ()))
val_equal = 1;
}
catch (const gdb_exception_error &except)
if (fp_opts.print_entry_values == print_entry_values_only
|| fp_opts.print_entry_values == print_entry_values_both
|| (fp_opts.print_entry_values == print_entry_values_preferred
- && (!val || value_optimized_out (val))))
+ && (!val || val->optimized_out ())))
{
- entryval = allocate_optimized_out_value (SYMBOL_TYPE (sym));
+ entryval = value::allocate_optimized_out (sym->type ());
entryval_error = NULL;
}
}
if ((fp_opts.print_entry_values == print_entry_values_compact
|| fp_opts.print_entry_values == print_entry_values_if_needed
|| fp_opts.print_entry_values == print_entry_values_preferred)
- && (!val || value_optimized_out (val)) && entryval != NULL)
+ && (!val || val->optimized_out ()) && entryval != NULL)
{
val = NULL;
val_error = NULL;
static void
print_frame_args (const frame_print_options &fp_opts,
- struct symbol *func, struct frame_info *frame,
+ struct symbol *func, frame_info_ptr frame,
int num, struct ui_file *stream)
{
struct ui_out *uiout = current_uiout;
if (func)
{
- const struct block *b = SYMBOL_BLOCK_VALUE (func);
- struct block_iterator iter;
- struct symbol *sym;
+ const struct block *b = func->value_block ();
- ALL_BLOCK_SYMBOLS (b, iter, sym)
- {
+ for (struct symbol *sym : block_iterator_range (b))
+ {
struct frame_arg arg, entryarg;
QUIT;
/* Keep track of the highest stack argument offset seen, and
skip over any kinds of symbols we don't care about. */
- if (!SYMBOL_IS_ARGUMENT (sym))
+ if (!sym->is_argument ())
continue;
if (!print_names)
break;
}
- switch (SYMBOL_CLASS (sym))
+ switch (sym->aclass ())
{
case LOC_ARG:
case LOC_REF_ARG:
{
- long current_offset = SYMBOL_VALUE (sym);
- int arg_size = TYPE_LENGTH (SYMBOL_TYPE (sym));
+ long current_offset = sym->value_longest ();
+ int arg_size = sym->type ()->length ();
/* Compute address of next argument by adding the size of
this argument and rounding to an int boundary. */
nsym = lookup_symbol_search_name (sym->search_name (),
b, VAR_DOMAIN).symbol;
gdb_assert (nsym != NULL);
- if (SYMBOL_CLASS (nsym) == LOC_REGISTER
- && !SYMBOL_IS_ARGUMENT (nsym))
+ if (nsym->aclass () == LOC_REGISTER
+ && !nsym->is_argument ())
{
/* There is a LOC_ARG/LOC_REGISTER pair. This means
that it was passed on the stack and loaded into a
Reasons for using the LOC_ARG:
(1) Because find_saved_registers may be slow for
- remote debugging.
+ remote debugging.
(2) Because registers are often re-used and stack
- slots rarely (never?) are. Therefore using
- the stack slot is much less likely to print
- garbage.
+ slots rarely (never?) are. Therefore using
+ the stack slot is much less likely to print
+ garbage.
Reasons why we might want to use the LOC_REGISTER:
(1) So that the backtrace prints the same value
- as "print foo". I see no compelling reason
- why this needs to be the case; having the
- backtrace print the value which was passed
- in, and "print foo" print the value as
- modified within the called function, makes
- perfect sense to me.
+ as "print foo". I see no compelling reason
+ why this needs to be the case; having the
+ backtrace print the value which was passed
+ in, and "print foo" print the value as
+ modified within the called function, makes
+ perfect sense to me.
Additional note: It might be nice if "info args"
displayed both values.
/* Print the current arg. */
if (!first)
uiout->text (", ");
- uiout->wrap_hint (" ");
+ uiout->wrap_hint (4);
if (!print_args)
{
if (arg.entry_kind != print_entry_values_only)
{
uiout->text (", ");
- uiout->wrap_hint (" ");
+ uiout->wrap_hint (4);
}
print_frame_arg (fp_opts, &entryarg);
line is in the center of the next 'list'. */
void
-set_current_sal_from_frame (struct frame_info *frame)
+set_current_sal_from_frame (frame_info_ptr frame)
{
symtab_and_line sal = find_frame_sal (frame);
if (sal.symtab != NULL)
struct cmd_list_element *c,
const char *value)
{
- fprintf_filtered (file,
- _("Debugger's willingness to use "
- "disassemble-next-line is %s.\n"),
- value);
+ gdb_printf (file,
+ _("Debugger's willingness to use "
+ "disassemble-next-line is %s.\n"),
+ value);
}
/* Use TRY_CATCH to catch the exception from the gdb_disassembly
Value not present indicates to the caller to use default values
specific to the command being executed. */
-static gdb::optional<enum print_what>
+static std::optional<enum print_what>
print_frame_info_to_print_what (const char *print_frame_info)
{
for (int i = 0; print_frame_info_choices[i] != NULL; i++)
if (print_frame_info == print_frame_info_choices[i])
return print_frame_info_print_what[i];
- internal_error (__FILE__, __LINE__,
- "Unexpected print frame-info value `%s'.",
+ internal_error ("Unexpected print frame-info value `%s'.",
print_frame_info);
}
/* Print the PC from FRAME, plus any flags, to UIOUT. */
static void
-print_pc (struct ui_out *uiout, struct gdbarch *gdbarch, frame_info *frame,
+print_pc (struct ui_out *uiout, struct gdbarch *gdbarch, frame_info_ptr frame,
CORE_ADDR pc)
{
uiout->field_core_addr ("addr", gdbarch, pc);
std::string flags = gdbarch_get_pc_address_flags (gdbarch, frame, pc);
if (!flags.empty ())
- {
- uiout->text (" [");
- uiout->field_string ("addr_flags", flags);
- uiout->text ("]");
- }
+ {
+ uiout->text (" [");
+ uiout->field_string ("addr_flags", flags);
+ uiout->text ("]");
+ }
}
/* See stack.h. */
void
-get_user_print_what_frame_info (gdb::optional<enum print_what> *what)
+get_user_print_what_frame_info (std::optional<enum print_what> *what)
{
*what
= print_frame_info_to_print_what
- (user_frame_print_options.print_frame_info);
+ (user_frame_print_options.print_frame_info);
}
/* Print information about frame FRAME. The output is format according
void
print_frame_info (const frame_print_options &fp_opts,
- frame_info *frame, int print_level,
+ frame_info_ptr frame, int print_level,
enum print_what print_what, int print_args,
int set_current_sal)
{
gdbarch, get_frame_pc (frame));
/* Do this regardless of SOURCE because we don't have any source
- to list for this frame. */
+ to list for this frame. */
if (print_level)
- {
- uiout->text ("#");
- uiout->field_fmt_signed (2, ui_left, "level",
+ {
+ uiout->text ("#");
+ uiout->field_fmt_signed (2, ui_left, "level",
frame_relative_level (frame));
- }
+ }
if (uiout->is_mi_like_p ())
- {
- annotate_frame_address ();
+ {
+ annotate_frame_address ();
print_pc (uiout, gdbarch, frame, get_frame_pc (frame));
- annotate_frame_address_end ();
- }
+ annotate_frame_address_end ();
+ }
if (get_frame_type (frame) == DUMMY_FRAME)
- {
- annotate_function_call ();
- uiout->field_string ("func", "<function called from gdb>",
+ {
+ annotate_function_call ();
+ uiout->field_string ("func", "<function called from gdb>",
metadata_style.style ());
}
else if (get_frame_type (frame) == SIGTRAMP_FRAME)
- {
+ {
annotate_signal_handler_caller ();
- uiout->field_string ("func", "<signal handler called>",
+ uiout->field_string ("func", "<signal handler called>",
metadata_style.style ());
- }
+ }
else if (get_frame_type (frame) == ARCH_FRAME)
- {
- uiout->field_string ("func", "<cross-architecture call>",
+ {
+ uiout->field_string ("func", "<cross-architecture call>",
metadata_style.style ());
}
uiout->text ("\n");
{
int mid_statement = ((print_what == SRC_LINE)
&& frame_show_address (frame, sal));
- annotate_source_line (sal.symtab, sal.line, mid_statement,
- get_frame_pc (frame));
-
- if (deprecated_print_frame_info_listing_hook)
+ if (annotation_level > 0
+ && annotate_source_line (sal.symtab, sal.line, mid_statement,
+ get_frame_pc (frame)))
+ {
+ /* The call to ANNOTATE_SOURCE_LINE already printed the
+ annotation for this source line, so we avoid the two cases
+ below and do not print the actual source line. The
+ documentation for annotations makes it clear that the source
+ line annotation is printed __instead__ of printing the source
+ line, not as well as.
+
+ However, if we fail to print the source line, which usually
+ means either the source file is missing, or the requested
+ line is out of range of the file, then we don't print the
+ source annotation, and will pass through the "normal" print
+ source line code below, the expectation is that this code
+ will print an appropriate error. */
+ }
+ else if (deprecated_print_frame_info_listing_hook)
deprecated_print_frame_info_listing_hook (sal.symtab, sal.line,
sal.line + 1, 0);
else
corresponding to FRAME. */
gdb::unique_xmalloc_ptr<char>
-find_frame_funname (struct frame_info *frame, enum language *funlang,
+find_frame_funname (frame_info_ptr frame, enum language *funlang,
struct symbol **funcp)
{
struct symbol *func;
static void
print_frame (const frame_print_options &fp_opts,
- frame_info *frame, int print_level,
+ frame_info_ptr frame, int print_level,
enum print_what print_what, int print_args,
struct symtab_and_line sal)
{
annotate_frame_function_name ();
string_file stb;
- fprintf_symbol_filtered (&stb, funname ? funname.get () : "??",
- funlang, DMGL_ANSI);
+ gdb_puts (funname ? funname.get () : "??", &stb);
uiout->field_stream ("func", stb, function_name_style.style ());
- uiout->wrap_hint (" ");
+ uiout->wrap_hint (3);
annotate_frame_args ();
uiout->text (" (");
filename_display = symtab_to_filename_for_display (sal.symtab);
annotate_frame_source_begin ();
- uiout->wrap_hint (" ");
+ uiout->wrap_hint (3);
uiout->text (" at ");
annotate_frame_source_file ();
uiout->field_string ("file", filename_display,
if (print_what != SHORT_LOCATION
&& pc_p && (funname == NULL || sal.symtab == NULL))
{
- char *lib = solib_name_from_address (get_frame_program_space (frame),
- get_frame_pc (frame));
+ const char *lib
+ = solib_name_from_address (get_frame_program_space (frame),
+ get_frame_address_in_block (frame));
if (lib)
{
annotate_frame_where ();
- uiout->wrap_hint (" ");
+ uiout->wrap_hint (2);
uiout->text (" from ");
uiout->field_string ("from", lib, file_name_style.style ());
}
level 1') then SELECTED_FRAME_P will be false. */
static void
-info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
+info_frame_command_core (frame_info_ptr fi, bool selected_frame_p)
{
struct symbol *func;
struct symtab *s;
- struct frame_info *calling_frame_info;
+ frame_info_ptr calling_frame_info;
int numregs;
const char *funname = 0;
enum language funlang = language_unknown;
if (selected_frame_p && frame_relative_level (fi) >= 0)
{
- printf_filtered (_("Stack level %d, frame at "),
- frame_relative_level (fi));
+ gdb_printf (_("Stack level %d, frame at "),
+ frame_relative_level (fi));
}
else
{
- printf_filtered (_("Stack frame at "));
+ gdb_printf (_("Stack frame at "));
}
- fputs_filtered (paddress (gdbarch, get_frame_base (fi)), gdb_stdout);
- printf_filtered (":\n");
- printf_filtered (" %s = ", pc_regname);
+ gdb_puts (paddress (gdbarch, get_frame_base (fi)));
+ gdb_printf (":\n");
+ gdb_printf (" %s = ", pc_regname);
if (frame_pc_p)
- fputs_filtered (paddress (gdbarch, get_frame_pc (fi)), gdb_stdout);
+ gdb_puts (paddress (gdbarch, get_frame_pc (fi)));
else
fputs_styled ("<unavailable>", metadata_style.style (), gdb_stdout);
- wrap_here (" ");
+ gdb_stdout->wrap_here (3);
if (funname)
{
- printf_filtered (" in ");
- fprintf_symbol_filtered (gdb_stdout, funname, funlang,
- DMGL_ANSI | DMGL_PARAMS);
+ gdb_printf (" in ");
+ gdb_puts (funname);
}
- wrap_here (" ");
+ gdb_stdout->wrap_here (3);
if (sal.symtab)
- printf_filtered
+ gdb_printf
(" (%ps:%d)",
styled_string (file_name_style.style (),
symtab_to_filename_for_display (sal.symtab)),
sal.line);
- puts_filtered ("; ");
- wrap_here (" ");
- printf_filtered ("saved %s = ", pc_regname);
+ gdb_puts ("; ");
+ gdb_stdout->wrap_here (4);
+ gdb_printf ("saved %s = ", pc_regname);
if (!frame_id_p (frame_unwind_caller_id (fi)))
val_print_not_saved (gdb_stdout);
}
if (caller_pc_p)
- fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);
- printf_filtered ("\n");
+ gdb_puts (paddress (gdbarch, caller_pc));
+ gdb_printf ("\n");
if (calling_frame_info == NULL)
{
reason = get_frame_unwind_stop_reason (fi);
if (reason != UNWIND_NO_REASON)
- printf_filtered (_(" Outermost frame: %s\n"),
- frame_stop_reason_string (fi));
+ gdb_printf (_(" Outermost frame: %s\n"),
+ frame_stop_reason_string (fi));
}
else if (get_frame_type (fi) == TAILCALL_FRAME)
- puts_filtered (" tail call frame");
+ gdb_puts (" tail call frame");
else if (get_frame_type (fi) == INLINE_FRAME)
- printf_filtered (" inlined into frame %d",
- frame_relative_level (get_prev_frame (fi)));
+ gdb_printf (" inlined into frame %d",
+ frame_relative_level (get_prev_frame (fi)));
else
{
- printf_filtered (" called by frame at ");
- fputs_filtered (paddress (gdbarch, get_frame_base (calling_frame_info)),
- gdb_stdout);
+ gdb_printf (" called by frame at ");
+ gdb_puts (paddress (gdbarch, get_frame_base (calling_frame_info)));
}
if (get_next_frame (fi) && calling_frame_info)
- puts_filtered (",");
- wrap_here (" ");
+ gdb_puts (",");
+ gdb_stdout->wrap_here (3);
if (get_next_frame (fi))
{
- printf_filtered (" caller of frame at ");
- fputs_filtered (paddress (gdbarch, get_frame_base (get_next_frame (fi))),
- gdb_stdout);
+ gdb_printf (" caller of frame at ");
+ gdb_puts (paddress (gdbarch, get_frame_base (get_next_frame (fi))));
}
if (get_next_frame (fi) || calling_frame_info)
- puts_filtered ("\n");
+ gdb_puts ("\n");
if (s)
- printf_filtered (" source language %s.\n",
- language_str (s->language));
+ gdb_printf (" source language %s.\n",
+ language_str (s->language ()));
{
/* Address of the argument list for this frame, or 0. */
int numargs;
if (arg_list == 0)
- printf_filtered (" Arglist at unknown address.\n");
+ gdb_printf (" Arglist at unknown address.\n");
else
{
- printf_filtered (" Arglist at ");
- fputs_filtered (paddress (gdbarch, arg_list), gdb_stdout);
- printf_filtered (",");
+ gdb_printf (" Arglist at ");
+ gdb_puts (paddress (gdbarch, arg_list));
+ gdb_printf (",");
if (!gdbarch_frame_num_args_p (gdbarch))
{
numargs = -1;
- puts_filtered (" args: ");
+ gdb_puts (" args: ");
}
else
{
numargs = gdbarch_frame_num_args (gdbarch, fi);
gdb_assert (numargs >= 0);
if (numargs == 0)
- puts_filtered (" no args.");
+ gdb_puts (" no args.");
else if (numargs == 1)
- puts_filtered (" 1 arg: ");
+ gdb_puts (" 1 arg: ");
else
- printf_filtered (" %d args: ", numargs);
+ gdb_printf (" %d args: ", numargs);
}
+
print_frame_args (user_frame_print_options,
func, fi, numargs, gdb_stdout);
- puts_filtered ("\n");
+ gdb_puts ("\n");
}
}
{
CORE_ADDR arg_list = get_frame_locals_address (fi);
if (arg_list == 0)
- printf_filtered (" Locals at unknown address,");
+ gdb_printf (" Locals at unknown address,");
else
{
- printf_filtered (" Locals at ");
- fputs_filtered (paddress (gdbarch, arg_list), gdb_stdout);
- printf_filtered (",");
+ gdb_printf (" Locals at ");
+ gdb_puts (paddress (gdbarch, arg_list));
+ gdb_printf (",");
}
}
struct value *value = frame_unwind_register_value (fi, sp_regnum);
gdb_assert (value != NULL);
- if (!value_optimized_out (value) && value_entirely_available (value))
+ if (!value->optimized_out () && value->entirely_available ())
{
- if (VALUE_LVAL (value) == not_lval)
+ if (value->lval () == not_lval)
{
CORE_ADDR sp;
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
int sp_size = register_size (gdbarch, sp_regnum);
- sp = extract_unsigned_integer (value_contents_all (value),
- sp_size, byte_order);
+ sp = extract_unsigned_integer
+ (value->contents_all ().data (), sp_size, byte_order);
- printf_filtered (" Previous frame's sp is ");
- fputs_filtered (paddress (gdbarch, sp), gdb_stdout);
- printf_filtered ("\n");
+ gdb_printf (" Previous frame's sp is ");
+ gdb_puts (paddress (gdbarch, sp));
+ gdb_printf ("\n");
}
- else if (VALUE_LVAL (value) == lval_memory)
+ else if (value->lval () == lval_memory)
{
- printf_filtered (" Previous frame's sp at ");
- fputs_filtered (paddress (gdbarch, value_address (value)),
- gdb_stdout);
- printf_filtered ("\n");
+ gdb_printf (" Previous frame's sp at ");
+ gdb_puts (paddress (gdbarch, value->address ()));
+ gdb_printf ("\n");
}
- else if (VALUE_LVAL (value) == lval_register)
+ else if (value->lval () == lval_register)
{
- printf_filtered (" Previous frame's sp in %s\n",
- gdbarch_register_name (gdbarch,
- VALUE_REGNUM (value)));
+ gdb_printf (" Previous frame's sp in %s\n",
+ gdbarch_register_name (gdbarch, value->regnum ()));
}
release_value (value);
int realnum;
/* Find out the location of the saved register without
- fetching the corresponding value. */
+ fetching the corresponding value. */
frame_register_unwind (fi, i, &optimized, &unavailable,
&lval, &addr, &realnum, NULL);
/* For moment, only display registers that were saved on the
if (!optimized && !unavailable && lval == lval_memory)
{
if (count == 0)
- puts_filtered (" Saved registers:\n ");
+ gdb_puts (" Saved registers:\n ");
else
- puts_filtered (",");
- wrap_here (" ");
- printf_filtered (" %s at ",
- gdbarch_register_name (gdbarch, i));
- fputs_filtered (paddress (gdbarch, addr), gdb_stdout);
+ gdb_puts (",");
+ gdb_stdout->wrap_here (1);
+ gdb_printf (" %s at ",
+ gdbarch_register_name (gdbarch, i));
+ gdb_puts (paddress (gdbarch, addr));
count++;
}
}
if (count || need_nl)
- puts_filtered ("\n");
+ gdb_puts ("\n");
}
}
/* Return the innermost frame at level LEVEL. */
-static struct frame_info *
+static frame_info_ptr
leading_innermost_frame (int level)
{
- struct frame_info *leading;
+ frame_info_ptr leading;
leading = get_current_frame ();
/* Return the starting frame needed to handle COUNT outermost frames. */
-static struct frame_info *
+static frame_info_ptr
trailing_outermost_frame (int count)
{
- struct frame_info *current;
- struct frame_info *trailing;
+ frame_info_ptr current;
+ frame_info_ptr trailing;
trailing = get_current_frame ();
SELECT_FRAME. */
static void
-select_frame_command_core (struct frame_info *fi, bool ignored)
+select_frame_command_core (frame_info_ptr fi, bool ignored)
{
- struct frame_info *prev_frame = get_selected_frame_if_set ();
+ frame_info_ptr prev_frame = get_selected_frame ();
select_frame (fi);
- if (get_selected_frame_if_set () != prev_frame)
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
-}
-
-/* See stack.h. */
-
-void
-select_frame_for_mi (struct frame_info *fi)
-{
- select_frame_command_core (fi, false /* Ignored. */);
+ if (get_selected_frame () != prev_frame)
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
/* The core of all the "frame" sub-commands. Select frame FI, and if this
reprint the current frame summary). */
static void
-frame_command_core (struct frame_info *fi, bool ignored)
+frame_command_core (frame_info_ptr fi, bool ignored)
{
- struct frame_info *prev_frame = get_selected_frame_if_set ();
-
+ frame_info_ptr prev_frame = get_selected_frame ();
select_frame (fi);
- if (get_selected_frame_if_set () != prev_frame)
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
+ if (get_selected_frame () != prev_frame)
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
else
print_selected_thread_frame (current_uiout, USER_SELECTED_FRAME);
}
'frame' will all cause SELECTED_FRAME_P to be true. In all other cases
SELECTED_FRAME_P is false. */
-template <void (*FPTR) (struct frame_info *fi, bool selected_frame_p)>
+template <void (*FPTR) (frame_info_ptr fi, bool selected_frame_p)>
class frame_command_helper
{
public:
level (const char *arg, int from_tty)
{
int level = value_as_long (parse_and_eval (arg));
- struct frame_info *fid
+ frame_info_ptr fid
= find_relative_frame (get_current_frame (), &level);
if (level != 0)
error (_("No frame at level %s."), arg);
address (const char *arg, int from_tty)
{
CORE_ADDR addr = value_as_address (parse_and_eval (arg));
- struct frame_info *fid = find_frame_for_address (addr);
+ frame_info_ptr fid = find_frame_for_address (addr);
if (fid == NULL)
error (_("No frame at address %s."), arg);
FPTR (fid, false);
static void
view (const char *args, int from_tty)
{
- struct frame_info *fid;
+ frame_info_ptr fid;
if (args == NULL)
- error (_("Missing address argument to view a frame"));
+ error (_("Missing address argument to view a frame"));
gdb_argv argv (args);
{
if (arg == NULL)
error (_("Missing function name argument"));
- struct frame_info *fid = find_frame_for_function (arg);
+ frame_info_ptr fid = find_frame_for_function (arg);
if (fid == NULL)
error (_("No frame for function \"%s\"."), arg);
FPTR (fid, false);
const char *count_exp, int from_tty)
{
- struct frame_info *fi;
+ frame_info_ptr fi;
int count;
int py_start = 0, py_end = 0;
enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
- if (!target_has_stack)
+ if (!target_has_stack ())
error (_("No stack."));
if (count_exp)
"-no-filters" has been specified from the command. */
if (bt_opts.no_filters || result == EXT_LANG_BT_NO_FILTERS)
{
- struct frame_info *trailing;
+ frame_info_ptr trailing;
/* The following code must do two things. First, it must set the
variable TRAILING to the frame from which we should start
print_frame_info (fp_opts, fi, 1, LOCATION, 1, 0);
if ((flags & PRINT_LOCALS) != 0)
- {
- struct frame_id frame_id = get_frame_id (fi);
-
- print_frame_local_vars (fi, false, NULL, NULL, 1, gdb_stdout);
-
- /* print_frame_local_vars invalidates FI. */
- fi = frame_find_by_id (frame_id);
- if (fi == NULL)
- {
- trailing = NULL;
- warning (_("Unable to restore previously selected frame."));
- break;
- }
- }
+ print_frame_local_vars (fi, false, NULL, NULL, 1, gdb_stdout);
/* Save the last frame to check for error conditions. */
trailing = fi;
/* If we've stopped before the end, mention that. */
if (fi && from_tty)
- printf_filtered (_("(More stack frames follow...)\n"));
+ gdb_printf (_("(More stack frames follow...)\n"));
/* If we've run out of frames, and the reason appears to be an error
condition, print it. */
reason = get_frame_unwind_stop_reason (trailing);
if (reason >= UNWIND_FIRST_ERROR)
- printf_filtered (_("Backtrace stopped: %s\n"),
- frame_stop_reason_string (trailing));
+ gdb_printf (_("Backtrace stopped: %s\n"),
+ frame_stop_reason_string (trailing));
}
}
}
if (this_arg.empty ())
return arg;
- if (subset_compare (this_arg.c_str (), "no-filters"))
+ if (startswith ("no-filters", this_arg))
{
if (bt_cmd_opts != nullptr)
bt_cmd_opts->no_filters = true;
}
- else if (subset_compare (this_arg.c_str (), "full"))
+ else if (startswith ("full", this_arg))
{
if (bt_cmd_opts != nullptr)
bt_cmd_opts->full = true;
}
- else if (subset_compare (this_arg.c_str (), "hide"))
+ else if (startswith ("hide", this_arg))
{
if (bt_cmd_opts != nullptr)
bt_cmd_opts->hide = true;
expression_completer (ignore, tracker, text, word);
}
-/* Iterate over the local variables of a block B, calling CB with
- CB_DATA. */
+/* Iterate over the local variables of a block B, calling CB. */
static void
iterate_over_block_locals (const struct block *b,
- iterate_over_block_arg_local_vars_cb cb,
- void *cb_data)
+ iterate_over_block_arg_local_vars_cb cb)
{
- struct block_iterator iter;
- struct symbol *sym;
-
- ALL_BLOCK_SYMBOLS (b, iter, sym)
+ for (struct symbol *sym : block_iterator_range (b))
{
- switch (SYMBOL_CLASS (sym))
+ switch (sym->aclass ())
{
case LOC_CONST:
case LOC_LOCAL:
case LOC_STATIC:
case LOC_COMPUTED:
case LOC_OPTIMIZED_OUT:
- if (SYMBOL_IS_ARGUMENT (sym))
+ if (sym->is_argument ())
break;
- if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
+ if (sym->domain () == COMMON_BLOCK_DOMAIN)
break;
- (*cb) (sym->print_name (), sym, cb_data);
+ cb (sym->print_name (), sym);
break;
default:
void
iterate_over_block_local_vars (const struct block *block,
- iterate_over_block_arg_local_vars_cb cb,
- void *cb_data)
+ iterate_over_block_arg_local_vars_cb cb)
{
while (block)
{
- iterate_over_block_locals (block, cb, cb_data);
+ iterate_over_block_locals (block, cb);
/* After handling the function's top-level block, stop. Don't
continue to its superblock, the block of per-file
symbols. */
- if (BLOCK_FUNCTION (block))
+ if (block->function ())
break;
- block = BLOCK_SUPERBLOCK (block);
+ block = block->superblock ();
}
}
struct print_variable_and_value_data
{
- gdb::optional<compiled_regex> preg;
- gdb::optional<compiled_regex> treg;
+ std::optional<compiled_regex> preg;
+ std::optional<compiled_regex> treg;
struct frame_id frame_id;
int num_tabs;
struct ui_file *stream;
int values_printed;
+
+ void operator() (const char *print_name, struct symbol *sym);
};
/* The callback for the locals and args iterators. */
-static void
-do_print_variable_and_value (const char *print_name,
- struct symbol *sym,
- void *cb_data)
+void
+print_variable_and_value_data::operator() (const char *print_name,
+ struct symbol *sym)
{
- struct print_variable_and_value_data *p
- = (struct print_variable_and_value_data *) cb_data;
- struct frame_info *frame;
+ frame_info_ptr frame;
- if (p->preg.has_value ()
- && p->preg->exec (sym->natural_name (), 0, NULL, 0) != 0)
+ if (preg.has_value ()
+ && preg->exec (sym->natural_name (), 0, NULL, 0) != 0)
+ return;
+ if (treg.has_value ()
+ && !treg_matches_sym_type_name (*treg, sym))
return;
- if (p->treg.has_value ()
- && !treg_matches_sym_type_name (*p->treg, sym))
+ if (language_def (sym->language ())->symbol_printing_suppressed (sym))
return;
- frame = frame_find_by_id (p->frame_id);
+ frame = frame_find_by_id (frame_id);
if (frame == NULL)
{
warning (_("Unable to restore previously selected frame."));
return;
}
- print_variable_and_value (print_name, sym, frame, p->stream, p->num_tabs);
+ print_variable_and_value (print_name, sym, frame, stream, num_tabs);
/* print_variable_and_value invalidates FRAME. */
frame = NULL;
- p->values_printed = 1;
+ values_printed = 1;
}
/* Prepares the regular expression REG from REGEXP.
If REGEXP is NULL, it results in an empty regular expression. */
static void
-prepare_reg (const char *regexp, gdb::optional<compiled_regex> *reg)
+prepare_reg (const char *regexp, std::optional<compiled_regex> *reg)
{
if (regexp != NULL)
{
If T_REGEXP is not NULL, only print local variables whose type
matches T_REGEXP.
If no local variables have been printed and !QUIET, prints a message
- explaining why no local variables could be printed.
-
- This function will invalidate FRAME. */
+ explaining why no local variables could be printed. */
static void
-print_frame_local_vars (struct frame_info *frame,
+print_frame_local_vars (frame_info_ptr frame,
bool quiet,
const char *regexp, const char *t_regexp,
int num_tabs, struct ui_file *stream)
if (!get_frame_pc_if_available (frame, &pc))
{
if (!quiet)
- fprintf_filtered (stream,
- _("PC unavailable, cannot determine locals.\n"));
+ gdb_printf (stream,
+ _("PC unavailable, cannot determine locals.\n"));
return;
}
if (block == 0)
{
if (!quiet)
- fprintf_filtered (stream, "No symbol table info available.\n");
+ gdb_printf (stream, "No symbol table info available.\n");
return;
}
scoped_restore_selected_frame restore_selected_frame;
select_frame (frame);
- iterate_over_block_local_vars (block,
- do_print_variable_and_value,
- &cb_data);
+ iterate_over_block_local_vars (block, cb_data);
if (!cb_data.values_printed && !quiet)
{
if (regexp == NULL && t_regexp == NULL)
- fprintf_filtered (stream, _("No locals.\n"));
+ gdb_printf (stream, _("No locals.\n"));
else
- fprintf_filtered (stream, _("No matching locals.\n"));
+ gdb_printf (stream, _("No matching locals.\n"));
}
}
struct info_print_options
{
bool quiet = false;
- char *type_regexp = nullptr;
-
- ~info_print_options ()
- {
- xfree (type_regexp);
- }
+ std::string type_regexp;
};
/* The options used by the 'info locals' and 'info args' commands. */
if (args != nullptr && *args == '\0')
args = nullptr;
- print_frame_local_vars (get_selected_frame (_("No frame selected.")),
- opts.quiet, args, opts.type_regexp,
- 0, gdb_stdout);
+ print_frame_local_vars
+ (get_selected_frame (_("No frame selected.")),
+ opts.quiet, args,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ 0, gdb_stdout);
}
/* Iterate over all the argument variables in block B. */
void
iterate_over_block_arg_vars (const struct block *b,
- iterate_over_block_arg_local_vars_cb cb,
- void *cb_data)
+ iterate_over_block_arg_local_vars_cb cb)
{
- struct block_iterator iter;
- struct symbol *sym, *sym2;
-
- ALL_BLOCK_SYMBOLS (b, iter, sym)
+ for (struct symbol *sym : block_iterator_range (b))
{
/* Don't worry about things which aren't arguments. */
- if (SYMBOL_IS_ARGUMENT (sym))
+ if (sym->is_argument ())
{
/* We have to look up the symbol because arguments can have
two entries (one a parameter, one a local) and the one we
float). There are also LOC_ARG/LOC_REGISTER pairs which
are not combined in symbol-reading. */
- sym2 = lookup_symbol_search_name (sym->search_name (),
- b, VAR_DOMAIN).symbol;
- (*cb) (sym->print_name (), sym2, cb_data);
+ struct symbol *sym2
+ = lookup_symbol_search_name (sym->search_name (),
+ b, VAR_DOMAIN).symbol;
+ cb (sym->print_name (), sym2);
}
}
}
If T_REGEXP is not NULL, only print argument variables whose type
matches T_REGEXP.
If no argument variables have been printed and !QUIET, prints a message
- explaining why no argument variables could be printed.
-
- This function will invalidate FRAME. */
+ explaining why no argument variables could be printed. */
static void
-print_frame_arg_vars (struct frame_info *frame,
+print_frame_arg_vars (frame_info_ptr frame,
bool quiet,
const char *regexp, const char *t_regexp,
struct ui_file *stream)
struct print_variable_and_value_data cb_data;
struct symbol *func;
CORE_ADDR pc;
- gdb::optional<compiled_regex> preg;
- gdb::optional<compiled_regex> treg;
+ std::optional<compiled_regex> preg;
+ std::optional<compiled_regex> treg;
if (!get_frame_pc_if_available (frame, &pc))
{
if (!quiet)
- fprintf_filtered (stream,
- _("PC unavailable, cannot determine args.\n"));
+ gdb_printf (stream,
+ _("PC unavailable, cannot determine args.\n"));
return;
}
if (func == NULL)
{
if (!quiet)
- fprintf_filtered (stream, _("No symbol table info available.\n"));
+ gdb_printf (stream, _("No symbol table info available.\n"));
return;
}
cb_data.stream = stream;
cb_data.values_printed = 0;
- iterate_over_block_arg_vars (SYMBOL_BLOCK_VALUE (func),
- do_print_variable_and_value, &cb_data);
-
- /* do_print_variable_and_value invalidates FRAME. */
- frame = NULL;
+ iterate_over_block_arg_vars (func->value_block (), cb_data);
if (!cb_data.values_printed && !quiet)
{
if (regexp == NULL && t_regexp == NULL)
- fprintf_filtered (stream, _("No arguments.\n"));
+ gdb_printf (stream, _("No arguments.\n"));
else
- fprintf_filtered (stream, _("No matching arguments.\n"));
+ gdb_printf (stream, _("No matching arguments.\n"));
}
}
if (args != nullptr && *args == '\0')
args = nullptr;
- print_frame_arg_vars (get_selected_frame (_("No frame selected.")),
- opts.quiet, args, opts.type_regexp, gdb_stdout);
+ print_frame_arg_vars
+ (get_selected_frame (_("No frame selected.")),
+ opts.quiet, args,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ gdb_stdout);
}
\f
/* Return the symbol-block in which the selected frame is executing.
but the final value of *LEVEL_OFFSET_PTR is nonzero and indicates
how much farther the original request asked to go. */
-struct frame_info *
-find_relative_frame (struct frame_info *frame, int *level_offset_ptr)
+frame_info_ptr
+find_relative_frame (frame_info_ptr frame, int *level_offset_ptr)
{
/* Going up is simple: just call get_prev_frame enough times or
until the initial frame is reached. */
while (*level_offset_ptr > 0)
{
- struct frame_info *prev = get_prev_frame (frame);
+ frame_info_ptr prev = get_prev_frame (frame);
if (!prev)
break;
/* Going down is just as simple. */
while (*level_offset_ptr < 0)
{
- struct frame_info *next = get_next_frame (frame);
+ frame_info_ptr next = get_next_frame (frame);
if (!next)
break;
static void
up_silently_base (const char *count_exp)
{
- struct frame_info *frame;
+ frame_info_ptr frame;
int count = 1;
if (count_exp)
up_command (const char *count_exp, int from_tty)
{
up_silently_base (count_exp);
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
/* Select the frame down one or COUNT_EXP stack levels from the previously
static void
down_silently_base (const char *count_exp)
{
- struct frame_info *frame;
+ frame_info_ptr frame;
int count = -1;
if (count_exp)
if (count != 0 && count_exp == NULL)
{
/* We only do this if COUNT_EXP is not specified. That way
- "down" means to really go down (and let me know if that is
- impossible), but "down 9999" can be used to mean go all the
- way down without getting an error. */
+ "down" means to really go down (and let me know if that is
+ impossible), but "down 9999" can be used to mean go all the
+ way down without getting an error. */
error (_("Bottom (innermost) frame selected; you cannot go down."));
}
down_command (const char *count_exp, int from_tty)
{
down_silently_base (count_exp);
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
void
{
/* Initialize it just to avoid a GCC false warning. */
enum return_value_convention rv_conv = RETURN_VALUE_STRUCT_CONVENTION;
- struct frame_info *thisframe;
+ frame_info_ptr thisframe;
struct gdbarch *gdbarch;
struct symbol *thisfun;
struct value *return_value = NULL;
struct value *function = NULL;
- const char *query_prefix = "";
+ std::string query_prefix;
thisframe = get_selected_frame ("No selected frame.");
thisfun = get_frame_function (thisframe);
struct type *return_type = NULL;
/* Compute the return value. Should the computation fail, this
- call throws an error. */
- return_value = evaluate_expression (retval_expr.get ());
+ call throws an error. */
+ return_value = retval_expr->evaluate ();
/* Cast return value to the return type of the function. Should
- the cast fail, this call throws an error. */
+ the cast fail, this call throws an error. */
if (thisfun != NULL)
- return_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (thisfun));
+ return_type = thisfun->type ()->target_type ();
if (return_type == NULL)
- {
- if (retval_expr->elts[0].opcode != UNOP_CAST
- && retval_expr->elts[0].opcode != UNOP_CAST_TYPE)
+ {
+ if (retval_expr->first_opcode () != UNOP_CAST
+ && retval_expr->first_opcode () != UNOP_CAST_TYPE)
error (_("Return value type not available for selected "
"stack frame.\n"
"Please use an explicit cast of the value to return."));
- return_type = value_type (return_value);
+ return_type = return_value->type ();
}
return_type = check_typedef (return_type);
return_value = value_cast (return_type, return_value);
/* Make sure the value is fully evaluated. It may live in the
- stack frame we're about to pop. */
- if (value_lazy (return_value))
- value_fetch_lazy (return_value);
+ stack frame we're about to pop. */
+ if (return_value->lazy ())
+ return_value->fetch_lazy ();
if (thisfun != NULL)
function = read_var_value (thisfun, NULL, thisframe);
rv_conv = RETURN_VALUE_REGISTER_CONVENTION;
- if (TYPE_CODE (return_type) == TYPE_CODE_VOID)
+ if (return_type->code () == TYPE_CODE_VOID)
/* If the return-type is "void", don't try to find the
- return-value's location. However, do still evaluate the
- return expression so that, even when the expression result
- is discarded, side effects such as "return i++" still
- occur. */
+ return-value's location. However, do still evaluate the
+ return expression so that, even when the expression result
+ is discarded, side effects such as "return i++" still
+ occur. */
return_value = NULL;
else if (thisfun != NULL)
{
+ if (is_nocall_function (check_typedef (function->type ())))
+ {
+ query_prefix =
+ string_printf ("Function '%s' does not follow the target "
+ "calling convention.\n"
+ "If you continue, setting the return value "
+ "will probably lead to unpredictable "
+ "behaviors.\n",
+ thisfun->print_name ());
+ }
+
rv_conv = struct_return_convention (gdbarch, function, return_type);
if (rv_conv == RETURN_VALUE_STRUCT_CONVENTION
|| rv_conv == RETURN_VALUE_ABI_RETURNS_ADDRESS)
if (thisfun == NULL)
confirmed = query (_("%sMake selected stack frame return now? "),
- query_prefix);
+ query_prefix.c_str ());
else
{
- if (TYPE_NO_RETURN (thisfun->type))
+ if (TYPE_NO_RETURN (thisfun->type ()))
warning (_("Function does not return normally to caller."));
- confirmed = query (_("%sMake %s return now? "), query_prefix,
+ confirmed = query (_("%sMake %s return now? "),
+ query_prefix.c_str (),
thisfun->print_name ());
}
if (!confirmed)
/* Store RETURN_VALUE in the just-returned register set. */
if (return_value != NULL)
{
- struct type *return_type = value_type (return_value);
- struct gdbarch *cache_arch = get_current_regcache ()->arch ();
+ struct type *return_type = return_value->type ();
+ regcache *regcache = get_thread_regcache (inferior_thread ());
+ struct gdbarch *cache_arch = regcache->arch ();
gdb_assert (rv_conv != RETURN_VALUE_STRUCT_CONVENTION
&& rv_conv != RETURN_VALUE_ABI_RETURNS_ADDRESS);
- gdbarch_return_value (cache_arch, function, return_type,
- get_current_regcache (), NULL /*read*/,
- value_contents (return_value) /*write*/);
+ gdbarch_return_value_as_value
+ (cache_arch, function, return_type, regcache, NULL /*read*/,
+ return_value->contents ().data () /*write*/);
}
/* If we are at the end of a call dummy now, pop the dummy frame
/* Find the most inner frame in the current stack for a function called
FUNCTION_NAME. If no matching frame is found return NULL. */
-static struct frame_info *
+static frame_info_ptr
find_frame_for_function (const char *function_name)
{
/* Used to hold the lower and upper addresses for each of the
{
CORE_ADDR low, high;
};
- struct frame_info *frame;
+ frame_info_ptr frame;
bool found = false;
int level = 1;
return frame;
}
-/* Implements the dbx 'func' command. */
-
-static void
-func_command (const char *arg, int from_tty)
-{
- if (arg == NULL)
- return;
-
- struct frame_info *frame = find_frame_for_function (arg);
- if (frame == NULL)
- error (_("'%s' not within current stack frame."), arg);
- if (frame != get_selected_frame (NULL))
- {
- select_frame (frame);
- print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
- }
-}
-
/* The qcs command line flags for the "frame apply" commands. Keep
this in sync with the "thread apply" commands. */
frame apply -3 info frame Apply 'info frame' to outermost 3 frames.
frame apply all x/i $pc Apply 'x/i $pc' cmd to all frames.
frame apply all -s p local_var_no_idea_in_which_frame
- If a frame has a local variable called
- local_var_no_idea_in_which_frame, print frame
- and value of local_var_no_idea_in_which_frame.
+ If a frame has a local variable called
+ local_var_no_idea_in_which_frame, print frame
+ and value of local_var_no_idea_in_which_frame.
frame apply all -s -q p local_var_no_idea_in_which_frame
- Same as before, but only print the variable value.
+ Same as before, but only print the variable value.
frame apply level 2-5 0 4-7 -s p i = i + 1
- Adds 1 to the variable i in the specified frames.
- Note that i will be incremented twice in
- frames 4 and 5. */
+ Adds 1 to the variable i in the specified frames.
+ Note that i will be incremented twice in
+ frames 4 and 5. */
/* Apply a GDB command to COUNT stack frames, starting at TRAILING.
CMD starts with 0 or more qcs flags followed by the GDB command to apply.
static void
frame_apply_command_count (const char *which_command,
const char *cmd, int from_tty,
- struct frame_info *trailing, int count)
+ frame_info_ptr trailing, int count)
{
qcs_flags flags;
set_backtrace_options set_bt_opts = user_set_backtrace_options;
scoped_restore restore_set_backtrace_options
= make_scoped_restore (&user_set_backtrace_options, set_bt_opts);
- for (frame_info *fi = trailing; fi && count--; fi = get_prev_frame (fi))
+ for (frame_info_ptr fi = trailing; fi && count--; fi = get_prev_frame (fi))
{
QUIT;
set to the selected frame. */
scoped_restore_current_thread restore_fi_current_frame;
- cmd_result = execute_command_to_string
- (cmd, from_tty, gdb_stdout->term_out ());
+ execute_command_to_string
+ (cmd_result, cmd, from_tty, gdb_stdout->term_out ());
}
fi = get_selected_frame (_("frame apply "
"unable to get selected frame."));
{
if (!flags.quiet)
print_stack_frame (fi, 1, LOCATION, 0);
- printf_filtered ("%s", cmd_result.c_str ());
+ gdb_printf ("%s", cmd_result.c_str ());
}
}
catch (const gdb_exception_error &ex)
if (!flags.quiet)
print_stack_frame (fi, 1, LOCATION, 0);
if (flags.cont)
- printf_filtered ("%s\n", ex.what ());
+ gdb_printf ("%s\n", ex.what ());
else
throw;
}
static void
frame_apply_level_command (const char *cmd, int from_tty)
{
- if (!target_has_stack)
+ if (!target_has_stack ())
error (_("No stack."));
bool level_found = false;
static void
frame_apply_all_command (const char *cmd, int from_tty)
{
- if (!target_has_stack)
+ if (!target_has_stack ())
error (_("No stack."));
frame_apply_command_count ("frame apply all", cmd, from_tty,
frame_apply_command (const char* cmd, int from_tty)
{
int count;
- struct frame_info *trailing;
+ frame_info_ptr trailing;
- if (!target_has_stack)
+ if (!target_has_stack ())
error (_("No stack."));
if (cmd == NULL)
/* Find inner-mode frame with frame address ADDRESS. Return NULL if no
matching frame can be found. */
-static struct frame_info *
+static frame_info_ptr
find_frame_for_address (CORE_ADDR address)
{
struct frame_id id;
- struct frame_info *fid;
+ frame_info_ptr fid;
id = frame_id_build_wild (address);
fid != NULL;
fid = get_prev_frame (fid))
{
- if (frame_id_eq (id, get_frame_id (fid)))
+ if (id == get_frame_id (fid))
{
- struct frame_info *prev_frame;
+ frame_info_ptr prev_frame;
while (1)
{
prev_frame = get_prev_frame (fid);
if (!prev_frame
- || !frame_id_eq (id, get_frame_id (prev_frame)))
+ || id != get_frame_id (prev_frame))
break;
fid = prev_frame;
}
Same as the `up' command, but does not print anything.\n\
This is useful in command scripts."));
- add_com ("down", class_stack, down_command, _("\
+ cmd_list_element *down_cmd
+ = add_com ("down", class_stack, down_command, _("\
Select and print stack frame called by this one.\n\
An argument says how many frames down to go."));
- add_com_alias ("do", "down", class_stack, 1);
- add_com_alias ("dow", "down", class_stack, 1);
+ add_com_alias ("do", down_cmd, class_stack, 1);
+ add_com_alias ("dow", down_cmd, class_stack, 1);
add_com ("down-silently", class_support, down_silently_command, _("\
Same as the `down' command, but does not print anything.\n\
This is useful in command scripts."));
- add_prefix_cmd ("frame", class_stack,
- &frame_cmd.base_command, _("\
+ cmd_list_element *frame_cmd_el
+ = add_prefix_cmd ("frame", class_stack,
+ &frame_cmd.base_command, _("\
Select and print a stack frame.\n\
With no argument, print the selected stack frame. (See also \"info frame\").\n\
A single numerical argument specifies the frame to select."),
- &frame_cmd_list, "frame ", 1, &cmdlist);
-
- add_com_alias ("f", "frame", class_stack, 1);
+ &frame_cmd_list, 1, &cmdlist);
+ add_com_alias ("f", frame_cmd_el, class_stack, 1);
#define FRAME_APPLY_OPTION_HELP "\
Prints the frame location information followed by COMMAND output.\n\
cmd = add_prefix_cmd ("apply", class_stack, frame_apply_command,
frame_apply_cmd_help.c_str (),
- &frame_apply_cmd_list, "frame apply ", 1,
+ &frame_apply_cmd_list, 1,
&frame_cmd_list);
set_cmd_completer_handle_brkchars (cmd, frame_apply_cmd_completer);
See \"help frame apply all\" for available options."));
set_cmd_completer_handle_brkchars (cmd, frame_apply_all_cmd_completer);
- add_prefix_cmd ("frame", class_stack,
- &frame_cmd.base_command, _("\
-Select and print a stack frame.\n\
-With no argument, print the selected stack frame. (See also \"info frame\").\n\
-A single numerical argument specifies the frame to select."),
- &frame_cmd_list, "frame ", 1, &cmdlist);
- add_com_alias ("f", "frame", class_stack, 1);
-
add_cmd ("address", class_stack, &frame_cmd.address,
_("\
Select and print a stack frame by stack address.\n\
&select_frame_cmd.base_command, _("\
Select a stack frame without printing anything.\n\
A single numerical argument specifies the frame to select."),
- &select_frame_cmd_list, "select-frame ", 1, &cmdlist,
+ &select_frame_cmd_list, 1, &cmdlist,
&cli_suppress_notification.user_selected_context);
add_cmd_suppress_notification ("address", class_stack,
With a negative COUNT, print outermost -COUNT frames."),
backtrace_opts);
- cmd_list_element *c = add_com ("backtrace", class_stack,
- backtrace_command,
- backtrace_help.c_str ());
- set_cmd_completer_handle_brkchars (c, backtrace_command_completer);
+ cmd_list_element *backtrace_cmd
+ = add_com ("backtrace", class_stack, backtrace_command,
+ backtrace_help.c_str ());
+ set_cmd_completer_handle_brkchars (backtrace_cmd, backtrace_command_completer);
- add_com_alias ("bt", "backtrace", class_stack, 0);
+ add_com_alias ("bt", backtrace_cmd, class_stack, 0);
- add_com_alias ("where", "backtrace", class_alias, 0);
- add_info ("stack", backtrace_command,
- _("Backtrace of the stack, or innermost COUNT frames."));
- add_info_alias ("s", "stack", 1);
+ add_com_alias ("where", backtrace_cmd, class_stack, 0);
+ cmd_list_element *info_stack_cmd
+ = add_info ("stack", backtrace_command,
+ _("Backtrace of the stack, or innermost COUNT frames."));
+ add_info_alias ("s", info_stack_cmd, 1);
- add_prefix_cmd ("frame", class_info, &info_frame_cmd.base_command,
- _("All about the selected stack frame.\n\
+ cmd_list_element *info_frame_cmd_el
+ = add_prefix_cmd ("frame", class_info, &info_frame_cmd.base_command,
+ _("All about the selected stack frame.\n\
With no arguments, displays information about the currently selected stack\n\
frame. Alternatively a frame specification may be provided (See \"frame\")\n\
the information is then printed about the specified frame."),
- &info_frame_cmd_list, "info frame ", 1, &infolist);
- add_info_alias ("f", "frame", 1);
+ &info_frame_cmd_list, 1, &infolist);
+ add_info_alias ("f", info_frame_cmd_el, 1);
add_cmd ("address", class_stack, &info_frame_cmd.address,
_("\
false));
set_cmd_completer_handle_brkchars (cmd, info_print_command_completer);
- if (dbx_commands)
- add_com ("func", class_stack, func_command, _("\
-Select the stack frame that contains NAME.\n\
-Usage: func NAME"));
-
/* Install "set print raw frame-arguments", a deprecated spelling of
"set print raw-frame-arguments". */
- cmd = add_setshow_boolean_cmd
- ("frame-arguments", no_class,
- &user_frame_print_options.print_raw_frame_arguments,
- _("\
+ set_show_commands set_show_frame_args
+ = add_setshow_boolean_cmd
+ ("frame-arguments", no_class,
+ &user_frame_print_options.print_raw_frame_arguments,
+ _("\
Set whether to print frame arguments in raw form."), _("\
Show whether to print frame arguments in raw form."), _("\
If set, frame arguments are printed in raw form, bypassing any\n\
pretty-printers for that value."),
- NULL, NULL,
- &setprintrawlist, &showprintrawlist);
- deprecate_cmd (cmd, "set print raw-frame-arguments");
+ NULL, NULL,
+ &setprintrawlist, &showprintrawlist);
+ deprecate_cmd (set_show_frame_args.set, "set print raw-frame-arguments");
add_setshow_auto_boolean_cmd ("disassemble-next-line", class_stack,
- &disassemble_next_line, _("\
+ &disassemble_next_line, _("\
Set whether to disassemble next source line or insn when execution stops."),
_("\
Show whether to disassemble next source line or insn when execution stops."),
cannot be displayed.\n\
If OFF (which is the default), never display the disassembly of the next\n\
source line."),
- NULL,
- show_disassemble_next_line,
- &setlist, &showlist);
+ NULL,
+ show_disassemble_next_line,
+ &setlist, &showlist);
disassemble_next_line = AUTO_BOOLEAN_FALSE;
gdb::option::add_setshow_cmds_for_options