* stack.c (print_frame_arguments_choices): New static global.

(print_frame_arguments): Likewise.
        (print_this_frame_argument_p): New function.
        (print_frame_args): Print the argument value only when appropriate.
        (_initialize_task): Add new "set/show print frame-arguments" command.
This commit is contained in:
Joel Brobecker 2007-11-09 19:04:35 +00:00
parent 1c86e440c3
commit 88408340b8
2 changed files with 81 additions and 15 deletions

View File

@ -1,3 +1,11 @@
2007-11-06 Joel Brobecker <brobecker@adacore.com>
* stack.c (print_frame_arguments_choices): New static global.
(print_frame_arguments): Likewise.
(print_this_frame_argument_p): New function.
(print_frame_args): Print the argument value only when appropriate.
(_initialize_task): Add new "set/show print frame-arguments" command.
2007-11-09 Luis Machado <luisgpm@br.ibm.com>
* ppc-linux-nat.c (ppc_linux_insert_watchpoint): Move

View File

@ -50,6 +50,13 @@
void (*deprecated_selected_frame_level_changed_hook) (int);
/* The possible choices of "set print frame-arguments, and the value
of this setting. */
static const char *print_frame_arguments_choices[] =
{"all", "scalars", "none", NULL};
static const char *print_frame_arguments = "all";
/* Prototypes for local functions. */
static void print_frame_local_vars (struct frame_info *, int,
@ -148,6 +155,44 @@ print_frame_nameless_args (struct frame_info *frame, long start, int num,
}
}
/* Return non-zero if the debugger should print the value of the provided
symbol parameter (SYM). */
static int
print_this_frame_argument_p (struct symbol *sym)
{
struct type *type;
/* If the user asked to print no argument at all, then obviously
do not print this argument. */
if (strcmp (print_frame_arguments, "none") == 0)
return 0;
/* If the user asked to print all arguments, then we should print
that one. */
if (strcmp (print_frame_arguments, "all") == 0)
return 1;
/* The user asked to print only the scalar arguments, so do not
print the non-scalar ones. */
type = CHECK_TYPEDEF (SYMBOL_TYPE (sym));
switch (TYPE_CODE (type))
{
case TYPE_CODE_ARRAY:
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
case TYPE_CODE_SET:
case TYPE_CODE_STRING:
case TYPE_CODE_BITSTRING:
return 0;
default:
return 1;
}
}
/* Print the arguments of frame FRAME on STREAM, given the function
FUNC running in that frame (as a symbol), where NUM is the number
of arguments according to the stack frame (or -1 if the number of
@ -304,23 +349,30 @@ print_frame_args (struct symbol *func, struct frame_info *frame,
annotate_arg_name_end ();
ui_out_text (uiout, "=");
/* Avoid value_print because it will deref ref parameters.
We just want to print their addresses. Print ??? for
args whose address we do not know. We pass 2 as
"recurse" to val_print because our standard indentation
here is 4 spaces, and val_print indents 2 for each
recurse. */
val = read_var_value (sym, frame);
if (print_this_frame_argument_p (sym))
{
/* Avoid value_print because it will deref ref parameters.
We just want to print their addresses. Print ??? for
args whose address we do not know. We pass 2 as
"recurse" to val_print because our standard indentation
here is 4 spaces, and val_print indents 2 for each
recurse. */
val = read_var_value (sym, frame);
annotate_arg_value (val == NULL ? NULL : value_type (val));
annotate_arg_value (val == NULL ? NULL : value_type (val));
if (val)
{
common_val_print (val, stb->stream, 0, 0, 2,
Val_no_prettyprint);
ui_out_field_stream (uiout, "value", stb);
}
else
ui_out_text (uiout, "???");
}
else
ui_out_text (uiout, "...");
if (val)
{
common_val_print (val, stb->stream, 0, 0, 2, Val_no_prettyprint);
ui_out_field_stream (uiout, "value", stb);
}
else
ui_out_text (uiout, "???");
/* Invoke ui_out_tuple_end. */
do_cleanups (list_chain);
@ -2039,6 +2091,12 @@ Usage: func <name>\n"));
add_info ("catch", catch_info,
_("Exceptions that can be caught in the current stack frame."));
add_setshow_enum_cmd ("frame-arguments", class_stack,
print_frame_arguments_choices, &print_frame_arguments,
_("Set printing of non-scalar frame arguments"),
_("Show printing of non-scalar frame arguments"),
NULL, NULL, NULL, &setprintlist, &showprintlist);
#if 0
add_cmd ("backtrace-limit", class_stack, set_backtrace_limit_command, _(\
"Specify maximum number of frames for \"backtrace\" to print by default."),