diff options
author | Joel Brobecker <brobecker@gnat.com> | 2007-11-09 19:04:35 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2007-11-09 19:04:35 +0000 |
commit | 88408340b86be224130c470c129997ccc947a975 (patch) | |
tree | 47391a602dcf0e38f9f5a76338cff2005b340283 /gdb/stack.c | |
parent | 1c86e440c3178f9b729a0e99c0d45e40c7b813e8 (diff) | |
download | gdb-88408340b86be224130c470c129997ccc947a975.zip gdb-88408340b86be224130c470c129997ccc947a975.tar.gz gdb-88408340b86be224130c470c129997ccc947a975.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/stack.c')
-rw-r--r-- | gdb/stack.c | 90 |
1 files changed, 74 insertions, 16 deletions
diff --git a/gdb/stack.c b/gdb/stack.c index 237ded1..e034033 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -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); - - annotate_arg_value (val == NULL ? NULL : value_type (val)); + 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)); + + 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."), |