[gdb/symtab] Error out for .debug_types section in dwz file

There are two methods to factor out type information in a dwarf4 executable:
- use -fdebug-info-types to generate type units in a .debug_types section, and
- use dwz to create partial units.

The dwz method has an extra benefit: it also allows to factor out information
between executables into a newly created .dwz file, pointed to by a
.gnu_debugaltlink section.

There is nothing prohibiting a .gnu_debugaltlink file to contain a
.debug_types section.

It's just not generated by dwz or any other tool atm, and consequently gdb has
no support for it.  Enhancement PR symtab/30838 is open about the lack of
support.

Make the current situation explicit by emitting a dwarf error:
...
(gdb) file struct-with-sig-2^M
Reading symbols from struct-with-sig-2...^M
Dwarf Error: .debug_types section not supported in dwz file^M
...
and add an assert in write_gdbindex:
...
+      /* See enhancement PR symtab/30838.  */
+      gdb_assert (!(per_cu->is_dwz && per_cu->is_debug_types));
...
to clarify why we can use:
...
      data_buf &cu_list = (per_cu->is_debug_types
                           ? types_cu_list
                           : per_cu->is_dwz ? dwz_cu_list : objfile_cu_list);
...

The test-case is a modified copy from gdb.dwarf2/struct-with-sig.exp, so it
keeps the copyright years range.

Tested on x86_64-linux.

Tested-By: Guinevere Larsen <blarsen@redhat.com>

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30838
This commit is contained in:
Tom de Vries
2023-09-20 16:05:55 +02:00
parent fbf4b3c9bb
commit 973db6fae3
5 changed files with 143 additions and 0 deletions

View File

@@ -91,6 +91,11 @@ locate_dwz_sections (bfd *abfd, asection *sectp, dwz_file *dwz_file)
dwz_file->debug_names.s.section = sectp; dwz_file->debug_names.s.section = sectp;
dwz_file->debug_names.size = bfd_section_size (sectp); dwz_file->debug_names.size = bfd_section_size (sectp);
} }
else if (dwarf2_elf_names.types.matches (sectp->name))
{
dwz_file->types.s.section = sectp;
dwz_file->types.size = bfd_section_size (sectp);
}
} }
/* Attempt to find a .dwz file (whose full path is represented by /* Attempt to find a .dwz file (whose full path is represented by

View File

@@ -48,6 +48,7 @@ struct dwz_file
struct dwarf2_section_info macro {}; struct dwarf2_section_info macro {};
struct dwarf2_section_info gdb_index {}; struct dwarf2_section_info gdb_index {};
struct dwarf2_section_info debug_names {}; struct dwarf2_section_info debug_names {};
struct dwarf2_section_info types {};
/* The dwz's BFD. */ /* The dwz's BFD. */
gdb_bfd_ref_ptr dwz_bfd; gdb_bfd_ref_ptr dwz_bfd;

View File

@@ -1221,6 +1221,9 @@ write_gdbindex (dwarf2_per_bfd *per_bfd, cooked_index *table,
const auto insertpair = cu_index_htab.emplace (per_cu, counter); const auto insertpair = cu_index_htab.emplace (per_cu, counter);
gdb_assert (insertpair.second); gdb_assert (insertpair.second);
/* See enhancement PR symtab/30838. */
gdb_assert (!(per_cu->is_dwz && per_cu->is_debug_types));
/* The all_units list contains CUs read from the objfile as well as /* The all_units list contains CUs read from the objfile as well as
from the eventual dwz file. We need to place the entry in the from the eventual dwz file. We need to place the entry in the
corresponding index. */ corresponding index. */

View File

@@ -5314,6 +5314,12 @@ create_all_units (dwarf2_per_objfile *per_objfile)
dwz->line.read (objfile); dwz->line.read (objfile);
read_comp_units_from_section (per_objfile, &dwz->info, &dwz->abbrev, 1, read_comp_units_from_section (per_objfile, &dwz->info, &dwz->abbrev, 1,
types_htab, rcuh_kind::COMPILE); types_htab, rcuh_kind::COMPILE);
if (!dwz->types.empty ())
{
/* See enhancement PR symtab/30838. */
error (_("Dwarf Error: .debug_types section not supported in dwz file"));
}
} }
per_objfile->per_bfd->signatured_types = std::move (types_htab); per_objfile->per_bfd->signatured_types = std::move (types_htab);

View File

@@ -0,0 +1,128 @@
# Copyright 2020-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/>.
# Variant of struct-with-sig.exp where TUs are in .gnu_debugaltlink file.
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-foo.c .S .S
set build_id [string repeat ff 20]
# Make some DWARF for the dwz file.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
build_id $::build_id
tu {} 0x0000000000000001 the_type_i {
type_unit {} {
declare_labels int_type
the_type_i: structure_type {
{name s}
{byte_size 4 sdata}
} {
member {
{name i}
{type :$int_type}
}
}
int_type: base_type {
{name int}
{encoding @DW_ATE_signed}
{byte_size 4 sdata}
}
}
}
tu {} 0x0000000000000002 the_type_j {
type_unit {} {
declare_labels int_type
the_type_j: structure_type {
{name s}
{byte_size 4 sdata}
} {
member {
{name j}
{type :$int_type}
}
}
int_type: base_type {
{name int}
{encoding @DW_ATE_signed}
{byte_size 4 sdata}
}
}
}
}
# We're using an object instead of executable here to keep cc-with-tweaks.sh
# from modifying it. It also means we can set the build-id, rather than
# having to extract it.
if { [gdb_compile $asm_file $binfile.dwz object {nodebug}] != "" } {
return -1
}
set host_dwz_file [gdb_remote_download host $binfile.dwz]
# Make some DWARF for the executable.
set asm_file [standard_output_file $srcfile3]
Dwarf::assemble $asm_file {
gnu_debugaltlink $::host_dwz_file $::build_id
cu {} {
compile_unit {
{DW_AT_language @DW_LANG_C}
{DW_AT_name main.c}
} {
structure_type {
{name s}
{signature 0x0000000000000001 ref_sig8}
{declaration 1 flag}
}
DW_TAG_subprogram {
{MACRO_AT_func {main}}
}
}
}
cu {} {
compile_unit {
{DW_AT_language @DW_LANG_C}
{DW_AT_name foo.c}
} {
structure_type {
{name s}
{signature 0x0000000000000002 ref_sig8}
{declaration 1 flag}
}
DW_TAG_subprogram {
{MACRO_AT_func {foo}}
}
}
}
}
if { [prepare_for_testing "failed to prepare" ${testfile} \
[list $srcfile $asm_file] {nodebug}] } {
return -1
}
set re "Dwarf Error: .debug_types section not supported in dwz file"
gdb_assert { [regexp $re $gdb_file_cmd_msg] } "Dwarf Error message"