From 88408340b86be224130c470c129997ccc947a975 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Fri, 9 Nov 2007 19:04:35 +0000 Subject: * 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. --- gdb/ChangeLog | 8 ++++++ gdb/stack.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 82 insertions(+), 16 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 17433cc..4f0d9a9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2007-11-06 Joel Brobecker + + * 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 * ppc-linux-nat.c (ppc_linux_insert_watchpoint): Move 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 \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."), -- cgit v1.1