X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmi%2Fmi-cmd-var.c;h=f0a9056c4e6131da51ba2a310a943256b03aa572;hb=112e8700a6fd2fed65ca70132c9cbed4132e8bd4;hp=4de73924b9e1d69d85d8308225f9b480d47f3d10;hpb=0b30217134add051e159a192066a1e568ebd837f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 4de73924b9..f0a9056c4e 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -1,7 +1,5 @@ /* MI Command Set - varobj commands. - - Copyright (C) 2000, 2002, 2004-2005, 2007-2012 Free Software - Foundation, Inc. + Copyright (C) 2000-2016 Free Software Foundation, Inc. Contributed by Cygnus Solutions (a Red Hat company). @@ -22,24 +20,22 @@ #include "defs.h" #include "mi-cmds.h" +#include "mi-main.h" #include "ui-out.h" #include "mi-out.h" #include "varobj.h" +#include "language.h" #include "value.h" #include -#include "gdb_string.h" #include "mi-getopt.h" #include "gdbthread.h" +#include "mi-parse.h" -const char mi_no_values[] = "--no-values"; -const char mi_simple_values[] = "--simple-values"; -const char mi_all_values[] = "--all-values"; - -extern int varobjdebug; /* defined in varobj.c. */ +extern unsigned int varobjdebug; /* defined in varobj.c. */ static void varobj_update_one (struct varobj *var, - enum print_values print_values, - int explicit); + enum print_values print_values, + int is_explicit); static int mi_print_value_p (struct varobj *var, enum print_values print_values); @@ -47,51 +43,47 @@ static int mi_print_value_p (struct varobj *var, /* Print variable object VAR. The PRINT_VALUES parameter controls if the value should be printed. The PRINT_EXPRESSION parameter controls if the expression should be printed. */ + static void print_varobj (struct varobj *var, enum print_values print_values, int print_expression) { struct ui_out *uiout = current_uiout; - char *type; int thread_id; - char *display_hint; - ui_out_field_string (uiout, "name", varobj_get_objname (var)); + uiout->field_string ("name", varobj_get_objname (var)); if (print_expression) - ui_out_field_string (uiout, "exp", varobj_get_expression (var)); - ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); + { + std::string exp = varobj_get_expression (var); + + uiout->field_string ("exp", exp.c_str ()); + } + uiout->field_int ("numchild", varobj_get_num_children (var)); if (mi_print_value_p (var, print_values)) { - char *val = varobj_get_value (var); + std::string val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + uiout->field_string ("value", val.c_str ()); } - type = varobj_get_type (var); - if (type != NULL) - { - ui_out_field_string (uiout, "type", type); - xfree (type); - } + std::string type = varobj_get_type (var); + if (!type.empty ()) + uiout->field_string ("type", type.c_str ()); thread_id = varobj_get_thread_id (var); if (thread_id > 0) - ui_out_field_int (uiout, "thread-id", thread_id); + uiout->field_int ("thread-id", thread_id); if (varobj_get_frozen (var)) - ui_out_field_int (uiout, "frozen", 1); + uiout->field_int ("frozen", 1); - display_hint = varobj_get_display_hint (var); + gdb::unique_xmalloc_ptr display_hint = varobj_get_display_hint (var); if (display_hint) - { - ui_out_field_string (uiout, "displayhint", display_hint); - xfree (display_hint); - } + uiout->field_string ("displayhint", display_hint.get ()); - if (varobj_pretty_printed_p (var)) - ui_out_field_int (uiout, "dynamic", 1); + if (varobj_is_dynamic_p (var)) + uiout->field_int ("dynamic", 1); } /* VAROBJ operations */ @@ -109,15 +101,11 @@ mi_cmd_var_create (char *command, char **argv, int argc) enum varobj_type var_type; if (argc != 3) - { - /* mi_error_message = xstrprintf ("-var-create: Usage: - ...."); return MI_CMD_ERROR; */ - error (_("-var-create: Usage: NAME FRAME EXPRESSION.")); - } + error (_("-var-create: Usage: NAME FRAME EXPRESSION.")); name = xstrdup (argv[0]); - /* Add cleanup for name. Must be free_current_contents as - name can be reallocated */ + /* Add cleanup for name. Must be free_current_contents as name can + be reallocated. */ old_cleanups = make_cleanup (free_current_contents, &name); frame = xstrdup (argv[1]); @@ -156,7 +144,7 @@ mi_cmd_var_create (char *command, char **argv, int argc) print_varobj (var, PRINT_ALL_VALUES, 0 /* don't print expression */); - ui_out_field_int (uiout, "has_more", varobj_has_more (var, 0)); + uiout->field_int ("has_more", varobj_has_more (var, 0)); do_cleanups (old_cleanups); } @@ -175,12 +163,12 @@ mi_cmd_var_delete (char *command, char **argv, int argc) error (_("-var-delete: Usage: [-c] EXPRESSION.")); name = xstrdup (argv[0]); - /* Add cleanup for name. Must be free_current_contents as - name can be reallocated */ + /* Add cleanup for name. Must be free_current_contents as name can + be reallocated. */ old_cleanups = make_cleanup (free_current_contents, &name); /* If we have one single argument it cannot be '-c' or any string - starting with '-'. */ + starting with '-'. */ if (argc == 1) { if (strcmp (name, "-c") == 0) @@ -191,7 +179,7 @@ mi_cmd_var_delete (char *command, char **argv, int argc) } /* If we have 2 arguments they must be '-c' followed by a string - which would be the variable name. */ + which would be the variable name. */ if (argc == 2) { if (strcmp (name, "-c") != 0) @@ -203,13 +191,13 @@ mi_cmd_var_delete (char *command, char **argv, int argc) } /* If we didn't error out, now NAME contains the name of the - variable. */ + variable. */ var = varobj_get_handle (name); - numdel = varobj_delete (var, NULL, children_only_p); + numdel = varobj_delete (var, children_only_p); - ui_out_field_int (uiout, "ndeleted", numdel); + uiout->field_int ("ndeleted", numdel); do_cleanups (old_cleanups); } @@ -235,10 +223,12 @@ mi_parse_format (const char *arg) return FORMAT_HEXADECIMAL; else if (strncmp (arg, "octal", len) == 0) return FORMAT_OCTAL; + else if (strncmp (arg, "zero-hexadecimal", len) == 0) + return FORMAT_ZHEXADECIMAL; } error (_("Must specify the format as: \"natural\", " - "\"binary\", \"decimal\", \"hexadecimal\", or \"octal\"")); + "\"binary\", \"decimal\", \"hexadecimal\", \"octal\" or \"zero-hexadecimal\"")); } void @@ -246,27 +236,25 @@ mi_cmd_var_set_format (char *command, char **argv, int argc) { enum varobj_display_formats format; struct varobj *var; - char *val; struct ui_out *uiout = current_uiout; if (argc != 2) error (_("-var-set-format: Usage: NAME FORMAT.")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); format = mi_parse_format (argv[1]); - /* Set the format of VAR to given format */ + /* Set the format of VAR to the given format. */ varobj_set_display_format (var, format); - /* Report the new current format */ - ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); + /* Report the new current format. */ + uiout->field_string ("format", varobj_format_string[(int) format]); - /* Report the value in the new format */ - val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + /* Report the value in the new format. */ + std::string val = varobj_get_value (var); + uiout->field_string ("value", val.c_str ()); } void @@ -305,12 +293,11 @@ mi_cmd_var_set_frozen (char *command, char **argv, int argc) varobj_set_frozen (var, frozen); - /* We don't automatically return the new value, or what varobjs got new - values during unfreezing. If this information is required, client - should call -var-update explicitly. */ + /* We don't automatically return the new value, or what varobjs got + new values during unfreezing. If this information is required, + client should call -var-update explicitly. */ } - void mi_cmd_var_show_format (char *command, char **argv, int argc) { @@ -321,13 +308,13 @@ mi_cmd_var_show_format (char *command, char **argv, int argc) if (argc != 1) error (_("-var-show-format: Usage: NAME.")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); format = varobj_get_display_format (var); - /* Report the current format */ - ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); + /* Report the current format. */ + uiout->field_string ("format", varobj_format_string[(int) format]); } void @@ -339,30 +326,10 @@ mi_cmd_var_info_num_children (char *command, char **argv, int argc) if (argc != 1) error (_("-var-info-num-children: Usage: NAME.")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); - ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); -} - -/* Parse a string argument into a print_values value. */ - -static enum print_values -mi_parse_values_option (const char *arg) -{ - if (strcmp (arg, "0") == 0 - || strcmp (arg, mi_no_values) == 0) - return PRINT_NO_VALUES; - else if (strcmp (arg, "1") == 0 - || strcmp (arg, mi_all_values) == 0) - return PRINT_ALL_VALUES; - else if (strcmp (arg, "2") == 0 - || strcmp (arg, mi_simple_values) == 0) - return PRINT_SIMPLE_VALUES; - else - error (_("Unknown value for PRINT_VALUES\n\ -Must be: 0 or \"%s\", 1 or \"%s\", 2 or \"%s\""), - mi_no_values, mi_simple_values, mi_all_values); + uiout->field_int ("numchild", varobj_get_num_children (var)); } /* Return 1 if given the argument PRINT_VALUES we should display @@ -379,7 +346,7 @@ mi_print_value_p (struct varobj *var, enum print_values print_values) if (print_values == PRINT_ALL_VALUES) return 1; - if (varobj_pretty_printed_p (var)) + if (varobj_is_dynamic_p (var)) return 1; type = varobj_get_gdb_type (var); @@ -407,13 +374,12 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) enum print_values print_values; int ix; int from, to; - char *display_hint; if (argc < 1 || argc > 4) error (_("-var-list-children: Usage: " "[PRINT_VALUES] NAME [FROM TO]")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ if (argc == 1 || argc == 3) var = varobj_get_handle (argv[0]); else @@ -431,18 +397,15 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) } children = varobj_list_children (var, &from, &to); - ui_out_field_int (uiout, "numchild", to - from); + uiout->field_int ("numchild", to - from); if (argc == 2 || argc == 4) - print_values = mi_parse_values_option (argv[0]); + print_values = mi_parse_print_values (argv[0]); else print_values = PRINT_NO_VALUES; - display_hint = varobj_get_display_hint (var); + gdb::unique_xmalloc_ptr display_hint = varobj_get_display_hint (var); if (display_hint) - { - ui_out_field_string (uiout, "displayhint", display_hint); - xfree (display_hint); - } + uiout->field_string ("displayhint", display_hint.get ()); if (from < to) { @@ -467,7 +430,7 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) do_cleanups (cleanup_children); } - ui_out_field_int (uiout, "has_more", varobj_has_more (var, to)); + uiout->field_int ("has_more", varobj_has_more (var, to)); } void @@ -479,10 +442,11 @@ mi_cmd_var_info_type (char *command, char **argv, int argc) if (argc != 1) error (_("-var-info-type: Usage: NAME.")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); - ui_out_field_string (uiout, "type", varobj_get_type (var)); + std::string type_name = varobj_get_type (var); + uiout->field_string ("type", type_name.c_str ()); } void @@ -490,7 +454,6 @@ mi_cmd_var_info_path_expression (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - char *path_expr; if (argc != 1) error (_("Usage: NAME.")); @@ -498,28 +461,30 @@ mi_cmd_var_info_path_expression (char *command, char **argv, int argc) /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); - path_expr = varobj_get_path_expr (var); + const char *path_expr = varobj_get_path_expr (var); - ui_out_field_string (uiout, "path_expr", path_expr); + uiout->field_string ("path_expr", path_expr); } void mi_cmd_var_info_expression (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; - enum varobj_languages lang; + const struct language_defn *lang; struct varobj *var; if (argc != 1) error (_("-var-info-expression: Usage: NAME.")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); lang = varobj_get_language (var); - ui_out_field_string (uiout, "lang", varobj_language_string[(int) lang]); - ui_out_field_string (uiout, "exp", varobj_get_expression (var)); + uiout->field_string ("lang", lang->la_natural_name); + + std::string exp = varobj_get_expression (var); + uiout->field_string ("exp", exp.c_str ()); } void @@ -543,7 +508,7 @@ mi_cmd_var_show_attributes (char *command, char **argv, int argc) else attstr = "noneditable"; - ui_out_field_string (uiout, "attr", attstr); + uiout->field_string ("attr", attstr); } void @@ -558,16 +523,16 @@ mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) char *oarg; enum opt - { - OP_FORMAT - }; - static const struct mi_opt opts[] = { - {"f", OP_FORMAT, 1}, - { 0, 0, 0 } + OP_FORMAT }; + static const struct mi_opt opts[] = + { + {"f", OP_FORMAT, 1}, + { 0, 0, 0 } + }; - /* Parse arguments */ + /* Parse arguments. */ format = FORMAT_NATURAL; formatFound = 0; oind = 0; @@ -579,7 +544,7 @@ mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) if (opt < 0) break; switch ((enum opt) opt) - { + { case OP_FORMAT: if (formatFound) error (_("Cannot specify format more than once")); @@ -587,7 +552,7 @@ mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) format = mi_parse_format (oarg); formatFound = 1; break; - } + } } if (oind >= argc) @@ -596,22 +561,20 @@ mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) if (oind < argc - 1) error (_("Garbage at end of command")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[oind]); if (formatFound) { - char *val = varobj_get_formatted_value (var, format); + std::string val = varobj_get_formatted_value (var, format); - ui_out_field_string (uiout, "value", val); - xfree (val); + uiout->field_string ("value", val.c_str ()); } else { - char *val = varobj_get_value (var); + std::string val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + uiout->field_string ("value", val.c_str ()); } } @@ -620,26 +583,29 @@ mi_cmd_var_assign (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - char *expression, *val; if (argc != 2) error (_("-var-assign: Usage: NAME EXPRESSION.")); - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); if (!varobj_editable_p (var)) error (_("-var-assign: Variable object is not editable")); - expression = xstrdup (argv[1]); + const char *expression = argv[1]; + + /* MI command '-var-assign' may write memory, so suppress memory + changed notification if it does. */ + scoped_restore save_suppress + = make_scoped_restore (&mi_suppress_notification.memory, 1); if (!varobj_set_value (var, expression)) error (_("-var-assign: Could not assign " "expression to variable object")); - val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + std::string val = varobj_get_value (var); + uiout->field_string ("value", val.c_str ()); } /* Type used for parameters passing to mi_cmd_var_update_iter. */ @@ -655,16 +621,18 @@ struct mi_cmd_var_update static void mi_cmd_var_update_iter (struct varobj *var, void *data_pointer) { - struct mi_cmd_var_update *data = data_pointer; + struct mi_cmd_var_update *data = (struct mi_cmd_var_update *) data_pointer; int thread_id, thread_stopped; thread_id = varobj_get_thread_id (var); - if (thread_id == -1 && is_stopped (inferior_ptid)) + if (thread_id == -1 + && (ptid_equal (inferior_ptid, null_ptid) + || is_stopped (inferior_ptid))) thread_stopped = 1; else { - struct thread_info *tp = find_thread_id (thread_id); + struct thread_info *tp = find_thread_global_id (thread_id); if (tp) thread_stopped = is_stopped (tp->ptid); @@ -672,9 +640,9 @@ mi_cmd_var_update_iter (struct varobj *var, void *data_pointer) thread_stopped = 1; } - if (thread_stopped) - if (!data->only_floating || varobj_floating_p (var)) - varobj_update_one (var, data->print_values, 0 /* implicit */); + if (thread_stopped + && (!data->only_floating || varobj_floating_p (var))) + varobj_update_one (var, data->print_values, 0 /* implicit */); } void @@ -691,10 +659,10 @@ mi_cmd_var_update (char *command, char **argv, int argc) if (argc == 1) name = argv[0]; else - name = (argv[1]); + name = argv[1]; if (argc == 2) - print_values = mi_parse_values_option (argv[0]); + print_values = mi_parse_print_values (argv[0]); else print_values = PRINT_NO_VALUES; @@ -703,25 +671,25 @@ mi_cmd_var_update (char *command, char **argv, int argc) else cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist"); - /* Check if the parameter is a "*" which means that we want - to update all variables */ + /* Check if the parameter is a "*", which means that we want to + update all variables. */ if ((*name == '*' || *name == '@') && (*(name + 1) == '\0')) { struct mi_cmd_var_update data; - data.only_floating = *name == '@'; + data.only_floating = (*name == '@'); data.print_values = print_values; - /* varobj_update_one automatically updates all the children of VAROBJ. - Therefore update each VAROBJ only once by iterating only the root - VAROBJs. */ + /* varobj_update_one automatically updates all the children of + VAROBJ. Therefore update each VAROBJ only once by iterating + only the root VAROBJs. */ all_root_varobjs (mi_cmd_var_update_iter, &data); } else { - /* Get varobj handle, if a valid var obj name was specified */ + /* Get varobj handle, if a valid var obj name was specified. */ struct varobj *var = varobj_get_handle (name); varobj_update_one (var, print_values, 1 /* explicit */); @@ -734,82 +702,81 @@ mi_cmd_var_update (char *command, char **argv, int argc) static void varobj_update_one (struct varobj *var, enum print_values print_values, - int explicit) + int is_explicit) { struct ui_out *uiout = current_uiout; - struct cleanup *cleanup = NULL; VEC (varobj_update_result) *changes; varobj_update_result *r; int i; - changes = varobj_update (&var, explicit); + changes = varobj_update (&var, is_explicit); for (i = 0; VEC_iterate (varobj_update_result, changes, i, r); ++i) { - char *display_hint; int from, to; + struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); if (mi_version (uiout) > 1) - cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); - ui_out_field_string (uiout, "name", varobj_get_objname (r->varobj)); + make_cleanup_ui_out_tuple_begin_end (uiout, NULL); + uiout->field_string ("name", varobj_get_objname (r->varobj)); switch (r->status) { case VAROBJ_IN_SCOPE: if (mi_print_value_p (r->varobj, print_values)) { - char *val = varobj_get_value (r->varobj); + std::string val = varobj_get_value (r->varobj); - ui_out_field_string (uiout, "value", val); - xfree (val); + uiout->field_string ("value", val.c_str ()); } - ui_out_field_string (uiout, "in_scope", "true"); + uiout->field_string ("in_scope", "true"); break; case VAROBJ_NOT_IN_SCOPE: - ui_out_field_string (uiout, "in_scope", "false"); + uiout->field_string ("in_scope", "false"); break; case VAROBJ_INVALID: - ui_out_field_string (uiout, "in_scope", "invalid"); + uiout->field_string ("in_scope", "invalid"); break; } if (r->status != VAROBJ_INVALID) { if (r->type_changed) - ui_out_field_string (uiout, "type_changed", "true"); + uiout->field_string ("type_changed", "true"); else - ui_out_field_string (uiout, "type_changed", "false"); + uiout->field_string ("type_changed", "false"); } if (r->type_changed) - ui_out_field_string (uiout, "new_type", varobj_get_type (r->varobj)); + { + std::string type_name = varobj_get_type (r->varobj); + + uiout->field_string ("new_type", type_name.c_str ()); + } if (r->type_changed || r->children_changed) - ui_out_field_int (uiout, "new_num_children", + uiout->field_int ("new_num_children", varobj_get_num_children (r->varobj)); - display_hint = varobj_get_display_hint (var); + gdb::unique_xmalloc_ptr display_hint + = varobj_get_display_hint (r->varobj); if (display_hint) - { - ui_out_field_string (uiout, "displayhint", display_hint); - xfree (display_hint); - } + uiout->field_string ("displayhint", display_hint.get ()); - if (varobj_pretty_printed_p (var)) - ui_out_field_int (uiout, "dynamic", 1); + if (varobj_is_dynamic_p (r->varobj)) + uiout->field_int ("dynamic", 1); varobj_get_child_range (r->varobj, &from, &to); - ui_out_field_int (uiout, "has_more", - varobj_has_more (r->varobj, to)); + uiout->field_int ("has_more", varobj_has_more (r->varobj, to)); - if (r->new) + if (r->newobj) { int j; varobj_p child; struct cleanup *cleanup; cleanup = make_cleanup_ui_out_list_begin_end (uiout, "new_children"); - for (j = 0; VEC_iterate (varobj_p, r->new, j, child); ++j) + for (j = 0; VEC_iterate (varobj_p, r->newobj, j, child); ++j) { struct cleanup *cleanup_child; @@ -820,12 +787,11 @@ varobj_update_one (struct varobj *var, enum print_values print_values, } do_cleanups (cleanup); - VEC_free (varobj_p, r->new); - r->new = NULL; /* Paranoia. */ + VEC_free (varobj_p, r->newobj); + r->newobj = NULL; /* Paranoia. */ } - if (mi_version (uiout) > 1) - do_cleanups (cleanup); + do_cleanups (cleanup); } VEC_free (varobj_update_result, changes); } @@ -835,6 +801,7 @@ mi_cmd_enable_pretty_printing (char *command, char **argv, int argc) { if (argc != 0) error (_("-enable-pretty-printing: no arguments allowed")); + varobj_enable_pretty_printing (); }