diff options
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r-- | gdb/dwarf2/cooked-index.h | 7 | ||||
-rw-r--r-- | gdb/dwarf2/index-write.c | 14 | ||||
-rw-r--r-- | 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 e1ff056..21bda86 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" struct dwarf2_per_cu_data; @@ -107,11 +108,13 @@ struct cooked_index_entry : public allocate_on_obstack switch (kind) { case VARIABLES_DOMAIN: - return tag == DW_TAG_variable; + return (tag == DW_TAG_variable + || tag == DW_TAG_constant + || tag == DW_TAG_enumerator); case FUNCTIONS_DOMAIN: return tag == DW_TAG_subprogram; case TYPES_DOMAIN: - return tag == DW_TAG_typedef || tag == DW_TAG_structure_type; + return tag_is_type (tag); case MODULES_DOMAIN: return tag == DW_TAG_module; } diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c index 3d1c78d..e27c2b5 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" #include <algorithm> #include <cmath> @@ -569,7 +570,18 @@ public: const auto it = m_cu_index_htab.find (entry->per_cu); gdb_assert (it != m_cu_index_htab.cend ()); const char *name = entry->full_name (&m_string_obstack); - insert (entry->tag, name, it->second, (entry->flags & IS_STATIC) != 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 = entry->tag; + if (tag != DW_TAG_typedef && tag_is_type (tag)) + tag = DW_TAG_structure_type; + else if (tag == DW_TAG_enumerator || tag == DW_TAG_constant) + tag = DW_TAG_variable; + + insert (tag, name, it->second, (entry->flags & IS_STATIC) != 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 0000000..735a6d5 --- /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 <http://www.gnu.org/licenses/>. */ + +#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 */ |