From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2126) id D66393858C2C; Fri, 29 Apr 2022 20:26:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D66393858C2C Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Tom Tromey To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Fix .debug_names regression with new indexer X-Act-Checkin: binutils-gdb X-Git-Author: Tom Tromey X-Git-Refname: refs/heads/master X-Git-Oldrev: 225170409b47bc96b62b2ecfcc0d9d5ae1ef8949 X-Git-Newrev: 446fcb446f57dbb33728c3dbd5f092bca3ba3547 Message-Id: <20220429202606.D66393858C2C@sourceware.org> Date: Fri, 29 Apr 2022 20:26:06 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Apr 2022 20:26:06 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D446fcb446f57= dbb33728c3dbd5f092bca3ba3547 commit 446fcb446f57dbb33728c3dbd5f092bca3ba3547 Author: Tom Tromey Date: Thu Apr 21 07:28:56 2022 -0600 Fix .debug_names regression with new indexer =20 At AdaCore, we run the internal gdb test suite in several modes, including one using the .debug_names index. This caught a regression caused by the new DWARF indexer. =20 First, the psymtabs-based .debug_names generator was completely wrong. However, to avoid making the rewrite series even bigger (fixing the writer will also require rewriting the .debug_names reader), it attempted to preserve the weirdness. =20 However, this was not done properly. For example the old writer did this: =20 - case STRUCT_DOMAIN: - return DW_TAG_structure_type; =20 The new code, instead, simply preserves the actual DWARF tag -- but this makes future lookups fail, because the .debug_names reader only looks for DW_TAG_structure_type. =20 This patch attempts to revert to the old behavior in the writer. Diff: --- gdb/dwarf2/cooked-index.h | 7 +++-- gdb/dwarf2/index-write.c | 14 +++++++++- gdb/dwarf2/tag.h | 67 +++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 85 insertions(+), 3 deletions(-) diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h index e1ff05645c5..21bda8698c1 100644 --- a/gdb/dwarf2/cooked-index.h +++ b/gdb/dwarf2/cooked-index.h @@ -32,6 +32,7 @@ #include "gdbsupport/iterator-range.h" #include "gdbsupport/thread-pool.h" #include "dwarf2/mapped-index.h" +#include "dwarf2/tag.h" =20 struct dwarf2_per_cu_data; =20 @@ -107,11 +108,13 @@ struct cooked_index_entry : public allocate_on_obstack switch (kind) { case VARIABLES_DOMAIN: - return tag =3D=3D DW_TAG_variable; + return (tag =3D=3D DW_TAG_variable + || tag =3D=3D DW_TAG_constant + || tag =3D=3D DW_TAG_enumerator); case FUNCTIONS_DOMAIN: return tag =3D=3D DW_TAG_subprogram; case TYPES_DOMAIN: - return tag =3D=3D DW_TAG_typedef || tag =3D=3D DW_TAG_structure_type; + return tag_is_type (tag); case MODULES_DOMAIN: return tag =3D=3D DW_TAG_module; } diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c index 3d1c78d4459..e27c2b5fddd 100644 --- a/gdb/dwarf2/index-write.c +++ b/gdb/dwarf2/index-write.c @@ -37,6 +37,7 @@ #include "gdbcmd.h" #include "objfiles.h" #include "ada-lang.h" +#include "dwarf2/tag.h" =20 #include #include @@ -569,7 +570,18 @@ public: const auto it =3D m_cu_index_htab.find (entry->per_cu); gdb_assert (it !=3D m_cu_index_htab.cend ()); const char *name =3D entry->full_name (&m_string_obstack); - insert (entry->tag, name, it->second, (entry->flags & IS_STATIC) !=3D = 0, + + /* This is incorrect but it mirrors gdb's historical behavior; and + because the current .debug_names generation is also incorrect, + it seems better to follow what was done before, rather than + introduce a mismatch between the newer and older gdb. */ + dwarf_tag tag =3D entry->tag; + if (tag !=3D DW_TAG_typedef && tag_is_type (tag)) + tag =3D DW_TAG_structure_type; + else if (tag =3D=3D DW_TAG_enumerator || tag =3D=3D DW_TAG_constant) + tag =3D DW_TAG_variable; + + insert (tag, name, it->second, (entry->flags & IS_STATIC) !=3D 0, entry->per_cu->is_debug_types ? unit_kind::tu : unit_kind::cu, entry->per_cu->lang); } diff --git a/gdb/dwarf2/tag.h b/gdb/dwarf2/tag.h new file mode 100644 index 00000000000..735a6d581be --- /dev/null +++ b/gdb/dwarf2/tag.h @@ -0,0 +1,67 @@ +/* Tag attributes + + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . = */ + +#ifndef GDB_DWARF2_TAG_H +#define GDB_DWARF2_TAG_H + +#include "dwarf2.h" + +/* Return true if TAG represents a type, false otherwise. */ + +static inline bool +tag_is_type (dwarf_tag tag) +{ + switch (tag) + { + case DW_TAG_padding: + case DW_TAG_array_type: + case DW_TAG_class_type: + case DW_TAG_enumeration_type: + case DW_TAG_pointer_type: + case DW_TAG_reference_type: + case DW_TAG_string_type: + case DW_TAG_structure_type: + case DW_TAG_subroutine_type: + case DW_TAG_typedef: + case DW_TAG_union_type: + case DW_TAG_ptr_to_member_type: + case DW_TAG_set_type: + case DW_TAG_subrange_type: + case DW_TAG_base_type: + case DW_TAG_const_type: + case DW_TAG_packed_type: + case DW_TAG_template_type_param: + case DW_TAG_volatile_type: + case DW_TAG_restrict_type: + case DW_TAG_interface_type: + case DW_TAG_namespace: + case DW_TAG_unspecified_type: + case DW_TAG_shared_type: + case DW_TAG_rvalue_reference_type: + case DW_TAG_coarray_type: + case DW_TAG_dynamic_type: + case DW_TAG_atomic_type: + case DW_TAG_immutable_type: + return true; + default: + return false; + } +} + +#endif /* GDB_DWARF2_TAG_H */