print_frame_arg (const struct frame_arg *arg)
{
struct ui_out *uiout = current_uiout;
- struct cleanup *old_chain;
- struct ui_file *stb;
const char *error_message = NULL;
- stb = mem_fileopen ();
- old_chain = make_cleanup_ui_file_delete (stb);
+ string_file stb;
gdb_assert (!arg->val || !arg->error);
gdb_assert (arg->entry_kind == print_entry_values_no
|| (!uiout->is_mi_like_p ()
&& arg->entry_kind == print_entry_values_compact));
- annotate_arg_begin ();
-
- make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
- fprintf_symbol_filtered (stb, SYMBOL_PRINT_NAME (arg->sym),
+ annotate_arg_emitter arg_emitter;
+ ui_out_emit_tuple tuple_emitter (uiout, NULL);
+ fprintf_symbol_filtered (&stb, SYMBOL_PRINT_NAME (arg->sym),
SYMBOL_LANGUAGE (arg->sym), DMGL_PARAMS | DMGL_ANSI);
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. */
- fputs_filtered ("=", stb);
+ stb.puts ("=");
- fprintf_symbol_filtered (stb, SYMBOL_PRINT_NAME (arg->sym),
+ fprintf_symbol_filtered (&stb, SYMBOL_PRINT_NAME (arg->sym),
SYMBOL_LANGUAGE (arg->sym),
DMGL_PARAMS | DMGL_ANSI);
}
if (arg->entry_kind == print_entry_values_only
|| arg->entry_kind == print_entry_values_compact)
- fputs_filtered ("@entry", stb);
+ stb.puts ("@entry");
uiout->field_stream ("name", stb);
annotate_arg_name_end ();
uiout->text ("=");
/* True in "summary" mode, false otherwise. */
opts.summary = !strcmp (print_frame_arguments, "scalars");
- common_val_print (arg->val, stb, 2, &opts, language);
+ common_val_print (arg->val, &stb, 2, &opts, language);
}
CATCH (except, RETURN_MASK_ERROR)
{
END_CATCH
}
if (error_message != NULL)
- fprintf_filtered (stb, _("<error reading variable: %s>"),
- error_message);
+ stb.printf (_("<error reading variable: %s>"), error_message);
}
uiout->field_stream ("value", stb);
-
- /* Also invoke ui_out_tuple_end. */
- do_cleanups (old_chain);
-
- annotate_arg_end ();
}
/* Read in inferior function local SYM at FRAME into ARGP. Caller is
/* Initialize it just to avoid a GCC false warning. */
struct value *val_deref = NULL, *entryval_deref;
- /* DW_AT_GNU_call_site_value does match with the current
+ /* DW_AT_call_value does match with the current
value. If it is a reference still try to verify if
- dereferenced DW_AT_GNU_call_site_data_value does not
- differ. */
+ dereferenced DW_AT_call_data_value does not differ. */
TRY
{
long highest_offset = -1;
/* Number of ints of arguments that we have printed so far. */
int args_printed = 0;
- struct cleanup *old_chain;
- struct ui_file *stb;
/* True if we should print arguments, false otherwise. */
int print_args = strcmp (print_frame_arguments, "none");
- stb = mem_fileopen ();
- old_chain = make_cleanup_ui_file_delete (stb);
-
if (func)
{
const struct block *b = SYMBOL_BLOCK_VALUE (func);
print_frame_nameless_args (frame, start, num - args_printed,
first, stream);
}
-
- do_cleanups (old_chain);
}
/* Set the current source and line to the location given by frame
void
set_current_sal_from_frame (struct frame_info *frame)
{
- struct symtab_and_line sal;
-
- find_frame_sal (frame, &sal);
+ symtab_and_line sal = find_frame_sal (frame);
if (sal.symtab != NULL)
- set_current_source_symtab_and_line (&sal);
+ set_current_source_symtab_and_line (sal);
}
/* If ON, GDB will display disassembly of the next source line when
TRY
{
- gdb_disassembly (gdbarch, current_uiout, 0,
+ gdb_disassembly (gdbarch, current_uiout,
DISASSEMBLY_RAW_INSN, how_many,
low, high);
}
int set_current_sal)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
- struct symtab_and_line sal;
int source_print;
int location_print;
struct ui_out *uiout = current_uiout;
|| get_frame_type (frame) == SIGTRAMP_FRAME
|| get_frame_type (frame) == ARCH_FRAME)
{
- struct cleanup *uiout_cleanup
- = make_cleanup_ui_out_tuple_begin_end (uiout, "frame");
+ ui_out_emit_tuple tuple_emitter (uiout, "frame");
annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
gdbarch, get_frame_pc (frame));
do_gdb_disassembly (get_frame_arch (frame), 1,
get_frame_pc (frame), get_frame_pc (frame) + 1);
- do_cleanups (uiout_cleanup);
return;
}
the next frame is a SIGTRAMP_FRAME or a DUMMY_FRAME, then the
next frame was not entered as the result of a call, and we want
to get the line containing FRAME->pc. */
- find_frame_sal (frame, &sal);
+ symtab_and_line sal = find_frame_sal (frame);
location_print = (print_what == LOCATION
|| print_what == LOC_AND_ADDRESS
/* Get the last sal we displayed, if it's valid. */
-void
-get_last_displayed_sal (struct symtab_and_line *sal)
+symtab_and_line
+get_last_displayed_sal ()
{
+ symtab_and_line sal;
+
if (last_displayed_sal_valid)
{
- sal->pspace = last_displayed_pspace;
- sal->pc = last_displayed_addr;
- sal->symtab = last_displayed_symtab;
- sal->line = last_displayed_line;
- }
- else
- {
- sal->pspace = 0;
- sal->pc = 0;
- sal->symtab = 0;
- sal->line = 0;
+ sal.pspace = last_displayed_pspace;
+ sal.pc = last_displayed_addr;
+ sal.symtab = last_displayed_symtab;
+ sal.line = last_displayed_line;
}
+
+ return sal;
}
struct ui_out *uiout = current_uiout;
char *funname = NULL;
enum language funlang = language_unknown;
- struct ui_file *stb;
struct cleanup *old_chain, *list_chain;
struct value_print_options opts;
struct symbol *func;
pc_p = get_frame_pc_if_available (frame, &pc);
- stb = mem_fileopen ();
- old_chain = make_cleanup_ui_file_delete (stb);
find_frame_funname (frame, &funname, &funlang, &func);
- make_cleanup (xfree, funname);
+ old_chain = make_cleanup (xfree, funname);
annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
gdbarch, pc);
uiout->text (" in ");
}
annotate_frame_function_name ();
- fprintf_symbol_filtered (stb, funname ? funname : "??",
+
+ string_file stb;
+ fprintf_symbol_filtered (&stb, funname ? funname : "??",
funlang, DMGL_ANSI);
uiout->field_stream ("func", stb);
uiout->wrap_hint (" ");
{
struct gdbarch *gdbarch = get_frame_arch (frame);
int numargs;
- struct cleanup *args_list_chain;
if (gdbarch_frame_num_args_p (gdbarch))
{
else
numargs = -1;
- args_list_chain = make_cleanup_ui_out_list_begin_end (uiout, "args");
- TRY
- {
- print_frame_args (func, frame, numargs, gdb_stdout);
- }
- CATCH (e, RETURN_MASK_ERROR)
- {
- }
- END_CATCH
+ {
+ ui_out_emit_list list_emitter (uiout, "args");
+ TRY
+ {
+ print_frame_args (func, frame, numargs, gdb_stdout);
+ }
+ CATCH (e, RETURN_MASK_ERROR)
+ {
+ }
+ END_CATCH
- /* FIXME: ARGS must be a list. If one argument is a string it
- will have " that will not be properly escaped. */
- /* Invoke ui_out_tuple_end. */
- do_cleanups (args_list_chain);
+ /* FIXME: ARGS must be a list. If one argument is a string it
+ will have " that will not be properly escaped. */
+ }
QUIT;
}
uiout->text (")");
ADDR_EXP. Absolutely all information in the frame is printed. */
static void
-frame_info (char *addr_exp, int from_tty)
+info_frame_command (char *addr_exp, int from_tty)
{
struct frame_info *fi;
- struct symtab_and_line sal;
struct symbol *func;
struct symtab *s;
struct frame_info *calling_frame_info;
pc_regname = "pc";
frame_pc_p = get_frame_pc_if_available (fi, &frame_pc);
- find_frame_sal (fi, &sal);
func = get_frame_function (fi);
+ symtab_and_line sal = find_frame_sal (fi);
s = sal.symtab;
if (func)
{
/* Print as much information as possible on the location of all the
registers. */
{
- enum lval_type lval;
- int optimized;
- int unavailable;
- CORE_ADDR addr;
- int realnum;
int count;
int i;
int need_nl = 1;
+ int sp_regnum = gdbarch_sp_regnum (gdbarch);
/* The sp is special; what's displayed isn't the save address, but
the value of the previous frame's sp. This is a legacy thing,
at one stage the frame cached the previous frame's SP instead
of its address, hence it was easiest to just display the cached
value. */
- if (gdbarch_sp_regnum (gdbarch) >= 0)
+ if (sp_regnum >= 0)
{
- /* Find out the location of the saved stack pointer with out
- actually evaluating it. */
- frame_register_unwind (fi, gdbarch_sp_regnum (gdbarch),
- &optimized, &unavailable, &lval, &addr,
- &realnum, NULL);
- if (!optimized && !unavailable && lval == not_lval)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
- int sp_size = register_size (gdbarch, gdbarch_sp_regnum (gdbarch));
- gdb_byte value[MAX_REGISTER_SIZE];
- CORE_ADDR sp;
-
- frame_register_unwind (fi, gdbarch_sp_regnum (gdbarch),
- &optimized, &unavailable, &lval, &addr,
- &realnum, value);
- /* NOTE: cagney/2003-05-22: This is assuming that the
- stack pointer was packed as an unsigned integer. That
- may or may not be valid. */
- sp = extract_unsigned_integer (value, sp_size, byte_order);
- printf_filtered (" Previous frame's sp is ");
- fputs_filtered (paddress (gdbarch, sp), gdb_stdout);
- printf_filtered ("\n");
- need_nl = 0;
- }
- else if (!optimized && !unavailable && lval == lval_memory)
- {
- printf_filtered (" Previous frame's sp at ");
- fputs_filtered (paddress (gdbarch, addr), gdb_stdout);
- printf_filtered ("\n");
- need_nl = 0;
- }
- else if (!optimized && !unavailable && lval == lval_register)
+ struct value *value = frame_unwind_register_value (fi, sp_regnum);
+ gdb_assert (value != NULL);
+
+ if (!value_optimized_out (value) && value_entirely_available (value))
{
- printf_filtered (" Previous frame's sp in %s\n",
- gdbarch_register_name (gdbarch, realnum));
+ if (VALUE_LVAL (value) == 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);
+
+ printf_filtered (" Previous frame's sp is ");
+ fputs_filtered (paddress (gdbarch, sp), gdb_stdout);
+ printf_filtered ("\n");
+ }
+ else if (VALUE_LVAL (value) == lval_memory)
+ {
+ printf_filtered (" Previous frame's sp at ");
+ fputs_filtered (paddress (gdbarch, value_address (value)),
+ gdb_stdout);
+ printf_filtered ("\n");
+ }
+ else if (VALUE_LVAL (value) == lval_register)
+ {
+ printf_filtered (" Previous frame's sp in %s\n",
+ gdbarch_register_name (gdbarch,
+ VALUE_REGNUM (value)));
+ }
+
+ release_value (value);
+ value_free (value);
need_nl = 0;
}
/* else keep quiet. */
numregs = gdbarch_num_regs (gdbarch)
+ gdbarch_num_pseudo_regs (gdbarch);
for (i = 0; i < numregs; i++)
- if (i != gdbarch_sp_regnum (gdbarch)
+ if (i != sp_regnum
&& gdbarch_register_reggroup_p (gdbarch, i, all_reggroup))
{
+ enum lval_type lval;
+ int optimized;
+ int unavailable;
+ CORE_ADDR addr;
+ int realnum;
+
/* Find out the location of the saved register without
fetching the corresponding value. */
frame_register_unwind (fi, i, &optimized, &unavailable,
char **argv;
int i;
- argv = gdb_buildargv (arg);
- make_cleanup_freeargv (argv);
+ gdb_argv built_argv (arg);
+ argv = built_argv.get ();
argc = 0;
for (i = 0; argv[i]; i++)
{
}
void
-locals_info (char *args, int from_tty)
+info_locals_command (char *args, int from_tty)
{
print_frame_local_vars (get_selected_frame (_("No frame selected.")),
0, gdb_stdout);
}
void
-args_info (char *ignore, int from_tty)
+info_args_command (char *ignore, int from_tty)
{
print_frame_arg_vars (get_selected_frame (_("No frame selected.")),
gdb_stdout);
{
struct frame_info *frame;
int found = 0;
- struct symtabs_and_lines sals;
- int i;
int level = 1;
struct function_bounds *func_bounds = NULL;
- struct cleanup *cleanups;
if (arg == NULL)
return;
frame = get_current_frame ();
- sals = decode_line_with_current_source (arg, DECODE_LINE_FUNFIRSTLINE);
- cleanups = make_cleanup (xfree, sals.sals);
- func_bounds = XNEWVEC (struct function_bounds, sals.nelts);
- make_cleanup (xfree, func_bounds);
- for (i = 0; (i < sals.nelts && !found); i++)
+ std::vector<symtab_and_line> sals
+ = decode_line_with_current_source (arg, DECODE_LINE_FUNFIRSTLINE);
+ func_bounds = XNEWVEC (struct function_bounds, sals.size ());
+ struct cleanup *cleanups = make_cleanup (xfree, func_bounds);
+ for (size_t i = 0; (i < sals.size () && !found); i++)
{
- if (sals.sals[i].pspace != current_program_space)
+ if (sals[i].pspace != current_program_space)
func_bounds[i].low = func_bounds[i].high = 0;
- else if (sals.sals[i].pc == 0
- || find_pc_partial_function (sals.sals[i].pc, NULL,
+ else if (sals[i].pc == 0
+ || find_pc_partial_function (sals[i].pc, NULL,
&func_bounds[i].low,
&func_bounds[i].high) == 0)
{
do
{
- for (i = 0; (i < sals.nelts && !found); i++)
+ for (size_t i = 0; (i < sals.size () && !found); i++)
found = (get_frame_pc (frame) >= func_bounds[i].low
&& get_frame_pc (frame) < func_bounds[i].high);
if (!found)
Select and print a stack frame.\nWith no argument, \
print the selected stack frame. (See also \"info frame\").\n\
An argument specifies the frame to select.\n\
-It can be a stack frame number or the address of the frame.\n\
-With argument, nothing is printed if input is coming from\n\
-a command file or a user-defined command."));
+It can be a stack frame number or the address of the frame.\n"));
add_com_alias ("f", "frame", class_stack, 1);
add_info ("stack", backtrace_command,
_("Backtrace of the stack, or innermost COUNT frames."));
add_info_alias ("s", "stack", 1);
- add_info ("frame", frame_info,
+ add_info ("frame", info_frame_command,
_("All about selected stack frame, or frame at ADDR."));
add_info_alias ("f", "frame", 1);
- add_info ("locals", locals_info,
+ add_info ("locals", info_locals_command,
_("Local variables of current stack frame."));
- add_info ("args", args_info,
+ add_info ("args", info_args_command,
_("Argument variables of current stack frame."));
if (dbx_commands)