Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Ijaz, Abdul B" <abdul.b.ijaz@intel.com>
To: Andrew Burgess <aburgess@redhat.com>,
	"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Cc: "pedro@palves.net" <pedro@palves.net>,
	"philippe.waroquiers@skynet.be" <philippe.waroquiers@skynet.be>,
	"Schimpe, Christina" <christina.schimpe@intel.com>,
	"lsix@lancelotsix.com" <lsix@lancelotsix.com>,
	 "eliz@gnu.org" <eliz@gnu.org>,
	"guinevere@redhat.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 20:39:11 +0000	[thread overview]
Message-ID: <SA1PR11MB68467D1F51C479CB7976EB12CBFA2@SA1PR11MB6846.namprd11.prod.outlook.com> (raw)
In-Reply-To: <87qzl6exh7.fsf@redhat.com>

Hi Andrew,

Thanks for the feedback. Will address these in v14. Replies inline:

>> +4:       int y = 5;
>> +4:       x = 99; // breakpoint-line

Andrew>Duplicate line number in this example.
Abdul>Will fix in v14.

>> + (get_lang_vars_shadowing_option (current_language->la_language)
>> +      == lang_vars_shadowing::HIDE && shadowed && already_printed)
>> +    return;

Andrew>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, Andrew> 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.

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

Abdul>Tested it using var_reuse.rs reproducer already included in patch#1 using the "mi" interpreter. It confirms we got empty {} at the end because of this issue. So, tuple_emitter declaration will be moved after the rust early return to solve this.

>> +      uiout->field_unsigned ("line", arg->sym->m_line);

Andrew>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.

Abdul> True, symtab NULL value guarding is better to add it here also. But the same test even if executed in MI mode manually does not trigger the similar issue, Will add the guard for symtab NULL value in V14.

Andrew>I suspect you might be able to both shadowing and no symtab ... maybe?
Andrew>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.

Abdul>It’s the same case like the other patch as there is no reason why it cannot. So in any case I will add the guard for NULL here.
 

Andrew>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.

Abdul> Will update in v14  to print both "filename" and "fullname" similar to "mi_symbol_info".

Andrew>Also, the access to m_line should be done via the public 'line ()'

Abdul>Will fix in v14 patch.

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

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

Abdul> Will convert PRINT_ME from 'int' to 'bool' in v14.

>> +  switch (sym->loc_class ())
>> +    {
>> +      default:
>> +	case LOC_UNDEF:     /* catches errors        */
>> +	case LOC_CONST:     /* constant              */

Andrew>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.

Abdul>Will fix in v14.


>> +if [build_executable ${testfile}.exp ${testfile} ${srcfile} $opts] {
>> +    return -1

Andrew>Just 'return' at the top level, no -1 needed.
Abdul>Will fix in v14.

Thanks & Best Regards
Abdul Basit

-----Original Message-----
From: Andrew Burgess <aburgess@redhat.com> 
Sent: Monday, July 13, 2026 5:11 PM
To: Ijaz, Abdul B <abdul.b.ijaz@intel.com>; gdb-patches@sourceware.org
Cc: pedro@palves.net; philippe.waroquiers@skynet.be; Schimpe, Christina <christina.schimpe@intel.com>; lsix@lancelotsix.com; eliz@gnu.org; Ijaz, Abdul B <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


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",va
> lue="42"}]
> (gdb)
> -stack-list-locals 2
> ^done,locals=[{name="x",type="int",value="99"},{name="y",type="int",va
> lue="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",l
> ine="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",val
> ue="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

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 20:39 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
2026-07-13 20:39     ` Ijaz, Abdul B [this message]

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=SA1PR11MB68467D1F51C479CB7976EB12CBFA2@SA1PR11MB6846.namprd11.prod.outlook.com \
    --to=abdul.b.ijaz@intel.com \
    --cc=aburgess@redhat.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