* Update PR28561 kfail. * Update PR29781 kfail. - Maintenance script qa-local.sh: * Add "Verify quilt setup" step. - Patches added (backport from master): * gdb-symtab-handle-self-reference-die.patch * gdb-symtab-handle-self-reference-in-inherit_abstract.patch * gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=368
300 lines
9.7 KiB
Diff
300 lines
9.7 KiB
Diff
From 7f4601b0a51f400bd1b1bc0f7895254d467e3bb4 Mon Sep 17 00:00:00 2001
|
|
From: Tom de Vries <tdevries@suse.de>
|
|
Date: Fri, 21 Jul 2023 08:25:25 +0200
|
|
Subject: [PATCH] [gdb/symtab] Add optimized out static var to cooked index
|
|
|
|
Consider the test-case:
|
|
...
|
|
$ cat main.c
|
|
int main (void) { return 0; }
|
|
$ cat static-optimized-out.c
|
|
static int aaa;
|
|
...
|
|
compiled like this:
|
|
...
|
|
$ gcc-12 static-optimized-out.c main.c -g -O2 -flto
|
|
...
|
|
|
|
There's a difference in behaviour depending on symtab expansion state:
|
|
...
|
|
$ gdb -q -batch a.out -ex "print aaa"
|
|
No symbol "aaa" in current context.
|
|
$ gdb -q -batch a.out -ex "maint expand-symtab" -ex "print aaa"
|
|
$1 = <optimized out>
|
|
...
|
|
|
|
The reason for the difference is that the optimized out variable aaa:
|
|
...
|
|
<1><104>: Abbrev Number: 2 (DW_TAG_variable)
|
|
<105> DW_AT_name : aaa
|
|
<109> DW_AT_decl_file : 1
|
|
<10a> DW_AT_decl_line : 18
|
|
<10b> DW_AT_decl_column : 12
|
|
<10c> DW_AT_type : <0x110>
|
|
...
|
|
is not added to the cooked index because of this clause in abbrev_table::read:
|
|
...
|
|
else if (!has_location && !has_specification_or_origin && !has_external
|
|
&& cur_abbrev->tag == DW_TAG_variable)
|
|
cur_abbrev->interesting = false;
|
|
...
|
|
|
|
Fix this inconsistency by making sure that the optimized out variable is added
|
|
to the cooked index.
|
|
|
|
Regression tested on x86_64-linux.
|
|
|
|
Add two test-cases, a C test-case gdb.opt/static-optimized-out.exp and a dwarf
|
|
assembly test-case gdb.dwarf2/static-optimized-out.exp.
|
|
|
|
Tested gdb.opt/static-optimized-out.exp with gcc-8 to gcc-12, for which we now
|
|
consistently get:
|
|
...
|
|
(gdb) print aaa^M
|
|
$1 = <optimized out>^M
|
|
...
|
|
and with gcc 7.5.0 and clang 13.0.1, for which we still consistently get:
|
|
...
|
|
(gdb) print aaa^M
|
|
No symbol "aaa" in current context.^M
|
|
...
|
|
due to missing debug info for the variable.
|
|
|
|
PR symtab/30656
|
|
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30656
|
|
|
|
Approved-By: Tom Tromey <tom@tromey.com>
|
|
---
|
|
gdb/dwarf2/abbrev.c | 9 ---
|
|
.../gdb.dwarf2/static-optimized-out.exp | 69 +++++++++++++++++++
|
|
gdb/testsuite/gdb.opt/main.c | 22 ++++++
|
|
gdb/testsuite/gdb.opt/static-optimized-out.c | 18 +++++
|
|
.../gdb.opt/static-optimized-out.exp | 49 +++++++++++++
|
|
5 files changed, 158 insertions(+), 9 deletions(-)
|
|
create mode 100644 gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
|
|
create mode 100644 gdb/testsuite/gdb.opt/main.c
|
|
create mode 100644 gdb/testsuite/gdb.opt/static-optimized-out.c
|
|
create mode 100644 gdb/testsuite/gdb.opt/static-optimized-out.exp
|
|
|
|
diff --git a/gdb/dwarf2/abbrev.c b/gdb/dwarf2/abbrev.c
|
|
index 1ebf8f6eed5..3a429fd41b1 100644
|
|
--- a/gdb/dwarf2/abbrev.c
|
|
+++ b/gdb/dwarf2/abbrev.c
|
|
@@ -162,7 +162,6 @@ abbrev_table::read (struct dwarf2_section_info *section,
|
|
bool has_specification_or_origin = false;
|
|
bool has_name = false;
|
|
bool has_linkage_name = false;
|
|
- bool has_location = false;
|
|
bool has_external = false;
|
|
|
|
/* Now read in declarations. */
|
|
@@ -217,11 +216,6 @@ abbrev_table::read (struct dwarf2_section_info *section,
|
|
has_linkage_name = true;
|
|
break;
|
|
|
|
- case DW_AT_const_value:
|
|
- case DW_AT_location:
|
|
- has_location = true;
|
|
- break;
|
|
-
|
|
case DW_AT_sibling:
|
|
if (is_csize && cur_attr.form == DW_FORM_ref4)
|
|
sibling_offset = size;
|
|
@@ -296,9 +290,6 @@ abbrev_table::read (struct dwarf2_section_info *section,
|
|
cur_abbrev->interesting = false;
|
|
else if (!tag_interesting_for_index (cur_abbrev->tag))
|
|
cur_abbrev->interesting = false;
|
|
- else if (!has_location && !has_specification_or_origin && !has_external
|
|
- && cur_abbrev->tag == DW_TAG_variable)
|
|
- cur_abbrev->interesting = false;
|
|
else
|
|
cur_abbrev->interesting = true;
|
|
|
|
diff --git a/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp b/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
|
|
new file mode 100644
|
|
index 00000000000..1547a8acbc0
|
|
--- /dev/null
|
|
+++ b/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
|
|
@@ -0,0 +1,69 @@
|
|
+# Copyright 2023 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/>.
|
|
+
|
|
+# Check that an optimized out static variable is printed the same independent
|
|
+# of state of symtab expansion. See also gdb.opt/static-optimized-out.exp.
|
|
+
|
|
+load_lib dwarf.exp
|
|
+
|
|
+# This test can only be run on targets which support DWARF-2 and use gas.
|
|
+if { ![dwarf2_support] } {
|
|
+ return 0
|
|
+}
|
|
+
|
|
+standard_testfile main.c -dw.S
|
|
+
|
|
+# Make DWARF for the test.
|
|
+set asm_file [standard_output_file $srcfile2]
|
|
+Dwarf::assemble $asm_file {
|
|
+ cu {} {
|
|
+ compile_unit {
|
|
+ {
|
|
+ language @DW_LANG_C
|
|
+ }
|
|
+ } {
|
|
+ declare_labels integer_label
|
|
+
|
|
+ integer_label: DW_TAG_base_type {
|
|
+ {DW_AT_byte_size 4 DW_FORM_sdata}
|
|
+ {DW_AT_encoding @DW_ATE_signed}
|
|
+ {DW_AT_name integer}
|
|
+ }
|
|
+
|
|
+ DW_TAG_variable {
|
|
+ {name var}
|
|
+ {type :$integer_label}
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+if { [prepare_for_testing "failed to prepare" ${testfile} \
|
|
+ [list $srcfile $asm_file] {nodebug}] } {
|
|
+ return -1
|
|
+}
|
|
+
|
|
+gdb_test "print var" " = <optimized out>"
|
|
+
|
|
+# Expand all symbol tables.
|
|
+gdb_test_no_output "maint expand-symtabs"
|
|
+
|
|
+# Make sure we do an actual lookup rather than just returning the same as
|
|
+# before.
|
|
+gdb_test_no_output "maint flush symbol-cache"
|
|
+
|
|
+with_test_prefix "after expand-symtabs" {
|
|
+ gdb_test "print var" " = <optimized out>"
|
|
+}
|
|
diff --git a/gdb/testsuite/gdb.opt/main.c b/gdb/testsuite/gdb.opt/main.c
|
|
new file mode 100644
|
|
index 00000000000..c6beff77dbe
|
|
--- /dev/null
|
|
+++ b/gdb/testsuite/gdb.opt/main.c
|
|
@@ -0,0 +1,22 @@
|
|
+/* This testcase is part of GDB, the GNU debugger.
|
|
+
|
|
+ Copyright 2023 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)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
diff --git a/gdb/testsuite/gdb.opt/static-optimized-out.c b/gdb/testsuite/gdb.opt/static-optimized-out.c
|
|
new file mode 100644
|
|
index 00000000000..44287fbd6d2
|
|
--- /dev/null
|
|
+++ b/gdb/testsuite/gdb.opt/static-optimized-out.c
|
|
@@ -0,0 +1,18 @@
|
|
+/* This testcase is part of GDB, the GNU debugger.
|
|
+
|
|
+ Copyright 2023 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/>. */
|
|
+
|
|
+static int aaa;
|
|
diff --git a/gdb/testsuite/gdb.opt/static-optimized-out.exp b/gdb/testsuite/gdb.opt/static-optimized-out.exp
|
|
new file mode 100644
|
|
index 00000000000..bd673b6503e
|
|
--- /dev/null
|
|
+++ b/gdb/testsuite/gdb.opt/static-optimized-out.exp
|
|
@@ -0,0 +1,49 @@
|
|
+# Copyright 2023 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/>.
|
|
+
|
|
+# Check that an optimized out static variable is printed the same independent
|
|
+# of state of symtab expansion. See also gdb.dwarf2/static-optimized-out.exp.
|
|
+
|
|
+standard_testfile .c main.c
|
|
+
|
|
+set opts {}
|
|
+lappend opts debug
|
|
+lappend opts "optimize=-O2 -flto"
|
|
+
|
|
+if { [prepare_for_testing "failed to prepare" $testfile \
|
|
+ [list $srcfile $srcfile2] $opts] } {
|
|
+ return -1
|
|
+}
|
|
+
|
|
+set val ""
|
|
+gdb_test_multiple "print aaa" "" {
|
|
+ -re -wrap "\r\n(?:\\$$decimal = )?(\[^\r\n\]*)" {
|
|
+ set val $expect_out(1,string)
|
|
+ }
|
|
+}
|
|
+
|
|
+if { $val == "" } {
|
|
+ return
|
|
+}
|
|
+
|
|
+# Expand all symbol tables.
|
|
+gdb_test_no_output "maint expand-symtab"
|
|
+
|
|
+# Make sure we do an actual lookup rather than just returning the same as
|
|
+# before.
|
|
+gdb_test_no_output "maint flush symbol-cache"
|
|
+
|
|
+# Now check that we get the same result in both cases.
|
|
+gdb_test "print aaa" [string_to_regexp $val] "consistency"
|
|
|
|
base-commit: 800c393f89a94f49b01dff99f693cb13c5e28116
|
|
--
|
|
2.35.3
|
|
|