mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 12:03:41 +08:00
[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>
This commit is contained in:
parent
24b43533e9
commit
f4c4456eb4
@ -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;
|
||||
|
||||
|
67
gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
Normal file
67
gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
Normal file
@ -0,0 +1,67 @@
|
||||
# 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.
|
||||
require dwarf2_support
|
||||
|
||||
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>"
|
||||
}
|
22
gdb/testsuite/gdb.opt/main.c
Normal file
22
gdb/testsuite/gdb.opt/main.c
Normal file
@ -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;
|
||||
}
|
18
gdb/testsuite/gdb.opt/static-optimized-out.c
Normal file
18
gdb/testsuite/gdb.opt/static-optimized-out.c
Normal file
@ -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;
|
49
gdb/testsuite/gdb.opt/static-optimized-out.exp
Normal file
49
gdb/testsuite/gdb.opt/static-optimized-out.exp
Normal file
@ -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 "^(?:\\$$decimal = )?(.*)" {
|
||||
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"
|
Loading…
Reference in New Issue
Block a user