From 7f4601b0a51f400bd1b1bc0f7895254d467e3bb4 Mon Sep 17 00:00:00 2001 From: Tom de Vries 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 = ... 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 = ^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 --- 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 . + +# 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" " = " + +# 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" " = " +} 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 . */ + +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 . */ + +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 . + +# 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