Files
binutils-gdb/gdb/dwarf2/read-gdb-index.h
Tom Tromey 486bc5ac81 Rewrite the .gdb_index reader
This patch rewrites the .gdb_index reader to create the same data
structures that are created by the cooked indexer and the .debug_names
reader.

This is done in support of this series; but also because, from what I
can tell, the "templates.exp" change didn't really work properly with
this reader.

In addition to fixing that problem, this patch removes a lot of code.

Implementing this required a couple of hacks, as .gdb_index does not
contain all the information that's used by the cooked index
implementation.

* The index-searching code likes to differentiate between the various
  DWARF tags when matching, but .gdb_index lumps many things into a
  single "other" category.  To handle this, we introduce a phony tag
  that's used so that the match method can match on multiple domains.

* Similarly, .gdb_index doesn't distinguish between the type and
  struct domains, so another phony tag is used for this.

* The reader must attempt to guess the language of various symbols.
  This is somewhat finicky.  "Plain" (unqualified) symbols are marked
  as language_unknown and then a couple of hacks are used to handle
  these -- one in expand_symtabs_matching and another when recognizing
  "main".

For what it's worth, I consider .gdb_index to be near the end of its
life.  While .debug_names is not perfect -- we found a number of bugs
in the standard while implementing it -- it is better than .gdb_index
and also better documented.

After this patch, we could conceivably remove dwarf_scanner_base.
However, I have not done this.

Finally, this patch also changes this reader to dump the content of
the index, as the other DWARF readers do.  This can be handy when
debugging gdb.

Acked-By: Simon Marchi <simon.marchi@efficios.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33316
2025-09-10 16:05:28 -06:00

63 lines
2.3 KiB
C

/* Reading code for .gdb_index
Copyright (C) 2023-2025 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_READ_GDB_INDEX_H
#define GDB_DWARF2_READ_GDB_INDEX_H
#include "gdbsupport/function-view.h"
struct dwarf2_per_bfd;
struct dwarf2_per_objfile;
struct dwz_file;
struct objfile;
/* .gdb_index doesn't distinguish between the various "other" symbols
-- but the symbol search machinery really wants to. For example,
an imported decl is "other" but is really a namespace and thus in
TYPE_DOMAIN; whereas a Fortran module is also "other" but is in the
MODULE_DOMAIN. We use this value internally to represent the
"other" case so that matching can work. The exact value does not
matter, all that matters here is that it won't overlap with any
symbol that gdb might create. */
#define DW_TAG_GDB_INDEX_OTHER 0xffff
/* Similarly, .gdb_index can't distinguish between the type and struct
domains. This is a special tag that inhabits both. */
#define DW_TAG_GDB_INDEX_TYPE 0xfffe
/* Callback types for dwarf2_read_gdb_index. */
typedef gdb::function_view
<gdb::array_view<const gdb_byte>(objfile *, dwarf2_per_bfd *)>
get_gdb_index_contents_ftype;
typedef gdb::function_view
<gdb::array_view<const gdb_byte>(objfile *, dwz_file *)>
get_gdb_index_contents_dwz_ftype;
/* Read .gdb_index. If everything went ok, initialize the "quick"
elements of all the CUs and return true. Otherwise, return
false. */
bool dwarf2_read_gdb_index
(dwarf2_per_objfile *per_objfile,
get_gdb_index_contents_ftype get_gdb_index_contents,
get_gdb_index_contents_dwz_ftype get_gdb_index_contents_dwz);
#endif /* GDB_DWARF2_READ_GDB_INDEX_H */