[gdb/symtab] Fix .debug_aranges duplicate offset warning

The function read_addrmap_from_aranges contains code to issue a warning:
...
      if (!insertpair.second)
       {
         warning (_("Section .debug_aranges in %s has duplicate "
                    "debug_info_offset %s, ignoring .debug_aranges."),
                  objfile_name (objfile), sect_offset_str (per_cu->sect_off));
         return false;
       }
...
but the warning is in fact activated when all_comp_units has duplicate
entries, which is very misleading.

Fix this by:
- adding a test-case that should trigger the warning,
- replacing the current implementation of the warning with an
  assert that all_comp_units should not contain duplicates, and
- properly re-implementing the warning, such that it is triggered
  by the test-case.

Tested on x86_64-linux.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29381
This commit is contained in:
Tom de Vries 2022-08-01 14:00:59 +02:00
parent e4971956ea
commit 75337cbc14
3 changed files with 124 additions and 7 deletions

View file

@ -2347,15 +2347,13 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
const auto insertpair
= debug_info_offset_to_per_cu.emplace (per_cu->sect_off,
per_cu.get ());
if (!insertpair.second)
{
warning (_("Section .debug_aranges in %s has duplicate "
"debug_info_offset %s, ignoring .debug_aranges."),
objfile_name (objfile), sect_offset_str (per_cu->sect_off));
return false;
}
/* Assume no duplicate offsets in all_comp_units. */
gdb_assert (insertpair.second);
}
std::set<sect_offset> debug_info_offset_seen;
section->read (objfile);
const bfd_endian dwarf5_byte_order = gdbarch_byte_order (gdbarch);
@ -2413,6 +2411,16 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
pulongest (debug_info_offset));
return false;
}
const auto insertpair
= debug_info_offset_seen.insert (sect_offset (debug_info_offset));
if (!insertpair.second)
{
warning (_("Section .debug_aranges in %s has duplicate "
"debug_info_offset %s, ignoring .debug_aranges."),
objfile_name (objfile),
sect_offset_str (sect_offset (debug_info_offset)));
return false;
}
dwarf2_per_cu_data *const per_cu = per_cu_it->second;
const uint8_t address_size = *addr++;

View file

@ -0,0 +1,28 @@
/*
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/>. */
void
frame2 (void)
{
asm ("frame2_label: .globl frame2_label");
}
int
main (void)
{
asm ("main_label: .globl main_label");
frame2 ();
}

View file

@ -0,0 +1,81 @@
# 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/>.
load_lib dwarf.exp
# Test with two aranges entries referring to the same CU.
# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
verbose "Skipping $gdb_test_file_name."
return 0
}
standard_testfile .c -dw.S
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
global srcdir subdir srcfile srcfile2
declare_labels ranges_label
get_func_info main
get_func_info frame2
cu { label cu_label } {
compile_unit {
{language @DW_LANG_C}
{name $srcfile}
} {
subprogram {
{external 1 flag}
{name main}
{low_pc $main_start addr}
{high_pc $main_len DW_FORM_data4}
}
subprogram {
{external 1 flag}
{name frame2}
{low_pc $frame2_start addr}
{high_pc $frame2_len DW_FORM_data4}
}
}
}
aranges {} cu_label {
arange {} $main_start $main_len
}
aranges {} cu_label {
arange {} $frame2_start $frame2_len
}
}
if { [prepare_for_testing "failed to prepare" ${testfile} \
[list $srcfile $asm_file] {nodebug}] } {
return -1
}
set readnow_p [readnow]
set test "file command warnings"
if { $readnow_p } {
set re "warning:"
gdb_assert { ![regexp $re $gdb_file_cmd_msg] } $test
} else {
set re \
[concat \
"warning: Section .debug_aranges in \[^\r\n\]* has" \
"duplicate debug_info_offset $hex," \
"ignoring \\.debug_aranges\\."]
gdb_assert { [regexp $re $gdb_file_cmd_msg] } $test
}