I've comitted the patches below. Testcases don't work for me but I've kept the status quo so they should work for others. Diff's have been made with Emacs backup files - sorry, should have made the patches before committing, done off-line - 64k modem, family to feed etc. I hope they work... Well they compile anyway. Nick http://www.nick.uklinux.net 2004-01-20 Nick Roberts * mi/mi-cmds.h (enum print_values): Add definition. * mi/mi-cmd-stack.c (mi_cmd_stack_list_locals): Print the name, type and value for simple data types and just the name and type for complex ones, if required. * mi/mi-cmd-var.c (mi_cmd_var_list_children): Print the values of the children, if required. 2004-01-19 Nick Roberts * gdb.texinfo (GDB/MI Stack Manipulation): Describe extension to -stack-list-locals. (GDB/MI Variable Objects): Describe extension to -var-list-children. 2004-01-20 Nick Roberts * gdb.mi/mi-stack.exp (test_stack_locals_listing): Test for case "-stack-list-locals 2". * gdb.mi/mi-var-child.exp: Test for case "-var-list-children --all-values NAME". *** /home/nick/gdb/gdb/mi/mi-cmds.h~ 2003-08-05 00:18:50.000000000 +0100 --- /home/nick/gdb/gdb/mi/mi-cmds.h 2004-01-19 23:25:52.000000000 +0000 *************** *** 48,53 **** --- 48,59 ---- MI_CMD_QUIET }; + enum print_values { + PRINT_NO_VALUES, + PRINT_ALL_VALUES, + PRINT_SIMPLE_VALUES + }; + typedef enum mi_cmd_result (mi_cmd_argv_ftype) (char *command, char **argv, int argc); /* Older MI commands have this interface. Retained until all old *** /home/nick/gdb/gdb/mi/mi-cmd-stack.c~ 2003-06-12 00:29:49.000000000 +0100 --- /home/nick/gdb/gdb/mi/mi-cmd-stack.c 2004-01-19 23:27:51.000000000 +0000 *************** *** 29,34 **** --- 29,35 ---- #include "block.h" #include "stack.h" #include "dictionary.h" + #include "gdb_string.h" static void list_args_or_locals (int locals, int values, struct frame_info *fi); *************** *** 137,146 **** enum mi_cmd_result mi_cmd_stack_list_locals (char *command, char **argv, int argc) { if (argc != 1) error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES"); ! list_args_or_locals (1, atoi (argv[0]), deprecated_selected_frame); return MI_CMD_DONE; } --- 138,163 ---- enum mi_cmd_result mi_cmd_stack_list_locals (char *command, char **argv, int argc) { + struct frame_info *frame; + enum print_values print_values; + if (argc != 1) error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES"); ! frame = get_selected_frame (); ! ! if (strcmp (argv[0], "0") == 0 ! || strcmp (argv[0], "--no-values") == 0) ! print_values = PRINT_NO_VALUES; ! else if (strcmp (argv[0], "1") == 0 ! || strcmp (argv[0], "--all-values") == 0) ! print_values = PRINT_ALL_VALUES; ! else if (strcmp (argv[0], "2") == 0 ! || strcmp (argv[0], "--simple-values") == 0) ! print_values = PRINT_SIMPLE_VALUES; ! else ! error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\", 2 or \"--simple-values\""); ! list_args_or_locals (1, print_values, frame); return MI_CMD_DONE; } *************** *** 218,223 **** --- 235,241 ---- int nsyms; struct cleanup *cleanup_list; static struct ui_stream *stb = NULL; + struct type *type; stb = ui_out_stream_new (uiout); *************** *** 268,291 **** if (print_me) { struct cleanup *cleanup_tuple = NULL; ! if (values) ! cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ! ui_out_field_string (uiout, "name", DEPRECATED_SYMBOL_NAME (sym)); ! if (values) ! { ! struct symbol *sym2; ! if (!locals) ! sym2 = lookup_symbol (DEPRECATED_SYMBOL_NAME (sym), ! block, VAR_DOMAIN, ! (int *) NULL, ! (struct symtab **) NULL); ! else sym2 = sym; print_variable_value (sym2, fi, stb->stream); ui_out_field_stream (uiout, "value", stb); do_cleanups (cleanup_tuple); } } } --- 286,324 ---- if (print_me) { struct cleanup *cleanup_tuple = NULL; ! if (values != PRINT_NO_VALUES) ! cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ! ui_out_field_string (uiout, "name", SYMBOL_PRINT_NAME (sym)); ! struct symbol *sym2; ! if (!locals) ! sym2 = lookup_symbol (SYMBOL_NATURAL_NAME (sym), ! block, VAR_DOMAIN, ! (int *) NULL, ! (struct symtab **) NULL); ! else sym2 = sym; + switch (values) + { + case PRINT_SIMPLE_VALUES: + type = check_typedef (sym2->type); + type_print (sym2->type, "", stb->stream, -1); + ui_out_field_stream (uiout, "type", stb); + if (TYPE_CODE (type) != TYPE_CODE_ARRAY + && TYPE_CODE (type) != TYPE_CODE_STRUCT + && TYPE_CODE (type) != TYPE_CODE_UNION) + { + print_variable_value (sym2, fi, stb->stream); + ui_out_field_stream (uiout, "value", stb); + } + do_cleanups (cleanup_tuple); + break; + case PRINT_ALL_VALUES: print_variable_value (sym2, fi, stb->stream); ui_out_field_stream (uiout, "value", stb); do_cleanups (cleanup_tuple); + break; } } } *** /home/nick/gdb/gdb/mi/mi-cmd-stack.c~ 2003-06-12 00:29:49.000000000 +0100 --- /home/nick/gdb/gdb/mi/mi-cmd-stack.c 2004-01-19 23:27:51.000000000 +0000 *************** *** 29,34 **** --- 29,35 ---- #include "block.h" #include "stack.h" #include "dictionary.h" + #include "gdb_string.h" static void list_args_or_locals (int locals, int values, struct frame_info *fi); *************** *** 137,146 **** enum mi_cmd_result mi_cmd_stack_list_locals (char *command, char **argv, int argc) { if (argc != 1) error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES"); ! list_args_or_locals (1, atoi (argv[0]), deprecated_selected_frame); return MI_CMD_DONE; } --- 138,163 ---- enum mi_cmd_result mi_cmd_stack_list_locals (char *command, char **argv, int argc) { + struct frame_info *frame; + enum print_values print_values; + if (argc != 1) error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES"); ! frame = get_selected_frame (); ! ! if (strcmp (argv[0], "0") == 0 ! || strcmp (argv[0], "--no-values") == 0) ! print_values = PRINT_NO_VALUES; ! else if (strcmp (argv[0], "1") == 0 ! || strcmp (argv[0], "--all-values") == 0) ! print_values = PRINT_ALL_VALUES; ! else if (strcmp (argv[0], "2") == 0 ! || strcmp (argv[0], "--simple-values") == 0) ! print_values = PRINT_SIMPLE_VALUES; ! else ! error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\", 2 or \"--simple-values\""); ! list_args_or_locals (1, print_values, frame); return MI_CMD_DONE; } *************** *** 218,223 **** --- 235,241 ---- int nsyms; struct cleanup *cleanup_list; static struct ui_stream *stb = NULL; + struct type *type; stb = ui_out_stream_new (uiout); *************** *** 268,291 **** if (print_me) { struct cleanup *cleanup_tuple = NULL; ! if (values) ! cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ! ui_out_field_string (uiout, "name", DEPRECATED_SYMBOL_NAME (sym)); ! if (values) ! { ! struct symbol *sym2; ! if (!locals) ! sym2 = lookup_symbol (DEPRECATED_SYMBOL_NAME (sym), ! block, VAR_DOMAIN, ! (int *) NULL, ! (struct symtab **) NULL); ! else sym2 = sym; print_variable_value (sym2, fi, stb->stream); ui_out_field_stream (uiout, "value", stb); do_cleanups (cleanup_tuple); } } } --- 286,324 ---- if (print_me) { struct cleanup *cleanup_tuple = NULL; ! if (values != PRINT_NO_VALUES) ! cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ! ui_out_field_string (uiout, "name", SYMBOL_PRINT_NAME (sym)); ! struct symbol *sym2; ! if (!locals) ! sym2 = lookup_symbol (SYMBOL_NATURAL_NAME (sym), ! block, VAR_DOMAIN, ! (int *) NULL, ! (struct symtab **) NULL); ! else sym2 = sym; + switch (values) + { + case PRINT_SIMPLE_VALUES: + type = check_typedef (sym2->type); + type_print (sym2->type, "", stb->stream, -1); + ui_out_field_stream (uiout, "type", stb); + if (TYPE_CODE (type) != TYPE_CODE_ARRAY + && TYPE_CODE (type) != TYPE_CODE_STRUCT + && TYPE_CODE (type) != TYPE_CODE_UNION) + { + print_variable_value (sym2, fi, stb->stream); + ui_out_field_stream (uiout, "value", stb); + } + do_cleanups (cleanup_tuple); + break; + case PRINT_ALL_VALUES: print_variable_value (sym2, fi, stb->stream); ui_out_field_stream (uiout, "value", stb); do_cleanups (cleanup_tuple); + break; } } } *** /home/nick/gdb/gdb/doc/gdb.texinfo~ 2004-01-19 23:11:48.000000000 +0000 --- /home/nick/gdb/gdb/doc/gdb.texinfo 2004-01-19 23:25:02.000000000 +0000 *************** *** 17206,17213 **** @end smallexample Display the local variable names for the current frame. With an ! argument of 0 prints only the names of the variables, with argument of 1 ! prints also their values. @subsubheading @value{GDBN} Command --- 17206,17219 ---- @end smallexample Display the local variable names for the current frame. With an ! argument of 0 or @code{--no-values}, prints only the names of the variables. ! With argument of 1 or @code{--all-values}, prints also their values. With ! argument of 2 or @code{--simple-values}, prints the name, type and value for ! simple data types and the name and type for arrays, structures and ! unions. In this last case, the idea is that the user can see the ! value of simple data types immediately and he can create variable ! objects for other data types if he wishes to explore their values in ! more detail. @subsubheading @value{GDBN} Command *************** *** 17220,17228 **** -stack-list-locals 0 ^done,locals=[name="A",name="B",name="C"] (@value{GDBP}) ! -stack-list-locals 1 ^done,locals=[@{name="A",value="1"@},@{name="B",value="2"@}, ! @{name="C",value="3"@}] (@value{GDBP}) @end smallexample --- 17226,17237 ---- -stack-list-locals 0 ^done,locals=[name="A",name="B",name="C"] (@value{GDBP}) ! -stack-list-locals --all-values ^done,locals=[@{name="A",value="1"@},@{name="B",value="2"@}, ! @{name="C",value="@{1, 2, 3@}"@}] ! -stack-list-locals --simple-values ! ^done,locals=[@{name="A",type="int",value="1"@}, ! @{name="B",type="int",value="2"@},@{name="C",type="int [3]"@}] (@value{GDBP}) @end smallexample *************** *** 18166,18179 **** @subsubheading Synopsis @smallexample ! -var-list-children @var{name} @end smallexample ! Returns a list of the children of the specified variable object: @smallexample numchild=@var{n},children=[@{name=@var{name}, numchild=@var{n},type=@var{type}@},@r{(repeats N times)}] @end smallexample --- 18175,18200 ---- @subsubheading Synopsis @smallexample ! -var-list-children [@var{print-values}] @var{name} @end smallexample ! Returns a list of the children of the specified variable object. With ! just the variable object name as an argument or with an optional ! preceding argument of 0 or @code{--no-values}, prints only the names of the ! variables. With an optional preceding argument of 1 or @code{--all-values}, ! also prints their values. ! ! @subsubheading Example @smallexample + (@value{GDBP}) + -var-list-children n numchild=@var{n},children=[@{name=@var{name}, numchild=@var{n},type=@var{type}@},@r{(repeats N times)}] + (@value{GDBP}) + -var-list-children --all-values n + numchild=@var{n},children=[@{name=@var{name}, + numchild=@var{n},value=@var{value},type=@var{type}@},@r{(repeats N times)}] @end smallexample *** /home/nick/gdb/gdb/testsuite/gdb.mi/mi-stack.exp~ 2002-11-05 15:43:18.000000000 +0000 --- /home/nick/gdb/gdb/testsuite/gdb.mi/mi-stack.exp 2004-01-19 23:14:32.000000000 +0000 *************** *** 149,154 **** --- 149,155 ---- # Tests: # -stack-list-locals 0 # -stack-list-locals 1 + # -stack-list-locals 2 # -stack-list-arguments mi_gdb_test "232-stack-list-locals 0" \ *************** *** 168,173 **** --- 169,178 ---- "232\\^done,locals=\\\[\{name=\"A\",value=\"1\"\},\{name=\"B\",value=\"2\"\},\{name=\"C\",value=\"3\"\}\\\]" \ "stack locals listing 1" + mi_gdb_test "232-stack-list-locals 2" \ + "232\\^done,locals=\\\[\{name=\"A\",type=\"int\",value=\"1\"\},\{name=\"B\",type=\"int\",value=\"2\"\},\{name=\"C\",type=\"int\",value=\"3\"\}\\\]" \ + "stack locals listing 2" + mi_gdb_test "234-stack-list-locals" \ "234\\^error,msg=\"mi_cmd_stack_list_locals: Usage.*PRINT_VALUES.*\"" \ "stack locals listing wrong" *** /home/nick/gdb/gdb/testsuite/gdb.mi/mi-var-child.exp~ 2004-01-19 23:15:54.000000000 +0000 --- /home/nick/gdb/gdb/testsuite/gdb.mi/mi-var-child.exp 2004-01-20 00:01:51.000000000 +0000 *************** *** 827,832 **** --- 827,836 ---- set line 208 mi_execute_to "exec-step 7" "end-stepping-range" do_children_tests {} {.*var-cmd.c} $line {} "step $line" + mi_gdb_test "-var-list-children --all-values struct_declarations.long_array" \ + "\\^done,numchild=\"10\",children=\\\[child=\{name=\"struct_declarations.long_array.0\",exp=\"0\",numchild=\"0\",value=\"1234\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.1\",exp=\"1\",numchild=\"0\",value=\"2345\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.2\",exp=\"2\",numchild=\"0\",value=\"3456\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.3\",exp=\"3\",numchild=\"0\",value=\"4567\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.4\",exp=\"4\",numchild=\"0\",value=\"5678\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.5\",exp=\"5\",numchild=\"0\",value=\"6789\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.6\",exp=\"6\",numchild=\"0\",value=\"7890\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.7\",exp=\"7\",numchild=\"0\",value=\"8901\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.8\",exp=\"8\",numchild=\"0\",value=\"9012\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.9\",exp=\"9\",numchild=\"0\",value=\"1234\",type=\"long int\"\}\\\]" \ + "listing of names and values of children" + # Test: c_variable-5.8 # Desc: check that long_array[3-9] changed mi_gdb_test "-var-update *" \ &j!z޶M9X܆[\