From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id GWxXH+yFe2r/OB8AWB0awg (envelope-from ) for ; Tue, 11 Aug 2026 16:28:28 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=C6N8aBog; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 7D3B81E09B; Tue, 11 Aug 2026 16:28:28 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 9E62B1E09B for ; Tue, 11 Aug 2026 16:28:27 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 68EC44B9DB72 for ; Tue, 11 Aug 2026 20:28:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 68EC44B9DB72 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=C6N8aBog Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.16]) by sourceware.org (Postfix) with ESMTPS id 42F4A4BA79A1 for ; Tue, 11 Aug 2026 20:27:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 42F4A4BA79A1 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 42F4A4BA79A1 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=192.198.163.16 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786480079; cv=none; b=R/YbLOLbccU4l4YZqA0pZx6NIPNyQWe6YvxvfgAgb7js0l+JcMNNgtPqgDPzpY92XT+qfd4GIJmRShySzGOT+d/mk/XaqbOmOFe/AubYjl2Ckj5PobwaBo0p0WFO0v3x58+gDn2Zsq4mp17hwLV0J9o32BnXMVXib8ri+L3glbo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786480079; c=relaxed/simple; bh=YvZCHy64SlAsQC+sY7pwfEa8HUWCFeoqQsmdubFXA5g=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=xoCU2heg9ZYO5nWHFUUXnQziHpgea3FbA0FF0qXfGMptLfydJBVf+R1nTY8GOdS0KxLQG2Q1bvRHdGOeYWbK1AgLxFllWqYRWOG/K3I0x3Tum6MdsZfi9IFwjSAjsVSdrbRSrUpSaIHUp58y2FhIfOg+LaTkUf7qGOgoSEGCnlY= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=C6N8aBog DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 42F4A4BA79A1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1786480079; x=1818016079; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=YvZCHy64SlAsQC+sY7pwfEa8HUWCFeoqQsmdubFXA5g=; b=C6N8aBogM93Cn4osnHt1yw1RtVakFFGonZlXAjldGCJVBmkjbjAmtJyj f3ghkB//qXJ30Uq0U9hxpsc8ET2icNRunly1zTPK5v60ry1XOTWF4n1MH 94wdi3Ixlubn7oCShW3lxmzxw6m+smvi3EabpWgoa/4PIgf6W3zLQzkx+ 9zs5W+sG+ulghhJ05FQQFA/R3lEhc/Pemen/E37cN1TVMdWhxJ4xT7b6T q0Q7ZQGckBK23nl4/HKtGF1lifUZ8qpNiqe7kEjASrrI1NNfFLKqKWS68 m78irLh88atafhIy6wgbXyik3n+sShsnqvvEsMyKJiL2Oh05jc4RAjzoc g==; X-CSE-ConnectionGUID: sCvqyIx6SCWdoiR3nlTb/g== X-CSE-MsgGUID: zLc1xt9wQ6OXXXsSbC8szQ== X-IronPort-AV: E=McAfee;i="6800,10657,11872"; a="74560223" X-IronPort-AV: E=Sophos;i="6.25,218,1779174000"; d="scan'208";a="74560223" Received: from orviesa007.jf.intel.com ([10.64.159.147]) by fmvoesa110.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Aug 2026 13:27:59 -0700 X-CSE-ConnectionGUID: dCekUCTnQy2ieb10nRxBqg== X-CSE-MsgGUID: aebD6lbxQrWnHNXo7PB1sw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,218,1779174000"; d="scan'208";a="263474397" Received: from live-gta-imageloader.igk.intel.com (HELO localhost) ([10.211.177.228]) by orviesa007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Aug 2026 13:27:58 -0700 From: Stephan Rohr To: gdb-patches@sourceware.org Subject: [PATCH 1/1] gdb: Introduce new setting to filter out shadowed variables. Date: Tue, 11 Aug 2026 20:27:46 +0000 Message-ID: <20260811202746.21652-2-stephan.rohr@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260811202746.21652-1-stephan.rohr@intel.com> References: <20260811202746.21652-1-stephan.rohr@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org From: "Sargsyan, Eduard" Add a new setting 'print shadowed on|off' to control the printing of shadowed variables in 'info locals'. When shadowed variables are present, each variable involved in a shadowing relationship is annotated with its declaration location ''; the ones hidden by an inner declaration are additionally marked ', shadowed'. Given this code, stopped at line 10: 1 int num = 1; 2 int 3 main () 4 { 5 const char *str = "main"; 6 int num = 3; 7 { 8 const char *str = "nested"; 9 int num = 5; 10 num = 0; // break here 11 } 12 return num; 13 } By default, 'info locals' prints shadowed variables: (gdb) info locals str = 0x555555556009 "nested" num = 5 str = 0x555555556004 "main" num = 3 Use 'set print shadowed off' to hide shadowed variables. The user may not want to print shadowed variables: (gdb) set print shadowed off (gdb) info locals str = 0x555555556009 "nested" num = 5 Use 'set print shadowed on' to include shadowed variables. --- gdb/NEWS | 8 ++++++++ gdb/doc/gdb.texinfo | 15 +++++++++++++- gdb/printcmd.c | 8 +++++++- gdb/stack.c | 25 +++++++++++++++++++++++- gdb/testsuite/gdb.ada/var_shadowing.exp | 1 + gdb/testsuite/gdb.base/options.exp | 1 + gdb/testsuite/gdb.base/var-shadowing.exp | 15 ++++++++++++++ gdb/valprint.c | 20 +++++++++++++++++++ gdb/valprint.h | 3 +++ 9 files changed, 93 insertions(+), 3 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 10c182067f9..a3348436984 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,14 @@ *** Changes since GDB 18 +* New commands + +set print shadowed on|off +show print shadowed + This controls the output of the "info locals" command for C/C++/Fortran. If + the option is 'off' shadowed variables will be omitted in output. The + default is to print shadowed variables. + *** Changes in GDB 18 * Support for the Common Trace Format (CTF) has been removed. GDB now diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 0030698dcee..232a9901a2c 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -9212,7 +9212,8 @@ same name which is declared within an inner scope (decision block, method, or inner class). When shadowing is detected, location information is added to all instances of the shadowed variable name. The outermost instances are additionally followed by @samp{shadowed} -to indicate that they are not the active variable. +to indicate that they are not the active variable. Printing shadowed +variables can be controlled by @ref{set print shadowed}. @item info locals [-q] [-t @var{type_regexp}] [@var{regexp}] Like @kbd{info locals}, but only print the local variables selected @@ -12829,6 +12830,18 @@ Do not pretty print C@t{++} virtual function tables. @item show print vtbl Show whether C@t{++} virtual function tables are pretty printed, or not. + +@anchor{set print shadowed} +@item set print shadowed +@itemx set print shadowed on +@cindex shadowed variables in C/C@t{++}/Fortran +Print shadowed variables for C/C@t{++}/Fortran. The default is on. + +@item set print shadowed off +Do not print shadowed variables for C/C@t{++}/Fortran. + +@item show print shadowed +Show whether C/C@t{++}/Fortran shadowed variables are printed or not. @end table @node Pretty Printing diff --git a/gdb/printcmd.c b/gdb/printcmd.c index c9e6e4886e3..303066065f8 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -2402,7 +2402,7 @@ print_variable_value (symbol *var, const frame_info_ptr &frame, /* Print <%line, shadowed> after the variable value only when it is variable shadowing case. */ - if (shadow_status != var_shadowing::NONE) + if (opts.print_shadowed && shadow_status != var_shadowing::NONE) { /* Use lbasename instead of symtab_to_filename_for_display as the latter defaults to relative path while basename is preferred @@ -2454,6 +2454,12 @@ print_variable_and_value (const char *name, symbol *var, if (name == nullptr) name = var->print_name (); + struct value_print_options opts; + get_user_print_options (&opts); + + if (!opts.print_shadowed && shadow_status == var_shadowing::SHADOWED) + return; + gdb_printf (stream, "%*s%ps = ", 2 * indent, "", styled_string (variable_name_style.style (), name)); diff --git a/gdb/stack.c b/gdb/stack.c index 954ef6b11a4..cd21aa3a40c 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2258,6 +2258,7 @@ struct print_variable_and_value_data int num_tabs; struct ui_file *stream; int values_printed; + bool has_shadowed_variables; void operator() (const char *print_name, struct symbol *sym, var_shadowing shadow_status); @@ -2292,6 +2293,8 @@ print_variable_and_value_data::operator() (const char *print_name, shadow_status); values_printed = 1; + + has_shadowed_variables |= (shadow_status == var_shadowing::SHADOWED); } /* Prepares the regular expression REG from REGEXP. @@ -2351,6 +2354,7 @@ print_frame_local_vars (const frame_info_ptr &frame, cb_data.num_tabs = 4 * num_tabs; cb_data.stream = stream; cb_data.values_printed = 0; + cb_data.has_shadowed_variables = false; /* Temporarily change the selected frame to the given FRAME. This allows routines that rely on the selected frame instead @@ -2360,7 +2364,26 @@ print_frame_local_vars (const frame_info_ptr &frame, iterate_over_block_local_vars_printing (block, cb_data); - if (!cb_data.values_printed && !quiet) + if (quiet) + return; + + if (cb_data.values_printed) + { + if (!cb_data.has_shadowed_variables) + return; + + value_print_options opts; + get_user_print_options (&opts); + if (opts.print_shadowed) + gdb_printf (stream, + _("Use 'set print shadowed off' " + "to hide shadowed variables.\n")); + else + gdb_printf (stream, + _("Use 'set print shadowed on' " + "to include shadowed variables.\n")); + } + else { if (regexp == NULL && t_regexp == NULL) gdb_printf (stream, _("No locals.\n")); diff --git a/gdb/testsuite/gdb.ada/var_shadowing.exp b/gdb/testsuite/gdb.ada/var_shadowing.exp index ffa96b049cf..d927b0d9888 100644 --- a/gdb/testsuite/gdb.ada/var_shadowing.exp +++ b/gdb/testsuite/gdb.ada/var_shadowing.exp @@ -36,4 +36,5 @@ gdb_test "info locals" [multi_line \ "i = 111\t<$testfile.adb:$i_level3>" \ "i = 11\t<$testfile.adb:$i_level2, shadowed>" \ "i = 1\t<$testfile.adb:$i_level1, shadowed>" \ + "Use 'set print shadowed off' to hide shadowed variables." \ ] "info locals at innermost level" diff --git a/gdb/testsuite/gdb.base/options.exp b/gdb/testsuite/gdb.base/options.exp index 35487ead6a7..34e4b642181 100644 --- a/gdb/testsuite/gdb.base/options.exp +++ b/gdb/testsuite/gdb.base/options.exp @@ -198,6 +198,7 @@ proc_with_prefix test-print {{prefix ""}} { "-pretty" "-raw-values" "-repeats" + "-shadowed" "-static-members" "-symbol" "-union" diff --git a/gdb/testsuite/gdb.base/var-shadowing.exp b/gdb/testsuite/gdb.base/var-shadowing.exp index 502cbad11f6..c3b9d77eb77 100644 --- a/gdb/testsuite/gdb.base/var-shadowing.exp +++ b/gdb/testsuite/gdb.base/var-shadowing.exp @@ -54,6 +54,7 @@ gdb_test "info locals" [multi_line \ "a = 101" \ "val1 = 1" \ "val2 = 2\t<$srcfile:$val2_d1, shadowed>" \ + "Use 'set print shadowed off' to hide shadowed variables." \ ] "info locals first level" gdb_breakpoint $srcfile:$bp_line3 @@ -65,6 +66,7 @@ gdb_test "info locals" [multi_line \ "a = 102" \ "val1 = 1\t<$srcfile:$val1_d1, shadowed>" \ "val2 = 2\t<$srcfile:$val2_d1, shadowed>" \ + "Use 'set print shadowed off' to hide shadowed variables." \ ] "info locals second level" gdb_breakpoint $srcfile:$bp_line4 @@ -80,8 +82,21 @@ gdb_test "info locals" [multi_line \ "a = 103\t<$srcfile:$a_line, shadowed>" \ "val1 = 1\t<$srcfile:$val1_d1, shadowed>" \ "val2 = 2\t<$srcfile:$val2_d1, shadowed>" \ + "Use 'set print shadowed off' to hide shadowed variables." \ ] "info locals at innermost level" +gdb_test_no_output "set print shadowed off" + +gdb_test "info locals" [multi_line \ + "a = 999" \ + "val1 = 6" \ + "val2 = 7" \ + "val3 = 8" \ + "Use 'set print shadowed on' to include shadowed variables." \ + ] "info locals at innermost level with filtered out shadowed" + +gdb_test_no_output "set print shadowed on" + gdb_breakpoint $srcfile:$bp_line5 gdb_continue_to_breakpoint "continue to outermost level last" \ ".*$srcfile:$bp_line5.*" diff --git a/gdb/valprint.c b/gdb/valprint.c index 3e7a37338b3..4b65e438c33 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -90,6 +90,7 @@ struct value_print_options user_print_options = false, /* print_array_indexes */ false, /* deref_ref */ true, /* static_field_print */ + true, /* print_shadowed */ true, /* pascal_static_field_print */ false, /* raw */ false, /* summary */ @@ -2395,6 +2396,16 @@ show_static_field_print (struct ui_file *file, int from_tty, value); } +static void +show_shadowed_print (struct ui_file *file, int from_tty, + struct cmd_list_element *c, + const char *value) +{ + gdb_printf (file, + _("Printing of shadowed variables is %s.\n"), + value); +} + /* A couple typedefs to make writing the options a bit more @@ -2557,6 +2568,15 @@ pretty-printers for that value.") NULL, /* help_doc */ }, + boolean_option_def { + "shadowed", + [] (value_print_options *opt) { return &opt->print_shadowed; }, + show_shadowed_print, /* show_cmd_cb */ + N_("Set printing of shadowed variables."), + N_("Show printing of shadowed variables."), + NULL, /* help_doc */ + }, + boolean_option_def { "symbol", [] (value_print_options *opt) { return &opt->symbol_print; }, diff --git a/gdb/valprint.h b/gdb/valprint.h index 15d0be2ac7a..e63c3b9fb03 100644 --- a/gdb/valprint.h +++ b/gdb/valprint.h @@ -99,6 +99,9 @@ struct value_print_options /* If true, print static fields. */ bool static_field_print; + /* If true, print shadowed variables. */ + bool print_shadowed; + /* If true, print static fields for Pascal. FIXME: C++ has a flag, why not share with Pascal too? */ bool pascal_static_field_print; -- 2.43.0 ________________________________________ Intel Deutschland GmbH Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany Tel: +49 (89) 99143-0 www.intel.de Managing Directors: Candice Moore, Jeffrey Schneiderman, Ramachandran Sitaraman Chairperson of the Supervisory Board: Sonja Pierer Registered Seat: Munich Commercial Register B: Amtsgericht Munich HRB 186928 This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.