[gdb/symtab] Fix "file index out of range" complaint

With the test-case included in this commit, we run into this FAIL:
...
(gdb) p var^M
During symbol reading: file index out of range^M
$1 = 0^M
(gdb) FAIL: gdb.dwarf2/dw2-no-code-cu.exp: p var with no complaints
...

This is a regression since commit 6d263fe46e ("Avoid bad breakpoints with
--gc-sections"), which contains this change in read_file_scope:
...
-  handle_DW_AT_stmt_list (die, cu, fnd, lowpc);
+  if (lowpc != highpc)
+    handle_DW_AT_stmt_list (die, cu, fnd, lowpc);
...

The change intends to avoid a problem with a check in
lnp_state_machine::check_line_address, but also prevents the file and dir
tables from being read, which causes the complaint.

Fix the FAIL by reducing the scope of the "lowpc != highpc" condition to the
call to dwarf_decode_lines in handle_DW_AT_stmt_list.

Tested on x86_64-linux.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29561
This commit is contained in:
Tom de Vries
2022-09-17 08:22:32 +02:00
parent 5e3cecb21a
commit 99d679e7b3
3 changed files with 59 additions and 10 deletions

View File

@@ -9498,8 +9498,8 @@ find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu)
static void static void
handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu, handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
const file_and_directory &fnd, const file_and_directory &fnd, CORE_ADDR lowpc,
CORE_ADDR lowpc) /* ARI: editCase function */ bool have_code) /* ARI: editCase function */
{ {
dwarf2_per_objfile *per_objfile = cu->per_objfile; dwarf2_per_objfile *per_objfile = cu->per_objfile;
struct attribute *attr; struct attribute *attr;
@@ -9586,6 +9586,11 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
gdb_assert (die->tag != DW_TAG_partial_unit); gdb_assert (die->tag != DW_TAG_partial_unit);
} }
decode_mapping = (die->tag != DW_TAG_partial_unit); decode_mapping = (die->tag != DW_TAG_partial_unit);
/* The have_code check is here because, if LOWPC and HIGHPC are both 0x0,
then there won't be any interesting code in the CU, but a check later on
(in lnp_state_machine::check_line_address) will fail to properly exclude
an entry that was removed via --gc-sections. */
if (have_code)
dwarf_decode_lines (cu->line_header, cu, lowpc, decode_mapping); dwarf_decode_lines (cu->line_header, cu, lowpc, decode_mapping);
} }
@@ -9625,13 +9630,8 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
/* Decode line number information if present. We do this before /* Decode line number information if present. We do this before
processing child DIEs, so that the line header table is available processing child DIEs, so that the line header table is available
for DW_AT_decl_file. The PC check is here because, if LOWPC and for DW_AT_decl_file. */
HIGHPC are both 0x0, then there won't be any interesting code in handle_DW_AT_stmt_list (die, cu, fnd, lowpc, lowpc != highpc);
the CU, but a check later on (in
lnp_state_machine::check_line_address) will fail to properly
exclude an entry that was removed via --gc-sections. */
if (lowpc != highpc)
handle_DW_AT_stmt_list (die, cu, fnd, lowpc);
/* Process all dies in compilation unit. */ /* Process all dies in compilation unit. */
if (die->child != NULL) if (die->child != NULL)

View File

@@ -0,0 +1,18 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2022 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 var;

View File

@@ -0,0 +1,31 @@
# Copyright 2022 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/>.
standard_testfile .c main.c
if [prepare_for_testing "failed to prepare" $testfile "$srcfile $srcfile2"] {
return -1
}
set cmd "p var"
set re \
[multi_line \
"$cmd" \
"\\\$1 = 0"]
with_complaints 5 {
gdb_test $cmd $re "$cmd with no complaints"
}