Ensure listing of unused static var in info locals

Message ID 20200224115817.GA9340@delia
State New, archived
Headers

Commit Message

Tom de Vries Feb. 24, 2020, 11:58 a.m. UTC
  Hi,

Consider a test-case compiled with -g:
...
int main (void) {
  static int b = 2;
  return 0;
}
...

When running info locals in main, we get:
...
(gdb) info locals
No locals.
...

The info locals documentation states:
...
Print the local variables of the selected frame, each on a separate line.
These are all variables (declared either static or automatic) accessible at
the point of execution of the selected frame.
...
So, "info locals" should have printed static variable b.

The variable is present in dwarf info:
...
 <2><14a>: Abbrev Number: 6 (DW_TAG_variable)
    <14b>   DW_AT_name        : b
    <153>   DW_AT_const_value : 2
...
but instead of a location attribute, it has a const_value attribute, which
causes the corresponding symbol to have LOC_CONST, which causes info locals to
skip it.

Fix this by handling LOC_CONST in iterate_over_block_locals.

Build and reg-tested on x86_64-linux.

OK for trunk?

Thanks,
- Tom

[gdb] Ensure listing of unused static var in info locals

gdb/ChangeLog:

2020-02-24  Tom de Vries  <tdevries@suse.de>

	PR gdb/25592
	* stack.c (iterate_over_block_locals): Handle LOC_CONST.

gdb/testsuite/ChangeLog:

2020-02-24  Tom de Vries  <tdevries@suse.de>

	PR gdb/25592
	* gdb.base/info-locals-unused-static-var.c: New test.
	* gdb.base/info-locals-unused-static-var.exp: New file.

---
 gdb/stack.c                                        |  1 +
 .../gdb.base/info-locals-unused-static-var.c       | 24 +++++++++++++
 .../gdb.base/info-locals-unused-static-var.exp     | 40 ++++++++++++++++++++++
 3 files changed, 65 insertions(+)
  

Comments

Andrew Burgess Feb. 24, 2020, 2:19 p.m. UTC | #1
* Tom de Vries <tdevries@suse.de> [2020-02-24 12:58:18 +0100]:

> Hi,
> 
> Consider a test-case compiled with -g:
> ...
> int main (void) {
>   static int b = 2;
>   return 0;
> }
> ...
> 
> When running info locals in main, we get:
> ...
> (gdb) info locals
> No locals.
> ...
> 
> The info locals documentation states:
> ...
> Print the local variables of the selected frame, each on a separate line.
> These are all variables (declared either static or automatic) accessible at
> the point of execution of the selected frame.
> ...
> So, "info locals" should have printed static variable b.
> 
> The variable is present in dwarf info:
> ...
>  <2><14a>: Abbrev Number: 6 (DW_TAG_variable)
>     <14b>   DW_AT_name        : b
>     <153>   DW_AT_const_value : 2
> ...
> but instead of a location attribute, it has a const_value attribute, which
> causes the corresponding symbol to have LOC_CONST, which causes info locals to
> skip it.
> 
> Fix this by handling LOC_CONST in iterate_over_block_locals.
> 
> Build and reg-tested on x86_64-linux.
> 
> OK for trunk?
> 
> Thanks,
> - Tom
> 
> [gdb] Ensure listing of unused static var in info locals
> 
> gdb/ChangeLog:
> 
> 2020-02-24  Tom de Vries  <tdevries@suse.de>
> 
> 	PR gdb/25592
> 	* stack.c (iterate_over_block_locals): Handle LOC_CONST.
> 
> gdb/testsuite/ChangeLog:
> 
> 2020-02-24  Tom de Vries  <tdevries@suse.de>
> 
> 	PR gdb/25592
> 	* gdb.base/info-locals-unused-static-var.c: New test.
> 	* gdb.base/info-locals-unused-static-var.exp: New file.

LGTM.

Thanks,
Andrew



> 
> ---
>  gdb/stack.c                                        |  1 +
>  .../gdb.base/info-locals-unused-static-var.c       | 24 +++++++++++++
>  .../gdb.base/info-locals-unused-static-var.exp     | 40 ++++++++++++++++++++++
>  3 files changed, 65 insertions(+)
> 
> diff --git a/gdb/stack.c b/gdb/stack.c
> index af30405f29..266d771e35 100644
> --- a/gdb/stack.c
> +++ b/gdb/stack.c
> @@ -2237,6 +2237,7 @@ iterate_over_block_locals (const struct block *b,
>      {
>        switch (SYMBOL_CLASS (sym))
>  	{
> +	case LOC_CONST:
>  	case LOC_LOCAL:
>  	case LOC_REGISTER:
>  	case LOC_STATIC:
> diff --git a/gdb/testsuite/gdb.base/info-locals-unused-static-var.c b/gdb/testsuite/gdb.base/info-locals-unused-static-var.c
> new file mode 100644
> index 0000000000..86d34b3579
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/info-locals-unused-static-var.c
> @@ -0,0 +1,24 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2020 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/>.  */
> +
> +int
> +main (void)
> +{
> +  static int b = 2;
> +
> +  return 0;
> +}
> diff --git a/gdb/testsuite/gdb.base/info-locals-unused-static-var.exp b/gdb/testsuite/gdb.base/info-locals-unused-static-var.exp
> new file mode 100644
> index 0000000000..79f02c25e6
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/info-locals-unused-static-var.exp
> @@ -0,0 +1,40 @@
> +# Copyright 2020 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/>.  */
> +
> +# Test if an unused static local var is listed with info locals.
> +#
> +# Note: with gcc 4.8.5, we have:
> +# ...
> +# (gdb) info addr b
> +# Symbol "b" is static storage at address $hex
> +# ...
> +# but with gcc 7.5.0, we have instead:
> +# ...
> +# (gdb) info addr b
> +# Symbol "b" is constant.
> +# ...
> +
> +standard_testfile
> +
> +if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
> +    return -1
> +}
> +
> +if ![runto_main] then {
> +    fail "can't run to main"
> +    return 0
> +}
> +
> +gdb_test "info locals" "\r\nb = .*"
  

Patch

diff --git a/gdb/stack.c b/gdb/stack.c
index af30405f29..266d771e35 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -2237,6 +2237,7 @@  iterate_over_block_locals (const struct block *b,
     {
       switch (SYMBOL_CLASS (sym))
 	{
+	case LOC_CONST:
 	case LOC_LOCAL:
 	case LOC_REGISTER:
 	case LOC_STATIC:
diff --git a/gdb/testsuite/gdb.base/info-locals-unused-static-var.c b/gdb/testsuite/gdb.base/info-locals-unused-static-var.c
new file mode 100644
index 0000000000..86d34b3579
--- /dev/null
+++ b/gdb/testsuite/gdb.base/info-locals-unused-static-var.c
@@ -0,0 +1,24 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2020 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/>.  */
+
+int
+main (void)
+{
+  static int b = 2;
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/info-locals-unused-static-var.exp b/gdb/testsuite/gdb.base/info-locals-unused-static-var.exp
new file mode 100644
index 0000000000..79f02c25e6
--- /dev/null
+++ b/gdb/testsuite/gdb.base/info-locals-unused-static-var.exp
@@ -0,0 +1,40 @@ 
+# Copyright 2020 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/>.  */
+
+# Test if an unused static local var is listed with info locals.
+#
+# Note: with gcc 4.8.5, we have:
+# ...
+# (gdb) info addr b
+# Symbol "b" is static storage at address $hex
+# ...
+# but with gcc 7.5.0, we have instead:
+# ...
+# (gdb) info addr b
+# Symbol "b" is constant.
+# ...
+
+standard_testfile
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
+    return -1
+}
+
+if ![runto_main] then {
+    fail "can't run to main"
+    return 0
+}
+
+gdb_test "info locals" "\r\nb = .*"