From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com [IPv6:2a00:1450:4864:20::62d]) by sourceware.org (Postfix) with ESMTPS id AF4FE3858291 for ; Thu, 1 Dec 2022 13:41:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org AF4FE3858291 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=undo.io Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=undo.io Received: by mail-ej1-x62d.google.com with SMTP id ud5so4299484ejc.4 for ; Thu, 01 Dec 2022 05:41:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=undo.io; s=google2; h=content-transfer-encoding:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=L89E+t2c2NCqW6CM+INuzbOrw4u6rKPb2iKSr2xjNZQ=; b=GhgO56s/yz9JiZK9K0QoGifPe3pFgCTU7dp9vuGSfU37YvDwoSVxIFQgeMNw1DOzRo aNLdjwsnGoo+2DPTTm2ZxPPUmxb9TMQVvVzZN/0O/7NIKNkzi6rzkpQESBId8RcllcB1 PmhyYJ72bEojYpbOiiwbkjREMrKpTrmcTQplBwJAZ0rsvu4RuTvNu7xkepW8t5wX2mBD /lT5M0EiPZL2Aqyj00/TpyE61HAQquUqfNX8TxeFMrtj+7VSfOQiqSooVdXqSAb81Odf TmDviTLsRPRGR3O44CxctWQLzkPePWCWeJlQnxQCiVbtPjbDwWRWRLD1A9t4g3YaF33V m6Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=L89E+t2c2NCqW6CM+INuzbOrw4u6rKPb2iKSr2xjNZQ=; b=kULdIr6Pm75rX/4YEuMpHa5cQFPt8dMirC1vmWIAjWLXKrl+N9k+wkr5qtGii+A1B9 xfToM+a/3tFfSGxCwUCA1q0fIt785YsWaEU/hixeND/oXLFnAnoAf4S9aQ0VqawN6BM/ wn8eRrNj1dYACmIJBK4dvhZoIlnLtlVmmtjozQfnzXvioR6jii4DpEcX1W9lUK3CtVcc 0IbAaNS1+Prn8s7memeSxibImxZyD/Vr7vp4Sj+nM/1qw/dB/7Z9pQqBfDPSDW7yTpJF OM7i57EBbe6VmfSC5vGFYoQK/hb62ujUP5xBpFdxT7xewvA7HT378Vw+RFQeuMVb5E7e 45VA== X-Gm-Message-State: ANoB5pn68JCogTC/ICQ2FxBuVMlDW9/ymfb+fYwEkI1tmZZP6eqhj0o4 55n7tDgioMhdp+DMkXpDLL8sWHHcpE/wU4ob6kznBrZLG8g= X-Google-Smtp-Source: AA0mqf4Zxt6Z5LczfAiO2zSIQbDl6dOgGRBlvhjOH9b+fhJkVz1sfcffhybPq9akDlMHYfQM7FN6OqrZhPiBIkeb8LE= X-Received: by 2002:a17:906:9c87:b0:7b2:e875:626b with SMTP id fj7-20020a1709069c8700b007b2e875626bmr5187812ejc.373.1669902088885; Thu, 01 Dec 2022 05:41:28 -0800 (PST) MIME-Version: 1.0 References: <87fsftateu.fsf@redhat.com> <20221020174702.514681-1-grees@undo.io> In-Reply-To: From: Gareth Rees Date: Thu, 1 Dec 2022 13:41:17 +0000 Message-ID: Subject: Re: [PING] [PATCH v5] [PR mi/29554] New PRINT-VALUES option '--scalar-values'. To: gdb-patches@sourceware.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-10.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Is there anything I can do to help progress this? On Thu, 3 Nov 2022 at 16:20, Gareth Rees wrote: > > After four rounds of review, this must be getting close to being > mergeable! But do let me know if there's anything else that I need to > improve here. > > > On Thu, 20 Oct 2022 at 18:47, Gareth Rees wrote: > > > > SUMMARY > > > > The '--simple-values' argument to '-stack-list-arguments' and similar > > GDB/MI commands does not take reference types into account, so that > > references to arbitrarily large structures are considered "simple" and > > printed. This means that the '--simple-values' argument cannot be used > > by IDEs when tracing the stack due to the time taken to print large > > structures passed by reference. > > > > DETAILS > > > > Various GDB/MI commands ('-stack-list-arguments', '-stack-list-locals', > > '-stack-list-variables' and so on) take a PRINT-VALUES argument which > > may be '--no-values' (0), '--all-values' (1) or '--simple-values' (2). > > In the '--simple-values' case, the command is supposed to print the > > name, type, and value of variables with simple types, and print only th= e > > name and type of variables with compound types. > > > > The '--simple-values' argument ought to be suitable for IDEs that need > > to update their user interface with the program's call stack every time > > the program stops. However, it does not take C++ reference types into > > account, and this makes the argument unsuitable for this purpose. > > > > For example, consider the following C++ program: > > > > struct s { > > int v[10]; > > }; > > > > int > > sum(const struct s &s) > > { > > int total =3D 0; > > for (int i =3D 0; i < 10; ++i) total +=3D s.v[i]; > > return total; > > } > > > > int > > main(void) > > { > > struct s s =3D { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } }; > > return sum(s); > > } > > > > If we start GDB in MI mode and continue to 'sum', the behaviour of > > '-stack-list-arguments' is as follows: > > > > (gdb) > > -stack-list-arguments --simple-values > > ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"s",type= =3D"const s &",value=3D"@0x7fffffffe310: {v =3D {1, 2, 3, 4, 5, 6, 7, 8, 9,= 10}}"}]},frame=3D{level=3D"1",args=3D[]}] > > > > Note that the value of the argument 's' was printed, even though 's' is > > a reference to a structure, which is not a simple value. > > > > See https://github.com/microsoft/MIEngine/pull/673 for a case where thi= s > > behaviour caused Microsoft to avoid the use of '--simple-values' in > > their MIEngine debug adapter, because it caused Visual Studio Code to > > take too long to refresh the call stack in the user interface. > > > > SOLUTIONS > > > > There are two ways we could fix this problem, depending on whether we > > consider the current behaviour to be a bug that can be fixed. > > > > 1. If the current behaviour is a bug that can be fixed, then we can > > update the behaviour of '--simple-values' so that it takes > > reference types into account: that is, a value is simple if it is > > neither an array, struct, or union, nor a reference to an array, > > struct or union. > > > > In this case we must add a feature to the '-list-features' command s= o > > that IDEs can detect that it is safe to use the '--simple-values' > > argument when refreshing the call stack. > > > > 2. If the current behaviour is not a bug, or cannot be changed due to > > backwards compatibility concerns, then we can add a new option for > > the PRINT-VALUES argument, for example, '--scalar-values' (3), that > > would be suitable for use by IDEs. > > > > In this case we must add a feature to the '-list-features' command s= o > > that IDEs can detect that the '--scalar-values' argument is > > available for use when refreshing the call stack. > > > > PATCH > > > > This patch implements solution (2), adding a '--scalar-values' option > > for the PRINT-VALUES argument to '-stack-list-arguments' and similar > > commands. This option prints the value only for scalars and so matches > > the behaviour of the 'scalars' argument to the 'set print > > frame-arguments' command. References to structures are not scalars, > > and so the option is suitable for use by IDEs. > > > > Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=3D29554 > > --- > > gdb/NEWS | 9 +++ > > gdb/doc/gdb.texinfo | 59 ++++++++++------- > > gdb/extension.h | 3 + > > gdb/mi/mi-cmd-stack.c | 16 ++--- > > gdb/mi/mi-cmd-var.c | 45 ++++++++++--- > > gdb/mi/mi-cmds.h | 17 ++++- > > gdb/mi/mi-main.c | 35 ++++------- > > gdb/mi/mi-parse.c | 8 ++- > > gdb/python/py-framefilter.c | 40 ++++++------ > > gdb/testsuite/gdb.mi/mi-stack.exp | 37 ++++++++++- > > gdb/testsuite/gdb.mi/print-values.cc | 63 +++++++++++++++++++ > > gdb/testsuite/gdb.mi/print-values.exp | 53 ++++++++++++++++ > > .../gdb.python/py-framefilter-mi.exp | 28 +++++++++ > > 13 files changed, 323 insertions(+), 90 deletions(-) > > create mode 100644 gdb/testsuite/gdb.mi/print-values.cc > > create mode 100644 gdb/testsuite/gdb.mi/print-values.exp > > > > diff --git a/gdb/NEWS b/gdb/NEWS > > index dee0ac2ecd8..9ad441691ea 100644 > > --- a/gdb/NEWS > > +++ b/gdb/NEWS > > @@ -114,6 +114,15 @@ maintenance info line-table > > entry corresponds to an address where a breakpoint should be placed > > to be at the first instruction past a function's prologue. > > > > +* MI changes > > + > > + ** The '-stack-list-arguments', '-stack-list-locals', > > + '-stack-list-variables', and '-var-list-children' commands > > + support the '--scalar-values' option, which requests the command > > + to print values only for scalar types. Support for this feature > > + can be verified by using the '-list-features' command, which > > + now includes "scalar-values". > > + > > * New targets > > > > GNU/Linux/LoongArch (gdbserver) loongarch*-*-linux* > > diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo > > index 238a49b027d..b2b53de1022 100644 > > --- a/gdb/doc/gdb.texinfo > > +++ b/gdb/doc/gdb.texinfo > > @@ -33326,12 +33326,14 @@ larger than the actual number of frames. On = the other hand, > > @var{high-frame} may be larger than the actual number of frames, in > > which case only existing frames will be returned. > > > > -If @var{print-values} is 0 or @code{--no-values}, print only the names= of > > -the variables; if it is 1 or @code{--all-values}, print also their > > -values; and if it is 2 or @code{--simple-values}, print the name, > > -type and value for simple data types, and the name and type for arrays= , > > -structures and unions. If the option @code{--no-frame-filters} is > > -supplied, then Python frame filters will not be executed. > > +If @var{print-values} is 0 or @code{--no-values}, print only the names > > +of the variables; if it is 1 or @code{--all-values}, print also their > > +values; if it is 2 or @code{--simple-values}, print the name, type and > > +value for simple data types, and the name and type for arrays, > > +structures and unions; and if it is 3 or @code{--scalar-values}, print > > +the name, type and value for scalar data types, and the name and type > > +otherwise. If the option @code{--no-frame-filters} is supplied, then > > +Python frame filters will not be executed. > > > > If the @code{--skip-unavailable} option is specified, arguments that > > are not available are not listed. Partially available arguments > > @@ -33549,13 +33551,15 @@ Show a single frame: > > Display the local variable names for the selected frame. If > > @var{print-values} is 0 or @code{--no-values}, print only the names of > > the variables; if it is 1 or @code{--all-values}, print also their > > -values; and if it is 2 or @code{--simple-values}, print the name, > > -type and value for simple data types, and the name and type for arrays= , > > -structures and unions. In this last case, a frontend can immediately > > -display the value of simple data types and create variable objects for > > -other data types when the user wishes to explore their values in > > -more detail. If the option @code{--no-frame-filters} is supplied, the= n > > -Python frame filters will not be executed. > > +values; if it is 2 or @code{--simple-values}, print the name, type and > > +value for simple data types, and the name and type for arrays, > > +structures and unions; and if it is 3 or @code{--scalar-values}, print > > +the name, type and value for scalar data types, and the name and type > > +otherwise. In the last two cases, a frontend can immediately display > > +the value of simple or scalar data types and create variable objects > > +for other data types when the user wishes to explore their values in > > +more detail. If the option @code{--no-frame-filters} is supplied, > > +then Python frame filters will not be executed. > > > > If the @code{--skip-unavailable} option is specified, local variables > > that are not available are not listed. Partially available local > > @@ -33594,13 +33598,16 @@ This command is deprecated in favor of the > > -stack-list-variables [ --no-frame-filters ] [ --skip-unavailable ] @= var{print-values} > > @end smallexample > > > > -Display the names of local variables and function arguments for the se= lected frame. If > > -@var{print-values} is 0 or @code{--no-values}, print only the names of > > -the variables; if it is 1 or @code{--all-values}, print also their > > -values; and if it is 2 or @code{--simple-values}, print the name, > > -type and value for simple data types, and the name and type for arrays= , > > -structures and unions. If the option @code{--no-frame-filters} is > > -supplied, then Python frame filters will not be executed. > > +Display the names of local variables and function arguments for the > > +selected frame. If @var{print-values} is 0 or @code{--no-values}, > > +print only the names of the variables; if it is 1 or > > +@code{--all-values}, print also their values; if it is 2 or > > +@code{--simple-values}, print the name, type and value for simple data > > +types, and the name and type for arrays, structures and unions; and if > > +it is 3 or @code{--scalar-values}, print the name, type and value for > > +scalar data types, and the name and type otherwise. If the option > > +@code{--no-frame-filters} is supplied, then Python frame filters will > > +not be executed. > > > > If the @code{--skip-unavailable} option is specified, local variables > > and arguments that are not available are not listed. Partially > > @@ -34029,9 +34036,10 @@ create variable objects for them, if they do n= ot already exist. With > > a single argument or if @var{print-values} has a value of 0 or > > @code{--no-values}, print only the names of the variables; if > > @var{print-values} is 1 or @code{--all-values}, also print their > > -values; and if it is 2 or @code{--simple-values} print the name and > > -value for simple data types and just the name for arrays, structures > > -and unions. > > +values; if it is 2 or @code{--simple-values} print the name and value > > +for simple data types and just the name for arrays, structures and > > +unions; and if it is 3 or @code{--scalar-values}, print the name and > > +value for scalar data types, and just the name otherwise. > > > > @var{from} and @var{to}, if specified, indicate the range of children > > to report. If @var{from} or @var{to} is less than zero, the range is > > @@ -37295,6 +37303,11 @@ option (@pxref{GDB/MI Program Execution}). > > @item data-disassemble-a-option > > Indicates that the @code{-data-disassemble} command supports the @opti= on{-a} > > option (@pxref{GDB/MI Data Manipulation}). > > +@item scalar-values > > +Indicates that the @code{-stack-list-arguments}, > > +@code{-stack-list-locals}, @code{-stack-list-variables}, and > > +@code{-var-list-children} commands support the > > +@option{--scalar-values} option (@pxref{GDB/MI Stack Manipulation}). > > @end ftable > > > > @subheading The @code{-list-target-features} Command > > diff --git a/gdb/extension.h b/gdb/extension.h > > index 47839ea50be..16d12f00f41 100644 > > --- a/gdb/extension.h > > +++ b/gdb/extension.h > > @@ -121,6 +121,9 @@ enum ext_lang_frame_args > > arguments when invoked from the MI. */ > > MI_PRINT_SIMPLE_VALUES =3D PRINT_SIMPLE_VALUES, > > > > + /* Print only scalar values for arguments when invoked from the MI= . */ > > + MI_PRINT_SCALAR_VALUES =3D PRINT_SCALAR_VALUES, > > + > > /* Print only scalar values for arguments when invoked from the CL= I. */ > > CLI_SCALAR_VALUES, > > > > diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c > > index 0fe204dbc66..43eea32e460 100644 > > --- a/gdb/mi/mi-cmd-stack.c > > +++ b/gdb/mi/mi-cmd-stack.c > > @@ -494,6 +494,7 @@ list_arg_or_local (const struct frame_arg *arg, enu= m what_to_list what, > > gdb_assert ((values =3D=3D PRINT_NO_VALUES && arg->val =3D=3D NULL > > && arg->error =3D=3D NULL) > > || values =3D=3D PRINT_SIMPLE_VALUES > > + || values =3D=3D PRINT_SCALAR_VALUES > > || (values =3D=3D PRINT_ALL_VALUES > > && (arg->val !=3D NULL || arg->error !=3D NULL))); > > gdb_assert (arg->entry_kind =3D=3D print_entry_values_no > > @@ -525,7 +526,8 @@ list_arg_or_local (const struct frame_arg *arg, enu= m what_to_list what, > > if (what =3D=3D all && arg->sym->is_argument ()) > > uiout->field_signed ("arg", 1); > > > > - if (values =3D=3D PRINT_SIMPLE_VALUES) > > + if (values =3D=3D PRINT_SIMPLE_VALUES > > + || values =3D=3D PRINT_SCALAR_VALUES) > > { > > check_typedef (arg->sym->type ()); > > type_print (arg->sym->type (), "", &stb, -1); > > @@ -571,7 +573,6 @@ list_args_or_locals (const frame_print_options &fp_= opts, > > const struct block *block; > > struct symbol *sym; > > struct block_iterator iter; > > - struct type *type; > > const char *name_of_result; > > struct ui_out *uiout =3D current_uiout; > > > > @@ -647,21 +648,12 @@ list_args_or_locals (const frame_print_options &f= p_opts, > > entryarg.sym =3D sym2; > > entryarg.entry_kind =3D print_entry_values_no; > > > > - switch (values) > > + if (mi_print_type_p (sym->type (), values)) > > { > > - case PRINT_SIMPLE_VALUES: > > - type =3D check_typedef (sym2->type ()); > > - if (type->code () !=3D TYPE_CODE_ARRAY > > - && type->code () !=3D TYPE_CODE_STRUCT > > - && type->code () !=3D TYPE_CODE_UNION) > > - { > > - case PRINT_ALL_VALUES: > > if (sym->is_argument ()) > > read_frame_arg (fp_opts, sym2, fi, &arg, &entryarg)= ; > > else > > read_frame_local (sym2, fi, &arg); > > - } > > - break; > > } > > > > if (arg.entry_kind !=3D print_entry_values_only) > > diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c > > index 3db09cf7815..1d4d3ec8534 100644 > > --- a/gdb/mi/mi-cmd-var.c > > +++ b/gdb/mi/mi-cmd-var.c > > @@ -32,6 +32,7 @@ > > #include "mi-parse.h" > > #include "gdbsupport/gdb_optional.h" > > #include "inferior.h" > > +#include "valprint.h" > > > > static void varobj_update_one (struct varobj *var, > > enum print_values print_values, > > @@ -314,6 +315,40 @@ mi_cmd_var_info_num_children (const char *command,= char **argv, int argc) > > uiout->field_signed ("numchild", varobj_get_num_children (var)); > > } > > > > +/* See mi-cmds.h. */ > > + > > +bool > > +mi_simple_type_p (struct type *type) > > +{ > > + type =3D check_typedef (type); > > + switch (type->code ()) > > + { > > + case TYPE_CODE_ARRAY: > > + case TYPE_CODE_STRUCT: > > + case TYPE_CODE_UNION: > > + return false; > > + default: > > + return true; > > + } > > +} > > + > > +bool > > +mi_print_type_p (struct type *type, enum print_values print_values) > > +{ > > + switch (print_values) > > + { > > + default: > > + case PRINT_NO_VALUES: > > + return false; > > + case PRINT_ALL_VALUES: > > + return true; > > + case PRINT_SIMPLE_VALUES: > > + return mi_simple_type_p (type); > > + case PRINT_SCALAR_VALUES: > > + return val_print_scalar_type_p (type); > > + } > > +} > > + > > /* Return 1 if given the argument PRINT_VALUES we should display > > the varobj VAR. */ > > > > @@ -335,15 +370,7 @@ mi_print_value_p (struct varobj *var, enum print_v= alues print_values) > > if (type =3D=3D NULL) > > return 1; > > else > > - { > > - type =3D check_typedef (type); > > - > > - /* For PRINT_SIMPLE_VALUES, only print the value if it has a typ= e > > - and that type is not a compound type. */ > > - return (type->code () !=3D TYPE_CODE_ARRAY > > - && type->code () !=3D TYPE_CODE_STRUCT > > - && type->code () !=3D TYPE_CODE_UNION); > > - } > > + return mi_print_type_p (type, print_values); > > } > > > > void > > diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h > > index 9ffb11bf997..3a5b6b72be9 100644 > > --- a/gdb/mi/mi-cmds.h > > +++ b/gdb/mi/mi-cmds.h > > @@ -29,7 +29,8 @@ > > enum print_values { > > PRINT_NO_VALUES, > > PRINT_ALL_VALUES, > > - PRINT_SIMPLE_VALUES > > + PRINT_SIMPLE_VALUES, > > + PRINT_SCALAR_VALUES > > }; > > > > typedef void (mi_cmd_argv_ftype) (const char *command, char **argv, in= t argc); > > @@ -226,4 +227,18 @@ using remove_mi_cmd_entries_ftype > > =3D gdb::function_view; > > extern void remove_mi_cmd_entries (remove_mi_cmd_entries_ftype callbac= k); > > > > +/* Return true if TYPE is suitable for printing with PRINT_SIMPLE_VALU= ES: that > > + is, if TYPE is not an array, structure or union. > > + > > + Note that reference types are always considered simple by this func= tion, even > > + if the referenced type is non-scalar. This behaviour is retained f= or backwards > > + compatibility, and PRINT_SCALAR_VALUES may be used instead to avoid= printing > > + references to non-scalar values. */ > > + > > +extern bool mi_simple_type_p (struct type *type); > > + > > +/* Return true if TYPE is suitable for printing with PRINT_VALUES. */ > > + > > +extern bool mi_print_type_p (struct type *type, enum print_values valu= es); > > + > > #endif /* MI_MI_CMDS_H */ > > diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c > > index b758f398e2a..9bb00390370 100644 > > --- a/gdb/mi/mi-main.c > > +++ b/gdb/mi/mi-main.c > > @@ -1663,6 +1663,7 @@ mi_cmd_list_features (const char *command, char *= *argv, int argc) > > uiout->field_string (NULL, "undefined-command-error-code"); > > uiout->field_string (NULL, "exec-run-start-option"); > > uiout->field_string (NULL, "data-disassemble-a-option"); > > + uiout->field_string (NULL, "scalar-values"); > > > > if (ext_lang_initialized_p (get_ext_lang_defn (EXT_LANG_PYTHON))= ) > > uiout->field_string (NULL, "python"); > > @@ -2462,14 +2463,14 @@ static void > > print_variable_or_computed (const char *expression, enum print_values = values) > > { > > struct value *val; > > - struct type *type; > > struct ui_out *uiout =3D current_uiout; > > > > string_file stb; > > > > expression_up expr =3D parse_expression (expression); > > > > - if (values =3D=3D PRINT_SIMPLE_VALUES) > > + if (values =3D=3D PRINT_SIMPLE_VALUES > > + || values =3D=3D PRINT_SCALAR_VALUES) > > val =3D evaluate_type (expr.get ()); > > else > > val =3D evaluate_expression (expr.get ()); > > @@ -2482,31 +2483,19 @@ print_variable_or_computed (const char *express= ion, enum print_values values) > > switch (values) > > { > > case PRINT_SIMPLE_VALUES: > > - type =3D check_typedef (value_type (val)); > > + case PRINT_SCALAR_VALUES: > > type_print (value_type (val), "", &stb, -1); > > uiout->field_stream ("type", stb); > > - if (type->code () !=3D TYPE_CODE_ARRAY > > - && type->code () !=3D TYPE_CODE_STRUCT > > - && type->code () !=3D TYPE_CODE_UNION) > > - { > > - struct value_print_options opts; > > - > > - get_no_prettyformat_print_options (&opts); > > - opts.deref_ref =3D 1; > > - common_val_print (val, &stb, 0, &opts, current_language); > > - uiout->field_stream ("value", stb); > > - } > > break; > > - case PRINT_ALL_VALUES: > > - { > > - struct value_print_options opts; > > + } > > > > - get_no_prettyformat_print_options (&opts); > > - opts.deref_ref =3D 1; > > - common_val_print (val, &stb, 0, &opts, current_language); > > - uiout->field_stream ("value", stb); > > - } > > - break; > > + if (mi_print_type_p (value_type (val), values)) > > + { > > + struct value_print_options opts; > > + get_no_prettyformat_print_options (&opts); > > + opts.deref_ref =3D 1; > > + common_val_print (val, &stb, 0, &opts, current_language); > > + uiout->field_stream ("value", stb); > > } > > } > > > > diff --git a/gdb/mi/mi-parse.c b/gdb/mi/mi-parse.c > > index dfa7b462714..dd70e4648a1 100644 > > --- a/gdb/mi/mi-parse.c > > +++ b/gdb/mi/mi-parse.c > > @@ -29,6 +29,7 @@ > > #include "language.h" > > > > static const char mi_no_values[] =3D "--no-values"; > > +static const char mi_scalar_values[] =3D "--scalar-values"; > > static const char mi_simple_values[] =3D "--simple-values"; > > static const char mi_all_values[] =3D "--all-values"; > > > > @@ -383,8 +384,11 @@ mi_parse_print_values (const char *name) > > else if (strcmp (name, "2") =3D=3D 0 > > || strcmp (name, mi_simple_values) =3D=3D 0) > > return PRINT_SIMPLE_VALUES; > > + else if (strcmp (name, "3") =3D=3D 0 > > + || strcmp (name, mi_scalar_values) =3D=3D 0) > > + return PRINT_SCALAR_VALUES; > > else > > error (_("Unknown value for PRINT_VALUES: must be: \ > > -0 or \"%s\", 1 or \"%s\", 2 or \"%s\""), > > - mi_no_values, mi_all_values, mi_simple_values); > > +0 or \"%s\", 1 or \"%s\", 2 or \"%s\", 3 or \"%s\""), > > + mi_no_values, mi_all_values, mi_simple_values, mi_scalar_va= lues); > > } > > diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c > > index 366f3745b9d..e295036f46e 100644 > > --- a/gdb/python/py-framefilter.c > > +++ b/gdb/python/py-framefilter.c > > @@ -227,26 +227,27 @@ py_print_value (struct ui_out *out, struct value = *val, > > enum ext_lang_frame_args args_type, > > const struct language_defn *language) > > { > > - int should_print =3D 0; > > + int should_print; > > > > /* MI does not print certain values, differentiated by type, > > depending on what ARGS_TYPE indicates. Test type against option. > > For CLI print all values. */ > > - if (args_type =3D=3D MI_PRINT_SIMPLE_VALUES > > - || args_type =3D=3D MI_PRINT_ALL_VALUES) > > + switch (args_type) > > { > > - struct type *type =3D check_typedef (value_type (val)); > > - > > - if (args_type =3D=3D MI_PRINT_ALL_VALUES) > > - should_print =3D 1; > > - else if (args_type =3D=3D MI_PRINT_SIMPLE_VALUES > > - && type->code () !=3D TYPE_CODE_ARRAY > > - && type->code () !=3D TYPE_CODE_STRUCT > > - && type->code () !=3D TYPE_CODE_UNION) > > - should_print =3D 1; > > + case NO_VALUES: > > + should_print =3D 0; > > + break; > > + default: > > + case MI_PRINT_ALL_VALUES: > > + should_print =3D 1; > > + break; > > + case MI_PRINT_SIMPLE_VALUES: > > + should_print =3D mi_print_type_p (value_type (val), PRINT_SIMPLE= _VALUES); > > + break; > > + case MI_PRINT_SCALAR_VALUES: > > + should_print =3D mi_print_type_p (value_type (val), PRINT_SCALAR= _VALUES); > > + break; > > } > > - else if (args_type !=3D NO_VALUES) > > - should_print =3D 1; > > > > if (should_print) > > { > > @@ -371,10 +372,12 @@ py_print_single_arg (struct ui_out *out, > > if (print_args_field) > > out->field_signed ("arg", 1); > > > > - /* For MI print the type, but only for simple values. This seems > > - weird, but this is how MI choose to format the various output > > + /* For MI print the type, but only for simple and scalar values. Thi= s > > + seems weird, but this is how MI chooses to format the various out= put > > types. */ > > - if (args_type =3D=3D MI_PRINT_SIMPLE_VALUES && val !=3D NULL) > > + if ((args_type =3D=3D MI_PRINT_SIMPLE_VALUES > > + || args_type =3D=3D MI_PRINT_SCALAR_VALUES) > > + && val !=3D NULL) > > py_print_type (out, val); > > > > if (val !=3D NULL) > > @@ -603,7 +606,8 @@ enumerate_locals (PyObject *iter, > > out->field_string ("name", sym_name.get ()); > > out->text (" =3D "); > > > > - if (args_type =3D=3D MI_PRINT_SIMPLE_VALUES) > > + if (args_type =3D=3D MI_PRINT_SIMPLE_VALUES > > + || args_type =3D=3D MI_PRINT_SCALAR_VALUES) > > py_print_type (out, val); > > > > /* CLI always prints values for locals. MI uses the > > diff --git a/gdb/testsuite/gdb.mi/mi-stack.exp b/gdb/testsuite/gdb.mi/m= i-stack.exp > > index d04c8153c65..2c74da00c18 100644 > > --- a/gdb/testsuite/gdb.mi/mi-stack.exp > > +++ b/gdb/testsuite/gdb.mi/mi-stack.exp > > @@ -93,6 +93,11 @@ proc test_stack_args_listing {} { > > # -stack-list-arguments 1 1 1 > > # -stack-list-arguments 1 1 3 > > # -stack-list-arguments > > + # -stack-list-arguments 1 1 300 > > + # -stack-list-arguments 2 1 1 > > + # -stack-list-arguments --simple-values 1 1 > > + # -stack-list-arguments 3 1 1 > > + # -stack-list-arguments --scalar-values 1 1 > > > > mi_gdb_test "231-stack-list-arguments 0" \ > > "231\\^done,stack-args=3D\\\[frame=3D\{level=3D\"0\",args=3D\\\= [\\\]\},frame=3D\{level=3D\"1\",args=3D\\\[name=3D\"strarg\"\\\]\},frame=3D= \{level=3D\"2\",args=3D\\\[name=3D\"intarg\",name=3D\"strarg\"\\\]\},frame= =3D\{level=3D\"3\",args=3D\\\[name=3D\"intarg\",name=3D\"strarg\",name=3D\"= fltarg\"\\\]\},frame=3D\{level=3D\"4\",args=3D\\\[\\\]\}\\\]" \ > > @@ -125,6 +130,22 @@ proc test_stack_args_listing {} { > > mi_gdb_test "235-stack-list-arguments 1 1 300" \ > > "235\\^done,stack-args=3D\\\[frame=3D\{level=3D\"1\",args=3D\\\= [\{name=3D\"strarg\",value=3D\"$hex \\\\\"A string argument.\\\\\"\"\}\\\]\= },frame=3D\{level=3D\"2\",args=3D\\\[\{name=3D\"intarg\",value=3D\"2\"\},\{= name=3D\"strarg\",value=3D\"$hex \\\\\"A string argument.\\\\\"\"\}\\\]\},f= rame=3D\{level=3D\"3\",args=3D\\\[\{name=3D\"intarg\",value=3D\"2\"\},\{nam= e=3D\"strarg\",value=3D\"$hex \\\\\"A string argument.\\\\\"\"\},\{name=3D\= "fltarg\",value=3D\"3.5\"\}\\\]\},frame=3D\{level=3D\"4\",args=3D\\\[\\\]\}= \\\]" \ > > "stack args listing 1 1 300" > > + > > + mi_gdb_test "236-stack-list-arguments 2 1 1" \ > > + "236\\^done,stack-args=3D\\\[frame=3D\\{level=3D\"1\",args=3D\\= \[\\{name=3D\"strarg\",type=3D\"char \\*\",value=3D\"$hex \\\\\"A string ar= gument.\\\\\"\"\\}\\\]\\}\\\]" \ > > + "stack args listing 2 1 1" > > + > > + mi_gdb_test "237-stack-list-arguments --simple-values 1 1" \ > > + "237\\^done,stack-args=3D\\\[frame=3D\\{level=3D\"1\",args=3D\\= \[\\{name=3D\"strarg\",type=3D\"char \\*\",value=3D\"$hex \\\\\"A string ar= gument.\\\\\"\"\\}\\\]\\}\\\]" \ > > + "stack args listing --simple-values 1 1" > > + > > + mi_gdb_test "238-stack-list-arguments 3 1 1" \ > > + "238\\^done,stack-args=3D\\\[frame=3D\\{level=3D\"1\",args=3D\\= \[\\{name=3D\"strarg\",type=3D\"char \\*\",value=3D\"$hex \\\\\"A string ar= gument.\\\\\"\"\\}\\\]\\}\\\]" \ > > + "stack args listing 3 1 1" > > + > > + mi_gdb_test "239-stack-list-arguments --scalar-values 1 1" \ > > + "239\\^done,stack-args=3D\\\[frame=3D\\{level=3D\"1\",args=3D\\= \[\\{name=3D\"strarg\",type=3D\"char \\*\",value=3D\"$hex \\\\\"A string ar= gument.\\\\\"\"\\}\\\]\\}\\\]" \ > > + "stack args listing --scalar-values 1 1" > > } > > > > proc test_stack_info_depth {} { > > @@ -163,7 +184,7 @@ proc test_stack_locals_listing {} { > > # -stack-list-locals 0 (--no-values) > > # -stack-list-locals 1 (--all-values) > > # -stack-list-locals 2 (--simple-values) > > - # -stack-list-arguments > > + # -stack-list-locals 3 (--scalar-values) > > > > mi_gdb_test "232-stack-list-locals 0" \ > > "232\\^done,locals=3D\\\[name=3D\"A\",name=3D\"B\",name=3D\"C\"= ,name=3D\"D\"\\\]" \ > > @@ -179,10 +200,22 @@ proc test_stack_locals_listing {} { > > "232\\^done,locals=3D\\\[\{name=3D\"A\",value=3D\"1\"\},\{name= =3D\"B\",value=3D\"2\"\},\{name=3D\"C\",value=3D\"3\"\},\{name=3D\"D\",valu= e=3D\"\\{0, 1, 2\\}\"\}\\\]" \ > > "stack locals listing of names and values" > > > > - mi_gdb_test "232-stack-list-locals --simple-values" \ > > + mi_gdb_test "232-stack-list-locals 2" \ > > "232\\^done,locals=3D\\\[\{name=3D\"A\",type=3D\"int\",value=3D= \"1\"\},\{name=3D\"B\",type=3D\"int\",value=3D\"2\"\},\{name=3D\"C\",type= =3D\"int\",value=3D\"3\"\},\{name=3D\"D\",type=3D\"int \\\[3\\\]\"\}\\\]" \ > > "stack locals listing, simple types: names and values, complex = type: names and types" > > > > + mi_gdb_test "232-stack-list-locals --simple-values" \ > > + "232\\^done,locals=3D\\\[\\{name=3D\"A\",type=3D\"int\",value= =3D\"1\"\\},\\{name=3D\"B\",type=3D\"int\",value=3D\"2\"\\},\\{name=3D\"C\"= ,type=3D\"int\",value=3D\"3\"\\},\\{name=3D\"D\",type=3D\"int \\\[3\\\]\"\\= }\\\]" \ > > + "stack locals listing with --simple-values" > > + > > + mi_gdb_test "233-stack-list-locals 3" \ > > + "233\\^done,locals=3D\\\[\\{name=3D\"A\",type=3D\"int\",value= =3D\"1\"\\},\\{name=3D\"B\",type=3D\"int\",value=3D\"2\"\\},\\{name=3D\"C\"= ,type=3D\"int\",value=3D\"3\"\\},\\{name=3D\"D\",type=3D\"int \\\[3\\\]\"\\= }\\\]" \ > > + "stack locals listing, scalar types: names and values, otherwis= e: names and types" > > + > > + mi_gdb_test "233-stack-list-locals --scalar-values" \ > > + "233\\^done,locals=3D\\\[\\{name=3D\"A\",type=3D\"int\",value= =3D\"1\"\\},\\{name=3D\"B\",type=3D\"int\",value=3D\"2\"\\},\\{name=3D\"C\"= ,type=3D\"int\",value=3D\"3\"\\},\\{name=3D\"D\",type=3D\"int \\\[3\\\]\"\\= }\\\]" \ > > + "stack locals listing with --scalar-values" > > + > > mi_gdb_test "234-stack-list-locals" \ > > "234\\^error,msg=3D\"-stack-list-locals: Usage.*PRINT_VALUES.*\= "" \ > > "stack locals listing wrong" > > diff --git a/gdb/testsuite/gdb.mi/print-values.cc b/gdb/testsuite/gdb.m= i/print-values.cc > > new file mode 100644 > > index 00000000000..b52683d1537 > > --- /dev/null > > +++ b/gdb/testsuite/gdb.mi/print-values.cc > > @@ -0,0 +1,63 @@ > > +/* This test case is part of GDB, the GNU debugger. > > + > > + Copyright 2022 Free Software Foundation, Inc. > > + > > + This program is free software; you can redistribute it and/or modif= y > > + it under the terms of the GNU General Public License as published b= y > > + the Free Software Foundation; either version 3 of the License, or > > + (at your option) any later version. > > + > > + This program is distributed in the hope that it will be useful, > > + but WITHOUT ANY WARRANTY; without even the implied warranty of > > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + GNU General Public License for more details. > > + > > + You should have received a copy of the GNU General Public License > > + along with this program. If not, see . */ > > + > > +/* Test program for PRINT_SIMPLE_VALUES and PRINT_SCALAR_VALUES. > > + > > + In the function f: > > + > > + * The arguments i, ir, and irr are ints or references to ints, > > + which must be printed by both PRINT_SIMPLE_VALUES and > > + PRINT_SCALAR_VALUES. > > + > > + * The arguments a, s, and u are non-scalar values, which must not > > + be printed by either PRINT_SIMPLE_VALUES or PRINT_SCALAR_VALUES. > > + > > + * The arguments ar, arr, sr, srr, ur, and urr are references to > > + non-scalar values, which must be printed by PRINT_SIMPLE_VALUES > > + but not printed by PRINT_SCALAR_VALUES. */ > > + > > +struct s > > +{ > > + int v; > > +}; > > + > > +union u > > +{ > > + int v; > > +}; > > + > > +int > > +f (int i, int &ir, int &&irr, > > + int a[1], int (&ar)[1], int (&&arr)[1], > > + struct s s, struct s &sr, struct s &&srr, > > + union u u, union u &ur, union u &&urr) > > +{ > > + return (i + ir + irr > > + + a[0] + ar[0] + arr[0] > > + + s.v + sr.v + srr.v > > + + u.v + ur.v + urr.v); > > +} > > + > > +int > > +main (void) > > +{ > > + int i =3D 1, j =3D 2; > > + int a[1] =3D { 4 }, b[1] =3D { 5 }; > > + struct s s =3D { 7 }, t =3D { 8 }; > > + union u u =3D { 10 }, v =3D { 11 }; > > + return f (i, j, 3, a, b, { 6 }, s, t, { 9 }, u, v, { 12 }); > > +} > > diff --git a/gdb/testsuite/gdb.mi/print-values.exp b/gdb/testsuite/gdb.= mi/print-values.exp > > new file mode 100644 > > index 00000000000..7896d773119 > > --- /dev/null > > +++ b/gdb/testsuite/gdb.mi/print-values.exp > > @@ -0,0 +1,53 @@ > > +# Copyright 2022 Free Software Foundation, Inc. > > +# > > +# This program is free software; you can redistribute it and/or modify > > +# it under the terms of the GNU General Public License as published by > > +# the Free Software Foundation; either version 3 of the License, or > > +# (at your option) any later version. > > +# > > +# This program is distributed in the hope that it will be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program. If not, see = . > > + > > +# Test of PRINT_SIMPLE_VALUES and PRINT_SCALAR_VALUES. > > +# > > +# Test that PRINT_SIMPLE_VALUES distinguishes scalar and non-scalar > > +# types, except for C++ reference and rvalue reference types. > > +# > > +# Test that PRINT_SCALAR_VALUES distinguishes scalar and non-scalar > > +# types, including C++ reference and rvalue reference types. > > + > > +if { [skip_cplus_tests] } { continue } > > + > > +load_lib mi-support.exp > > +standard_testfile .cc > > + > > +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable {debu= g c++}] !=3D "" } { > > + untested "failed to compile" > > + return -1 > > +} > > + > > +mi_clean_restart $binfile > > + > > +mi_runto_main > > + > > +mi_gdb_test "-break-insert f" "\\^done.*" "set breakpoint on f" > > + > > +mi_send_resuming_command "exec-continue" "exec-continue to breakpoint = on f" > > + > > +mi_expect_stop "breakpoint-hit" "f" ".*" ".*" ".*" {.* disp=3D"keep"} = \ > > + "run until breakpoint on f" > > + > > +mi_gdb_test "-stack-list-arguments --simple-values" \ > > + "\\^done,stack-args=3D\\\[frame=3D\\{level=3D\"0\",args=3D\\\[\\{n= ame=3D\"i\",type=3D\"int\",value=3D\"1\"\\},\\{name=3D\"ir\",type=3D\"int &= \",value=3D\"@$hex: 2\"\\},\\{name=3D\"irr\",type=3D\"int &&\",value=3D\"@$= hex: 3\"\\},\\{name=3D\"a\",type=3D\"int \\*\",value=3D\"$hex\"\\},\\{name= =3D\"ar\",type=3D\"int \\(&\\)\\\[1\\\]\",value=3D\"@$hex: \\{5\\}\"\\},\\{= name=3D\"arr\",type=3D\"int \\(&&\\)\\\[1\\\]\",value=3D\"@$hex: \\{6\\}\"\= \},\\{name=3D\"s\",type=3D\"s\"\\},\\{name=3D\"sr\",type=3D\"s &\",value=3D= \"@$hex: \\{v =3D 8\\}\"\\},\\{name=3D\"srr\",type=3D\"s &&\",value=3D\"@$h= ex: \\{v =3D 9\\}\"\\},\\{name=3D\"u\",type=3D\"u\"\\},\\{name=3D\"ur\",typ= e=3D\"u &\",value=3D\"@$hex: \\{v =3D 11\\}\"\\},\\{name=3D\"urr\",type=3D\= "u &&\",value=3D\"@$hex: \\{v =3D 12\\}\"\\}\\\]\\},frame=3D\\{level=3D\"1\= ",args=3D\\\[\\\]\\}\\\]" \ > > + "stack list arguments, simple types: names, types and values, othe= rwise: names and types" > > + > > +mi_gdb_test "-stack-list-arguments --scalar-values" \ > > + "\\^done,stack-args=3D\\\[frame=3D\\{level=3D\"0\",args=3D\\\[\\{n= ame=3D\"i\",type=3D\"int\",value=3D\"1\"\\},\\{name=3D\"ir\",type=3D\"int &= \",value=3D\"@$hex: 2\"\\},\\{name=3D\"irr\",type=3D\"int &&\",value=3D\"@$= hex: 3\"\\},\\{name=3D\"a\",type=3D\"int \\*\",value=3D\"$hex\"\\},\\{name= =3D\"ar\",type=3D\"int \\(&\\)\\\[1\\\]\"\\},\\{name=3D\"arr\",type=3D\"int= \\(&&\\)\\\[1\\\]\"\\},\\{name=3D\"s\",type=3D\"s\"\\},\\{name=3D\"sr\",ty= pe=3D\"s &\"\\},\\{name=3D\"srr\",type=3D\"s &&\"\\},\\{name=3D\"u\",type= =3D\"u\"\\},\\{name=3D\"ur\",type=3D\"u &\"\\},\\{name=3D\"urr\",type=3D\"u= &&\"\\}\\\]\\},frame=3D\\{level=3D\"1\",args=3D\\\[\\\]\\}\\\]" \ > > + "stack list arguments, scalar types: names, types and values, comp= ound types: names and types" > > + > > +mi_gdb_exit > > diff --git a/gdb/testsuite/gdb.python/py-framefilter-mi.exp b/gdb/tests= uite/gdb.python/py-framefilter-mi.exp > > index 344067fe4a7..fa4e559e343 100644 > > --- a/gdb/testsuite/gdb.python/py-framefilter-mi.exp > > +++ b/gdb/testsuite/gdb.python/py-framefilter-mi.exp > > @@ -120,6 +120,14 @@ mi_gdb_test "-stack-list-arguments --no-frame-filt= ers 2" \ > > "\\^done,stack-args=3D\\\[frame=3D{level=3D\"0\",args=3D\\\[{name= =3D\"foo\",type=3D\"int\",value=3D\"21\"},{name=3D\"bar\",type=3D\"char \\\= *\",value=3D\"$hex \\\\\"Param\\\\\"\"},{name=3D\"fb\",type=3D\"foobar \\\*= \",value=3D\"$hex\"},{name=3D\"bf\",type=3D\"foobar\"}\\\]},frame=3D{level= =3D\"1\",args=3D\\\[\\\]},frame=3D{level=3D\"2\",args=3D\\\[{name=3D\"j\",t= ype=3D\"int\",value=3D\"10\"}\\\]},.*frame=3D{level=3D\"22\",args=3D\\\[\\\= ]},.*frame=3D{level=3D\"26\",args=3D\\\[{name=3D\"f\",type=3D\"int\",value= =3D\"3\"},{name=3D\"d\",type=3D\"int\",value=3D\"5\"}\\\]},frame=3D{level= =3D\"27\",args=3D\\\[\\\]}\\\]" \ > > "stack-list-arguments --no-frame-filters 2" > > > > +mi_gdb_test "-stack-list-arguments 3" \ > > + "\\^done,stack-args=3D\\\[frame=3D{level=3D\"0\",args=3D\\\[{name= =3D\"foo\",type=3D\"int\",value=3D\"21\"},{name=3D\"bar\",type=3D\"char \\\= *\",value=3D\"$hex \\\\\"Param\\\\\"\"},{name=3D\"fb\",type=3D\"foobar \\\*= \",value=3D\"$hex\"},{name=3D\"bf\",type=3D\"foobar\"\}\\\]},frame=3D{level= =3D\"1\",args=3D\\\[\\\]},frame=3D{level=3D\"2\",args=3D\\\[{name=3D\"j\",t= ype=3D\"int\",value=3D\"10\"}\\\]},.*frame=3D{level=3D\"22\",args=3D\\\[\\\= ],children=3D\\\[frame=3D{level=3D\"23\",args=3D\\\[\\\]}\\\]},.*frame=3D{l= evel=3D\"26\",args=3D\\\[{name=3D\"f\",type=3D\"int\",value=3D\"3\"},{name= =3D\"d\",type=3D\"int\",value=3D\"5\"}\\\]},frame=3D{level=3D\"27\",args=3D= \\\[\\\]}\\\]" \ > > + "stack-list-arguments 3" > > + > > +mi_gdb_test "-stack-list-arguments --no-frame-filters 3" \ > > + "\\^done,stack-args=3D\\\[frame=3D{level=3D\"0\",args=3D\\\[{name= =3D\"foo\",type=3D\"int\",value=3D\"21\"},{name=3D\"bar\",type=3D\"char \\\= *\",value=3D\"$hex \\\\\"Param\\\\\"\"},{name=3D\"fb\",type=3D\"foobar \\\*= \",value=3D\"$hex\"},{name=3D\"bf\",type=3D\"foobar\"}\\\]},frame=3D{level= =3D\"1\",args=3D\\\[\\\]},frame=3D{level=3D\"2\",args=3D\\\[{name=3D\"j\",t= ype=3D\"int\",value=3D\"10\"}\\\]},.*frame=3D{level=3D\"22\",args=3D\\\[\\\= ]},.*frame=3D{level=3D\"26\",args=3D\\\[{name=3D\"f\",type=3D\"int\",value= =3D\"3\"},{name=3D\"d\",type=3D\"int\",value=3D\"5\"}\\\]},frame=3D{level= =3D\"27\",args=3D\\\[\\\]}\\\]" \ > > + "stack-list-arguments --no-frame-filters 3" > > + > > > > mi_gdb_test "-stack-list-arguments 2 0 3" \ > > "\\^done,stack-args=3D\\\[frame=3D{level=3D\"0\",args=3D\\\[{name= =3D\"foo\",type=3D\"int\",value=3D\"21\"},{name=3D\"bar\",type=3D\"char \\\= *\",value=3D\"$hex \\\\\"Param\\\\\"\"},{name=3D\"fb\",type=3D\"foobar \\\*= \",value=3D\"$hex\"},{name=3D\"bf\",type=3D\"foobar\"}\\\]},frame=3D{level= =3D\"1\",args=3D\\\[\\\]},frame=3D{level=3D\"2\",args=3D\\\[{name=3D\"j\",t= ype=3D\"int\",value=3D\"10\"}\\\]},frame=3D{level=3D\"3\",args=3D\\\[\\\]}\= \\]" \ > > @@ -133,6 +141,14 @@ mi_gdb_test "-stack-list-arguments --no-frame-filt= ers 2 22 27" \ > > "\\^done,stack-args=3D\\\[frame=3D{level=3D\"22\",args=3D\\\[\\\]}= ,frame=3D{level=3D\"23\",args=3D\\\[\\\]},.*frame=3D{level=3D\"26\",args=3D= \\\[{name=3D\"f\",type=3D\"int\",value=3D\"3\"},{name=3D\"d\",type=3D\"int\= ",value=3D\"5\"}\\\]},frame=3D{level=3D\"27\",args=3D\\\[\\\]}\\\]" \ > > "stack-list-arguments --no-frame-filters 2 22 27" > > > > +mi_gdb_test "-stack-list-arguments 3 22 27" \ > > + "\\^done,stack-args=3D\\\[frame=3D{level=3D\"22\",args=3D\\\[\\\],= children=3D\\\[frame=3D{level=3D\"23\",args=3D\\\[\\\]}\\\]},.*frame=3D{lev= el=3D\"26\",args=3D\\\[{name=3D\"f\",type=3D\"int\",value=3D\"3\"},{name=3D= \"d\",type=3D\"int\",value=3D\"5\"}\\\]},frame=3D{level=3D\"27\",args=3D\\\= [\\\]}\\\]" \ > > + "stack-list-arguments 3 22 27" > > + > > +mi_gdb_test "-stack-list-arguments --no-frame-filters 3 22 27" \ > > + "\\^done,stack-args=3D\\\[frame=3D{level=3D\"22\",args=3D\\\[\\\]}= ,frame=3D{level=3D\"23\",args=3D\\\[\\\]},.*frame=3D{level=3D\"26\",args=3D= \\\[{name=3D\"f\",type=3D\"int\",value=3D\"3\"},{name=3D\"d\",type=3D\"int\= ",value=3D\"5\"}\\\]},frame=3D{level=3D\"27\",args=3D\\\[\\\]}\\\]" \ > > + "stack-list-arguments --no-frame-filters 3 22 27" > > + > > #stack-list-locals > > mi_gdb_test "-stack-list-locals --no-frame-filters 0" \ > > "\\^done,locals=3D\\\[name=3D\"str\",name=3D\"st2\",name=3D\"b\",n= ame=3D\"c\"\\\]" \ > > @@ -146,6 +162,10 @@ mi_gdb_test "-stack-list-locals --no-frame-filters= 2" \ > > "\\^done,locals=3D\\\[{name=3D\"str\",type=3D\"const char \\\*\",v= alue=3D\"$hex \\\\\"The End\\\\\"\"},{name=3D\"st2\",type=3D\"const char \\= \*\",value=3D\"$hex \\\\\"Is Near\\\\\"\"},{name=3D\"b\",type=3D\"int\",val= ue=3D\"12\"},{name=3D\"c\",type=3D\"short\",value=3D\"5\"}\\\]" \ > > "stack-list-locals --no-frame-filters 2" > > > > +mi_gdb_test "-stack-list-locals --no-frame-filters 3" \ > > + "\\^done,locals=3D\\\[{name=3D\"str\",type=3D\"const char \\\*\",v= alue=3D\"$hex \\\\\"The End\\\\\"\"},{name=3D\"st2\",type=3D\"const char \\= \*\",value=3D\"$hex \\\\\"Is Near\\\\\"\"},{name=3D\"b\",type=3D\"int\",val= ue=3D\"12\"},{name=3D\"c\",type=3D\"short\",value=3D\"5\"}\\\]" \ > > + "stack-list-locals --no-frame-filters 3" > > + > > mi_gdb_test "-stack-list-locals --no-frame-filters --no-values" \ > > "\\^done,locals=3D\\\[name=3D\"str\",name=3D\"st2\",name=3D\"b\",n= ame=3D\"c\"\\\]" \ > > "stack-list-locals --no-frame-filters --no-values" > > @@ -158,6 +178,10 @@ mi_gdb_test "-stack-list-locals --no-frame-filters= --simple-values" \ > > "\\^done,locals=3D\\\[{name=3D\"str\",type=3D\"const char \\\*\",v= alue=3D\"$hex \\\\\"The End\\\\\"\"},{name=3D\"st2\",type=3D\"const char \\= \*\",value=3D\"$hex \\\\\"Is Near\\\\\"\"},{name=3D\"b\",type=3D\"int\",val= ue=3D\"12\"},{name=3D\"c\",type=3D\"short\",value=3D\"5\"}\\\]" \ > > "stack-list-locals --no-frame-filters --simple-values" > > > > +mi_gdb_test "-stack-list-locals --no-frame-filters --scalar-values" \ > > + "\\^done,locals=3D\\\[{name=3D\"str\",type=3D\"const char \\\*\",v= alue=3D\"$hex \\\\\"The End\\\\\"\"},{name=3D\"st2\",type=3D\"const char \\= \*\",value=3D\"$hex \\\\\"Is Near\\\\\"\"},{name=3D\"b\",type=3D\"int\",val= ue=3D\"12\"},{name=3D\"c\",type=3D\"short\",value=3D\"5\"}\\\]" \ > > + "stack-list-locals --no-frame-filters --scalar-values" > > + > > mi_gdb_test "-stack-list-locals 0" \ > > "\\^done,locals=3D\\\[name=3D\"str\",name=3D\"st2\",name=3D\"b\",n= ame=3D\"c\"\\\]" \ > > "stack-list-locals 0" > > @@ -170,6 +194,10 @@ mi_gdb_test "-stack-list-locals 2" \ > > "\\^done,locals=3D\\\[{name=3D\"str\",type=3D\"const char \\\*\",v= alue=3D\"$hex \\\\\"The End\\\\\"\"},{name=3D\"st2\",type=3D\"const char \\= \*\",value=3D\"$hex \\\\\"Is Near\\\\\"\"},{name=3D\"b\",type=3D\"int\",val= ue=3D\"12\"},{name=3D\"c\",type=3D\"short\",value=3D\"5\"}\\\]" \ > > "stack-list-locals 2" > > > > +mi_gdb_test "-stack-list-locals 3" \ > > + "\\^done,locals=3D\\\[{name=3D\"str\",type=3D\"const char \\\*\",v= alue=3D\"$hex \\\\\"The End\\\\\"\"},{name=3D\"st2\",type=3D\"const char \\= \*\",value=3D\"$hex \\\\\"Is Near\\\\\"\"},{name=3D\"b\",type=3D\"int\",val= ue=3D\"12\"},{name=3D\"c\",type=3D\"short\",value=3D\"5\"}\\\]" \ > > + "stack-list-locals 3" > > + > > # stack-list-variables > > mi_gdb_test "-stack-list-variables --no-frame-filters 0" \ > > "\\^done,variables=3D\\\[{name=3D\"foo\",arg=3D\"1\"},{name=3D\"ba= r\",arg=3D\"1\"},{name=3D\"fb\",arg=3D\"1\"},{name=3D\"bf\",arg=3D\"1\"},{n= ame=3D\"str\"},{name=3D\"st2\"},{name=3D\"b\"},{name=3D\"c\"}\\\]" \ > > -- > > 2.26.0 > >