Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Abdul Basit Ijaz <abdul.b.ijaz@intel.com>, gdb-patches@sourceware.org
Cc: pedro@palves.net, philippe.waroquiers@skynet.be,
	christina.schimpe@intel.com, lsix@lancelotsix.com, eliz@gnu.org,
	abdul.b.ijaz@intel.com, guinevere@redhat.com
Subject: Re: [PATCH v13 2/2] gdb: add shadowed field in '-stack-list-locals/variables' mi commands
Date: Mon, 13 Jul 2026 16:11:00 +0100	[thread overview]
Message-ID: <87qzl6exh7.fsf@redhat.com> (raw)
In-Reply-To: <20260708180805.207722-3-abdul.b.ijaz@intel.com>


Thank you for continuing to work on this feature.  I have some comments
inline below.


Abdul Basit Ijaz <abdul.b.ijaz@intel.com> writes:

> From: "Ijaz, Abdul B" <abdul.b.ijaz@intel.com>
>
> For C/C++/Fortran languages GDB prints same name variable multiple times in
> case of variable shadowing and it is confusing for user to identify which
> variable belongs to the current scope.  So GDB now prints location information
> for shadowed variables and add 'shadowed' field also in '-stack-list-locals'
> and '-stack-list-variables' mi commands for super-block shadowed variable.
>
> Suppose we have test.c file
>
> 1:int x = 42;
> 2:  {
> 3:    int x = 99;
> 4:    int y = 52;
> 5:    x = 99; /* break here */
> 6:  }
>
> The "-stack-list-locals" and "-stack-list-variables" mi commands at the
> "break here" line gives the following output:
>
> Before the change:
>
> ~~~
> (gdb)
> -stack-list-locals 0
> ^done,locals=[name="x",name="y",name="x"]
> (gdb)
> -stack-list-locals 1
> ^done,locals=[{name="x",value="99"},{name="y",value="52"},{name="x",value="42"}]
> (gdb)
> -stack-list-locals 2
> ^done,locals=[{name="x",type="int",value="99"},{name="y",type="int",value="52"},{name="x",type="int",value="42"}]
> (gdb)
> -stack-list-variables 0
> ^done,variables=[{name="x"},{name="y"},{name="x"}]
> (gdb)
> -stack-list-variables 1
> ^done,variables=[{name="x",value="99"},{name="y",value="52"},{name="x",value="42"}]
> (gdb)
> -stack-list-variables 2
> ^done,variables=[{name="x",type="int",value="99"},{name="y",type="int",value="52"},{name="x",type="int",value="42"}]
> ~~~
>
> With this patch we obtain:
>
> ~~~
> (gdb)
> -stack-list-locals 0
> ^done,locals=[name="x",name="y",name="x"]
> (gdb)
> -stack-list-locals 1
> ^done,locals=[{name="x",value="99",file="/home/src/test.c",line="5"},{name="y",value="52"},{name="x",value="42",file="/home/src/test.c",line="2",shadowed="true"}]
> (gdb)
> -stack-list-locals 2
> ^done,locals=[{name="x",type="int",value="99",file="/home/src/test.c",line="5"},{name="y",type="int",value="52"},{name="x",type="int",value="42",file="/home/src/test.c",line="2",shadowed="true"}]
> (gdb)
> -stack-list-variables 0
> ^done,variables=[{name="x",file="/home/src/test.c",line="5"},{name="y"},{name="x",file="/home/src/test.c",line="2",shadowed="true"}]
> (gdb)
> -stack-list-variables 1
> ^done,variables=[{name="x",value="99",file="/home/src/test.c",line="4"},{name="y",value="52"},{name="x",value="42",file="/home/src/test.c",line="2",shadowed="true"}]
> (gdb)
> -stack-list-variables 2
> ^done,variables=[{name="x",type="int",value="99",file="/home/src/test.c",line="4"},{name="y",type="int",value="52"},{name="x",type="int",value="42",file="/home/src/test.c",line="2",shadowed="true"}]
> ~~~
> Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
> ---
>  gdb/NEWS                                  |   4 +
>  gdb/doc/gdb.texinfo                       |  21 ++++
>  gdb/mi/mi-cmd-stack.c                     | 129 ++++++++++++++------
>  gdb/testsuite/gdb.mi/mi-var-shadowing.c   |  50 ++++++++
>  gdb/testsuite/gdb.mi/mi-var-shadowing.exp | 141 ++++++++++++++++++++++
>  5 files changed, 310 insertions(+), 35 deletions(-)
>  create mode 100644 gdb/testsuite/gdb.mi/mi-var-shadowing.c
>  create mode 100644 gdb/testsuite/gdb.mi/mi-var-shadowing.exp
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 6807a6c966b..483d2013e41 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -593,6 +593,10 @@ multi-wp-addr in qSupported
>     multiple times, and the same mapping was being reused.  In all
>     other cases, this field will have the value 'false'.
>  
> +** GDB now shows "shadowed", "file" and "line" fields in the output
> +   of '-stack-list-locals/variables' mi commands for variables
> +   shadowing case.
> +
>  * Support for stabs debugging format and the a.out/dbx object format is
>    deprecated, and will be removed in GDB 18.
>  
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index ee33bfdba13..64a1345e2f2 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -35585,6 +35585,27 @@ If the @code{--skip-unavailable} option is specified, local variables
>  and arguments that are not available are not listed.  Partially
>  available arguments and local variables are still displayed, however.
>  
> +@smallexample
> +@group
> +1: int x = 3;
> +2: @{
> +3:       int x = 4;
> +4:       int y = 5;
> +4:       x = 99; // breakpoint-line

Duplicate line number in this example.

> +5: @}
> +@end group
> +@group
> +(gdb) -stack-list-variables 2
> +^done,variables=[@{name="x",type="int",value="4",
> +file="/home/src/name.c",line="3"@},@{name="y",type="int",value="5",
> +file="/home/src/name.c",line="4"@},@{name="x",type="int",value="3",
> +file="/home/src/name.c",line="1",shadowed="true"@}]
> +@end group
> +@end smallexample
> +
> +The location information and @samp{shadowed} attribute is only added
> +for shadowed variables (@pxref{shadowed variables}).
> +
>  @subsubheading Example
>  
>  @smallexample
> diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c
> index 280a08d121e..38955cc697b 100644
> --- a/gdb/mi/mi-cmd-stack.c
> +++ b/gdb/mi/mi-cmd-stack.c
> @@ -32,6 +32,7 @@
>  #include "mi-parse.h"
>  #include <optional>
>  #include "inferior.h"
> +#include "gdbsupport/unordered_map.h"
>  
>  enum what_to_list { locals, arguments, all };
>  
> @@ -490,7 +491,9 @@ mi_cmd_stack_list_variables (const char *command, const char *const *argv,
>  static void
>  list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
>  		   enum print_values values, int skip_unavailable,
> -		   const frame_print_options &fp_opts)
> +		   const frame_print_options &fp_opts,
> +		   const gdb::unordered_set<std::string> *shadowed_vars,
> +		   gdb::unordered_set<std::string> &printed_vars)
>  {
>    struct ui_out *uiout = current_uiout;
>  
> @@ -519,6 +522,19 @@ list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
>      tuple_emitter.emplace (uiout, nullptr);
>  
>    string_file stb;
> +  const char *name = arg->sym->print_name ();
> +  /* To distinguish innermost variable from the rest in the shadowed_vars
> +     this boolen is needed.  */

Typo: s/boolen/boolean/

> +  bool already_printed = !printed_vars.insert (name).second;
> +  bool shadowed = shadowed_vars->find (name) != shadowed_vars->end ();
> +
> +  /* In case of Rust language it is possible to declare variable with
> +     same name multiple times and only latest declaration of variable
> +     is accessible.  So print only the first instance and there is no
> +     need of printing duplicates.  */
> +  if (get_lang_vars_shadowing_option (current_language->la_language)
> +      == lang_vars_shadowing::HIDE && shadowed && already_printed)
> +    return;

I haven't created a reproducer, but I think there's an issue here.  By
the time we reach this line the `tuple_emitter` has already had a value
emplaced, so if the rust early return triggers the tuple_emitter is
going to emit an empty tuple ... at least I think that's what will
happen.

I think the code that give tuple_emitter a value needs to be after the
rust early return.

>  
>    stb.puts (arg->sym->print_name ());
>    if (arg->entry_kind == print_entry_values_only)
> @@ -560,6 +576,59 @@ list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
>  	}
>        uiout->field_stream ("value", stb);
>      }
> +
> +  /* Only for C/C++/Fortran/Ada languages, in case of variables shadowing
> +     print shadowed field after the superblock variable and only location
> +     of the variables in the innerblock.  */
> +  if (get_lang_vars_shadowing_option (current_language->la_language)
> +      == lang_vars_shadowing::PRINT && shadowed
> +      && !(values == PRINT_NO_VALUES && what == locals))
> +    {
> +      uiout->field_string ("file", arg->sym->symtab ()->filename ());
> +      uiout->field_unsigned ("line", arg->sym->m_line);

In the non-MI path you ended up having to guard the equivalent code to
handle the case where symtab was NULL, but here you don't have a similar
guard.

I suspect the issue here is that the test you quote for the non-MI path
gdb.dwarf2/missing-type-name-for-templates.exp, doesn't have shadowing,
but does have the missing symtab case.  In the non-MI code you use the
symtab even when shadowing didn't occur (I suggested moving the code),
which is why you hit the issue, but I suspect you might be able to both
shadowing and no symtab ... maybe?

When I tried to reproduce this I was ending up with a symtab with the
name "<unknown>", I'll leave you to investigate this more.

Additionally, here, if you look at the function `mi_symbol_info` and
`output_module_symbols_in_single_module_and_file` you'll see they always
emit two strings, "filename" and "fullname", I think that you should
follow the same pattern here.

Also, the access to m_line should be done via the public 'line ()'
method.  One day maybe we'll even make these member variables private.

> +      if (already_printed)
> +	uiout->field_string ("shadowed", "true");
> +    }
> +}
> +
> +/* Returns true if address_class can be printed, otherwise returns false.  */
> +
> +static bool
> +can_print_aclass (struct symbol *sym, enum what_to_list what)
> +{
> +  int print_me = false;
> +
> +  switch (sym->loc_class ())
> +    {
> +      default:
> +	case LOC_UNDEF:     /* catches errors        */
> +	case LOC_CONST:     /* constant              */
> +	case LOC_TYPEDEF:   /* local typedef         */
> +	case LOC_LABEL:     /* local label           */
> +	case LOC_BLOCK:     /* local function        */
> +	case LOC_CONST_BYTES:       /* loc. byte seq.        */
> +	case LOC_UNRESOLVED:        /* unresolved static     */
> +	case LOC_OPTIMIZED_OUT:     /* optimized out         */
> +	  print_me = false;
> +	  break;

Not something I think you need to fix as this is moved code, but I
noticed it while reviewing this patch -- this switch is almost certainly
wrong. There's no reason why we cannot print LOC_CONST variables,
e.g. variables defined with DW_AT_const_value.  Also LOC_OPTIMIZED_OUT
should probably be printed, if I do 'info locals' then I will see
optimised out locals, but '-stack-list-locals 1' will skip them, which
doesn't seem right to me.

But this bug exists before this patch, so it's not yours to fix.

You could however convert PRINT_ME from 'int' to 'bool', that would be a
simple fix.

And the indentation of the 'default' and 'case ...' statements seems to
be messed up.  Likely everything within the switch needs to be
re-indented I think.

> +
> +	case LOC_ARG:       /* argument              */
> +	case LOC_REF_ARG:   /* reference arg         */
> +	case LOC_REGPARM_ADDR:      /* indirect register arg */
> +	case LOC_LOCAL:     /* stack local           */
> +	case LOC_STATIC:    /* static                */
> +	case LOC_REGISTER:  /* register              */
> +	case LOC_COMPUTED:  /* computed location     */
> +	  if (what == all)
> +	    print_me = true;
> +	  else if (what == locals)
> +	    print_me = !sym->is_argument ();
> +	  else
> +	    print_me = sym->is_argument ();
> +	  break;
> +    }
> +
> +    return print_me;
>  }
>  
>  /* Print a list of the objects for the frame FI in a certain form,
> @@ -573,9 +642,10 @@ list_args_or_locals (const frame_print_options &fp_opts,
>  		     enum what_to_list what, enum print_values values,
>  		     const frame_info_ptr &fi, int skip_unavailable)
>  {
> -  const struct block *block;
> +  const struct block *block, *orig_block;
>    const char *name_of_result;
>    struct ui_out *uiout = current_uiout;
> +  gdb::unordered_set<std::string> collected_vars, shadowed_vars, printed_vars;
>  
>    block = get_frame_block (fi, 0);
>  
> @@ -596,42 +666,31 @@ list_args_or_locals (const frame_print_options &fp_opts,
>  
>    ui_out_emit_list list_emitter (uiout, name_of_result);
>  
> -  while (block != 0)
> +  orig_block = block;
> +  /* Stored list of shadowed variables later help in identifying them
> +     from the rest.  */
> +  while (block != nullptr)
>      {
>        for (struct symbol *sym : block_iterator_range (block))
>  	{
> -	  int print_me = 0;
> -
> -	  switch (sym->loc_class ())
> +	  if (can_print_aclass (sym, what))
>  	    {
> -	    default:
> -	    case LOC_UNDEF:	/* catches errors        */
> -	    case LOC_CONST:	/* constant              */
> -	    case LOC_TYPEDEF:	/* local typedef         */
> -	    case LOC_LABEL:	/* local label           */
> -	    case LOC_BLOCK:	/* local function        */
> -	    case LOC_CONST_BYTES:	/* loc. byte seq.        */
> -	    case LOC_UNRESOLVED:	/* unresolved static     */
> -	    case LOC_OPTIMIZED_OUT:	/* optimized out         */
> -	      print_me = 0;
> -	      break;
> -
> -	    case LOC_ARG:	/* argument              */
> -	    case LOC_REF_ARG:	/* reference arg         */
> -	    case LOC_REGPARM_ADDR:	/* indirect register arg */
> -	    case LOC_LOCAL:	/* stack local           */
> -	    case LOC_STATIC:	/* static                */
> -	    case LOC_REGISTER:	/* register              */
> -	    case LOC_COMPUTED:	/* computed location     */
> -	      if (what == all)
> -		print_me = 1;
> -	      else if (what == locals)
> -		print_me = !sym->is_argument ();
> -	      else
> -		print_me = sym->is_argument ();
> -	      break;
> +	      const char *name = sym->print_name ();
> +	      if (!collected_vars.insert (name).second)
> +		shadowed_vars.insert (name);
>  	    }
> -	  if (print_me)
> +	}
> +      if (block->function ())
> +	break;
> +      block = block->superblock ();
> +    }
> +
> +  block = orig_block;
> +  while (block != 0)
> +    {
> +      for (struct symbol *sym : block_iterator_range (block))
> +	{
> +	  if (can_print_aclass (sym, what))
>  	    {
>  	      struct frame_arg arg, entryarg;
>  
> @@ -657,10 +716,10 @@ list_args_or_locals (const frame_print_options &fp_opts,
>  
>  	      if (arg.entry_kind != print_entry_values_only)
>  		list_arg_or_local (&arg, what, values, skip_unavailable,
> -				   fp_opts);
> +				   fp_opts, &shadowed_vars, printed_vars);
>  	      if (entryarg.entry_kind != print_entry_values_no)
>  		list_arg_or_local (&entryarg, what, values, skip_unavailable,
> -				   fp_opts);
> +				   fp_opts, &shadowed_vars, printed_vars);
>  	    }
>  	}
>  
> diff --git a/gdb/testsuite/gdb.mi/mi-var-shadowing.c b/gdb/testsuite/gdb.mi/mi-var-shadowing.c
> new file mode 100644
> index 00000000000..875e753b485
> --- /dev/null
> +++ b/gdb/testsuite/gdb.mi/mi-var-shadowing.c
> @@ -0,0 +1,50 @@
> +/* Copyright (C) 2023-2026 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 <http://www.gnu.org/licenses/>.  */
> +
> +#include <stdlib.h>
> +
> +int
> +shadowing (void)
> +{
> +  int a = 100;	/* entry bp */
> +  unsigned int val1 = 1;		/* val1-d1 */
> +  unsigned int val2 = 2;		/* val2-d1 */
> +  a = 101;  /* bp for locals 1 */
> +  {
> +    unsigned int val2 = 3;		/* val2-d2 */
> +    unsigned int val3 = 4;		/* val3-d1 */
> +    a = 102;  /* bp for locals 2 */
> +    {
> +      unsigned int val1 = 5;		/* val1-d2 */
> +      a = 103;  /* bp for locals 3 */
> +      {
> +	unsigned int val1 = 6;		/* val1-d3 */
> +	unsigned int val2 = 7;		/* val2-d3 */
> +	unsigned int val3 = 8;		/* val3-d2 */
> +	a = 104;  /* bp for locals 4 */
> +      }
> +    }
> +  }
> +  a = 105;
> +
> +  return 0; /* bp for locals 5 */
> +}
> +
> +int
> +main (void)
> +{
> +  shadowing ();
> +  return 0;
> +}
> diff --git a/gdb/testsuite/gdb.mi/mi-var-shadowing.exp b/gdb/testsuite/gdb.mi/mi-var-shadowing.exp
> new file mode 100644
> index 00000000000..f88c8c81736
> --- /dev/null
> +++ b/gdb/testsuite/gdb.mi/mi-var-shadowing.exp
> @@ -0,0 +1,141 @@
> +# Copyright 2023-2026 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 <http://www.gnu.org/licenses/>.
> +
> +load_lib mi-support.exp
> +set MIFLAGS "-i=mi"
> +
> +gdb_exit
> +if [mi_gdb_start] {
> +    continue
> +}
> +
> +standard_testfile
> +
> +set opts {debug}
> +if [build_executable ${testfile}.exp ${testfile} ${srcfile} $opts] {
> +    return -1

Just 'return' at the top level, no -1 needed.

Thanks,
Andrew


> +}
> +
> +mi_delete_breakpoints
> +mi_gdb_reinitialize_dir $srcdir/$subdir
> +mi_gdb_load ${binfile}
> +mi_runto main
> +
> +set bp_line1 [gdb_get_line_number "bp for locals 1"]
> +set bp_line2 [gdb_get_line_number "bp for locals 2"]
> +set bp_line3 [gdb_get_line_number "bp for locals 3"]
> +set bp_line4 [gdb_get_line_number "bp for locals 4"]
> +set bp_line5 [gdb_get_line_number "bp for locals 5"]
> +
> +set val1_d1 [gdb_get_line_number "val1-d1"]
> +set val1_d2 [gdb_get_line_number "val1-d2"]
> +set val1_d3 [gdb_get_line_number "val1-d3"]
> +set val2_d1 [gdb_get_line_number "val2-d1"]
> +set val2_d2 [gdb_get_line_number "val2-d2"]
> +set val2_d3 [gdb_get_line_number "val2-d3"]
> +set val3_d1 [gdb_get_line_number "val3-d1"]
> +set val3_d2 [gdb_get_line_number "val3-d2"]
> +set a_line [gdb_get_line_number "entry bp"]
> +
> +set stack_test1_regx "\\^done,(locals|variables)=\\\[\{name=\"a\",type=\"int\",value=\"$decimal\"\},\{name=\"val1\",type=\"unsigned int\",value=\"1\"\},{name=\"val2\",type=\"unsigned int\",value=\"2\"\}\\\]"
> +set stack_test2_regx "\\^done,(locals|variables)=\\\[\{name=\"val2\",type=\"unsigned int\",value=\"3\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d2\"\},\{name=\"val3\",type=\"unsigned int\",value=\"4\"\},\{name=\"a\",type=\"int\",value=\"101\"\},\{name=\"val1\",type=\"unsigned int\",value=\"1\"\},\{name=\"val2\",type=\"unsigned int\",value=\"2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d1\",shadowed=\"true\"\}\\\]"
> +set stack_test3_regx "\\^done,(locals|variables)=\\\[\{name=\"val1\",type=\"unsigned int\",value=\"5\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d2\"\},\{name=\"val2\",type=\"unsigned int\",value=\"3\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d2\"\},\{name=\"val3\",type=\"unsigned int\",value=\"4\"\},\{name=\"a\",type=\"int\",value=\"102\"\},\{name=\"val1\",type=\"unsigned int\",value=\"1\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d1\",shadowed=\"true\"\},\{name=\"val2\",type=\"unsigned int\",value=\"2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d1\",shadowed=\"true\"\}\\\]"
> +set stack_test4_regx "\\^done,(locals|variables)=\\\[\{name=\"val1\",type=\"unsigned int\",value=\"6\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d3\"\},\{name=\"val2\",type=\"unsigned int\",value=\"7\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d3\"\},\{name=\"val3\",type=\"unsigned int\",value=\"8\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val3_d2\"\},\{name=\"val1\",type=\"unsigned int\",value=\"5\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d2\",shadowed=\"true\"\},\{name=\"val2\",type=\"unsigned int\",value=\"3\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d2\",shadowed=\"true\"\},\{name=\"val3\",type=\"unsigned int\",value=\"4\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val3_d1\",shadowed=\"true\"\},\{name=\"a\",type=\"int\",value=\"103\"\},\{name=\"val1\",type=\"unsigned int\",value=\"1\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d1\",shadowed=\"true\"\},\{name=\"val2\",type=\"unsigned int\",value=\"2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d1\",shadowed=\"true\"\}\\\]"
> +set stack_test5_regx "\\^done,(locals|variables)=\\\[\{name=\"a\",type=\"int\",value=\"105\"\},\{name=\"val1\",type=\"unsigned int\",value=\"1\"\},\{name=\"val2\",type=\"unsigned int\",value=\"2\"\}\\\]"
> +
> +mi_gdb_test \
> +    "-break-insert --source ${srcfile} --line ${bp_line1}"  \
> +    "\\^done.*source ${srcfile} \\-line ${bp_line1}.*"  \
> +    "bp at outermost level"
> +mi_execute_to "exec-continue" "breakpoint-hit" ".*" ".*" ".*" "${bp_line1}"  \
> +    { "" "disp=\"keep\"" } "continue to outermost level"
> +mi_gdb_test "-stack-list-locals 0" \
> +    "\\^done,locals=\\\[name=\"a\",name=\"val1\",name=\"val2\"\\\]" \
> +    "-stack-list-locals 0 at outermost level"
> +mi_gdb_test "-stack-list-variables 0" \
> +    "\\^done,variables=\\\[{name=\"a\"},{name=\"val1\"},{name=\"val2\"}\\\]" \
> +    "-stack-list-variables 0 at outermost level"
> +mi_gdb_test "-stack-list-locals 2" "${stack_test1_regx}"  \
> +    "-stack-list-locals 2 at outermost level"
> +mi_gdb_test "-stack-list-variables 2" "${stack_test1_regx}"  \
> +    "-stack-list-variables 2 at outermost level"
> +
> +mi_gdb_test  \
> +    "-break-insert --source ${srcfile} --line ${bp_line2}"  \
> +    "\\^done.*source ${srcfile} \\-line ${bp_line2}.*"  \
> +    "bp at first level"
> +mi_execute_to "exec-continue" "breakpoint-hit" ".*" ".*" ".*" "${bp_line2}"  \
> +    { "" "disp=\"keep\"" } "continue to first level"
> +mi_gdb_test "-stack-list-locals 0"  \
> +    "\\^done,locals=\\\[name=\"val2\",name=\"val3\",name=\"a\",name=\"val1\",name=\"val2\"\\\]"  \
> +    "-stack-list-locals 0 at first level"
> +mi_gdb_test "-stack-list-variables 0" \
> +    "\\^done,variables=\\\[{name=\"val2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d2\"},{name=\"val3\"},{name=\"a\"},{name=\"val1\"},{name=\"val2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d1\",shadowed=\"true\"\}\\\]"  \
> +    "-stack-list-variables 0 at first level"
> +mi_gdb_test "-stack-list-locals 2" "${stack_test2_regx}"  \
> +    "-stack-list-locals 2 at first level"
> +mi_gdb_test "-stack-list-variables 2" "${stack_test2_regx}"  \
> +    "-stack-list-variables 2 at first level"
> +
> +mi_gdb_test  \
> +    "-break-insert --source ${srcfile} --line ${bp_line3}"  \
> +    "\\^done.*source ${srcfile} \\-line ${bp_line3}.*"  \
> +    "bp at second level"
> +mi_execute_to "exec-continue" "breakpoint-hit" ".*" ".*" ".*" "${bp_line3}"  \
> +    { "" "disp=\"keep\"" } "continue to second level"
> +mi_gdb_test "-stack-list-locals 0"  \
> +     "\\^done,locals=\\\[name=\"val1\",name=\"val2\",name=\"val3\",name=\"a\",name=\"val1\",name=\"val2\"\\\]"  \
> +    "-stack-list-locals 0 at second level"
> +mi_gdb_test "-stack-list-variables 0"  \
> +     "\\^done,variables=\\\[{name=\"val1\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d2\"},{name=\"val2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d2\"},{name=\"val3\"},{name=\"a\"},{name=\"val1\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d1\",shadowed=\"true\"\},{name=\"val2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d1\",shadowed=\"true\"\}\\\]"  \
> +    "-stack-list-variables 0 at second level"
> +mi_gdb_test "-stack-list-locals 2" "${stack_test3_regx}"  \
> +     "-stack-list-locals 2 at second level"
> +mi_gdb_test "-stack-list-variables 2" "${stack_test3_regx}"  \
> +     "-stack-list-variables 2 at second level"
> +
> +mi_gdb_test  \
> +    "-break-insert --source ${srcfile} --line ${bp_line4}"  \
> +    "\\^done.*source ${srcfile} \\-line ${bp_line4}.*"  \
> +    "bp at third level"
> +mi_execute_to "exec-continue" "breakpoint-hit" ".*" ".*" ".*" "${bp_line4}"  \
> +    { "" "disp=\"keep\"" } "continue to third level"
> +mi_gdb_test "-stack-list-locals 0"  \
> +    "\\^done,locals=\\\[name=\"val1\",name=\"val2\",name=\"val3\",name=\"val1\",name=\"val2\",name=\"val3\",name=\"a\",name=\"val1\",name=\"val2\"\\\]"  \
> +    "-stack-list-locals 0 at third level"
> +mi_gdb_test "-stack-list-variables 0" \
> +    "\\^done,variables=\\\[{name=\"val1\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d3\"},{name=\"val2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d3\"},{name=\"val3\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val3_d2\"},{name=\"val1\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d2\",shadowed=\"true\"\},\{name=\"val2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d2\",shadowed=\"true\"\},\{name=\"val3\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val3_d1\",shadowed=\"true\"\},{name=\"a\"},{name=\"val1\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val1_d1\",shadowed=\"true\"\},{name=\"val2\",file=\"$srcdir/$subdir/$srcfile\",line=\"$val2_d1\",shadowed=\"true\"\}\\\]"  \
> +    "-stack-list-variables 0 at third level"
> +mi_gdb_test "-stack-list-locals 2" "${stack_test4_regx}"  \
> +    "-stack-list-locals 2 at third level"
> +mi_gdb_test "-stack-list-variables 2" "${stack_test4_regx}"  \
> +    "-stack-list-variables 2 at third level"
> +
> +mi_gdb_test  \
> +    "-break-insert --source ${srcfile} --line ${bp_line5}"  \
> +    "\\^done.*source ${srcfile} \\-line ${bp_line5}.*"  \
> +    "bp at outermost level last"
> +mi_execute_to "exec-continue" "breakpoint-hit" ".*" ".*" ".*" "${bp_line5}"  \
> +    { "" "disp=\"keep\"" } "continue to outermost level last"
> +mi_gdb_test "-stack-list-locals 0"  \
> +    "\\^done,locals=\\\[name=\"a\",name=\"val1\",name=\"val2\"\\\]"  \
> +    "-stack-list-locals 0 at outermost level last"
> +mi_gdb_test "-stack-list-variables 0"  \
> +    "\\^done,variables=\\\[{name=\"a\"},{name=\"val1\"},{name=\"val2\"}\\\]"  \
> +    "-stack-list-variables at outermost level last"
> +mi_gdb_test "-stack-list-locals 2" "${stack_test5_regx}"  \
> +    "-stack-list-locals 2 at outermost level last"
> +mi_gdb_test "-stack-list-variables 2" "${stack_test5_regx}"  \
> +    "-stack-list-variables 2 at outermost level last"
> -- 
> 2.34.1
>
> Intel Deutschland GmbH
>
> Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany
> Tel: +49 89 991 430, www.intel.de
> Managing Directors: Harry Demas, Jeffrey Schneiderman, Yin Chong Sorrell
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Seat: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928


  reply	other threads:[~2026-07-13 15:11 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-08 18:08 [PATCH v13 0/2] add annotation in 'info locals' command for variables shadowing case Abdul Basit Ijaz
2026-07-08 18:08 ` [PATCH v13 1/2] gdb: " Abdul Basit Ijaz
2026-07-13 12:49   ` Andrew Burgess
2026-07-13 13:45     ` Ijaz, Abdul B
2026-07-13 15:12   ` Andrew Burgess
2026-07-13 20:06     ` Ijaz, Abdul B
2026-07-08 18:08 ` [PATCH v13 2/2] gdb: add shadowed field in '-stack-list-locals/variables' mi commands Abdul Basit Ijaz
2026-07-13 15:11   ` Andrew Burgess [this message]
2026-07-13 20:39     ` Ijaz, Abdul B

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87qzl6exh7.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=abdul.b.ijaz@intel.com \
    --cc=christina.schimpe@intel.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=guinevere@redhat.com \
    --cc=lsix@lancelotsix.com \
    --cc=pedro@palves.net \
    --cc=philippe.waroquiers@skynet.be \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox