mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
932539d7a3
Currently pointers to all partial symbols are stored in two vectors; and then indices into these vectors are stored in each partial_symtab. This patch changes this so that each partial symtab instead has vectors of symbols. add_psymbol_to_list can now be changed into a method on partial_symtab as well. My main motivation for doing this is that I am looking into calling sort_pst_symbols in the background. However, I haven't actually implemented this yet. (Also this may make it more feasible to also sort the static psymbols, though I haven't tried that either.) Also, though, this lets us remove the "current_global_psymbols" vector, because now the callers can simply refer directly to the psymtab that they are modifying (formerly this was implicit). The main drawback of this patch is that it increases the size of partial symtab. gdb/ChangeLog 2020-10-17 Tom Tromey <tom@tromey.com> * xcoffread.c (xcoff_end_psymtab): Use partial_symtab::empty. (scan_xcoff_symtab): Update. * psymtab.h (class psymtab_storage) <global_psymbols, static_psymbols, current_global_psymbols, current_static_psymbols>: Remove. * psymtab.c (require_partial_symbols, find_pc_sect_psymbol) (match_partial_symbol, lookup_partial_symbol): Update. (print_partial_symbols): Change parameters. (dump_psymtab, recursively_search_psymtabs) (psym_fill_psymbol_map, psym_find_compunit_symtab_by_address) (sort_pst_symbols, partial_symtab::partial_symtab): Update. (concat): Remove. (end_psymtab_common): Simplify. (append_psymbol_to_list): Change parameters. (partial_symtabs::add_psymbol): Rename from add_psymbol_to_list. (init_psymbol_list): Simplify. (maintenance_info_psymtabs, maintenance_check_psymtabs): Update. * psympriv.h (struct partial_symtab) <empty>: New method. <globals_offset, n_global_syms, statics_offset, n_static_syms>: Remove. <global_psymbols, static_psymbols>: New members. <add_psymbol>: New methods. (add_psymbol_to_list): Don't declare. (psymbol_placement): Move earlier. * mdebugread.c (parse_partial_symbols): Update. (handle_psymbol_enumerators): Change parameters. (mdebug_expand_psymtab): Update. * dwarf2/read.c (process_psymtab_comp_unit_reader) (add_partial_symbol): Update. * dwarf2/index-write.c (write_psymbols): Change parameters. (write_one_signatured_type): Update. (recursively_count_psymbols): Update. (recursively_write_psymbols): Update. (class debug_names) <recursively_write_psymbols>: Update. <write_psymbols>: Change parameters. <write_one_signatured_type>: Update. * dbxread.c (read_dbx_symtab): Update. (dbx_end_psymtab): Use partial_symtab::empty. * ctfread.c (struct ctf_context) <pst>: New member. (create_partial_symtab): Set it. (ctf_psymtab_type_cb, ctf_psymtab_var_cb): Update. (scan_partial_symbols): Use the psymtab's context. Update.
163 lines
5.4 KiB
C++
163 lines
5.4 KiB
C++
/* Public partial symbol table definitions.
|
|
|
|
Copyright (C) 2009-2020 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 PSYMTAB_H
|
|
#define PSYMTAB_H
|
|
|
|
#include "gdb_obstack.h"
|
|
#include "symfile.h"
|
|
#include "gdbsupport/next-iterator.h"
|
|
#include "bcache.h"
|
|
|
|
struct partial_symbol;
|
|
|
|
/* Specialization of bcache to store partial symbols. */
|
|
|
|
struct psymbol_bcache : public gdb::bcache
|
|
{
|
|
/* Calculate a hash code for the given partial symbol. The hash is
|
|
calculated using the symbol's value, language, domain, class
|
|
and name. These are the values which are set by
|
|
add_psymbol_to_bcache. */
|
|
unsigned long hash (const void *addr, int length) override;
|
|
|
|
/* Returns true if the symbol LEFT equals the symbol RIGHT.
|
|
For the comparison this function uses a symbols value,
|
|
language, domain, class and name. */
|
|
int compare (const void *left, const void *right, int length) override;
|
|
};
|
|
|
|
/* An instance of this class manages the partial symbol tables and
|
|
partial symbols for a given objfile.
|
|
|
|
The core psymtab functions -- those in psymtab.c -- arrange for
|
|
nearly all psymtab- and psymbol-related allocations to happen
|
|
either in the psymtab_storage object (either on its obstack or in
|
|
other memory managed by this class), or on the per-BFD object. The
|
|
only link from the psymtab storage object back to the objfile (or
|
|
objfile_obstack) that is made by the core psymtab code is the
|
|
compunit_symtab member in the standard_psymtab -- and a given
|
|
symbol reader can avoid this by implementing its own subclasses of
|
|
partial_symtab.
|
|
|
|
However, it is up to each symbol reader to maintain this invariant
|
|
in other ways, if it wants to reuse psymtabs across multiple
|
|
objfiles. The main issue here is ensuring that read_symtab_private
|
|
does not point into objfile_obstack. */
|
|
|
|
class psymtab_storage
|
|
{
|
|
public:
|
|
psymtab_storage () = default;
|
|
~psymtab_storage ();
|
|
|
|
DISABLE_COPY_AND_ASSIGN (psymtab_storage);
|
|
|
|
/* Discard all partial symbol tables starting with "psymtabs" and
|
|
proceeding until "to" has been discarded. */
|
|
|
|
void discard_psymtabs_to (struct partial_symtab *to)
|
|
{
|
|
while (psymtabs != to)
|
|
discard_psymtab (psymtabs);
|
|
}
|
|
|
|
/* Discard the partial symbol table. */
|
|
|
|
void discard_psymtab (struct partial_symtab *pst);
|
|
|
|
/* Return the obstack that is used for storage by this object. */
|
|
|
|
struct obstack *obstack ()
|
|
{
|
|
if (!m_obstack.has_value ())
|
|
m_obstack.emplace ();
|
|
return &*m_obstack;
|
|
}
|
|
|
|
/* Allocate storage for the "dependencies" field of a psymtab.
|
|
NUMBER says how many dependencies there are. */
|
|
|
|
struct partial_symtab **allocate_dependencies (int number)
|
|
{
|
|
return OBSTACK_CALLOC (obstack (), number, struct partial_symtab *);
|
|
}
|
|
|
|
/* Install a psymtab on the psymtab list. This transfers ownership
|
|
of PST to this object. */
|
|
|
|
void install_psymtab (partial_symtab *pst);
|
|
|
|
typedef next_adapter<struct partial_symtab> partial_symtab_range;
|
|
|
|
/* A range adapter that makes it possible to iterate over all
|
|
psymtabs in one objfile. */
|
|
|
|
partial_symtab_range range ()
|
|
{
|
|
return partial_symtab_range (psymtabs);
|
|
}
|
|
|
|
|
|
/* Each objfile points to a linked list of partial symtabs derived from
|
|
this file, one partial symtab structure for each compilation unit
|
|
(source file). */
|
|
|
|
struct partial_symtab *psymtabs = nullptr;
|
|
|
|
/* Map addresses to the entries of PSYMTABS. It would be more efficient to
|
|
have a map per the whole process but ADDRMAP cannot selectively remove
|
|
its items during FREE_OBJFILE. This mapping is already present even for
|
|
PARTIAL_SYMTABs which still have no corresponding full SYMTABs read.
|
|
|
|
The DWARF parser reuses this addrmap to store things other than
|
|
psymtabs in the cases where debug information is being read from, for
|
|
example, the .debug-names section. */
|
|
|
|
struct addrmap *psymtabs_addrmap = nullptr;
|
|
|
|
/* A byte cache where we can stash arbitrary "chunks" of bytes that
|
|
will not change. */
|
|
|
|
psymbol_bcache psymbol_cache;
|
|
|
|
private:
|
|
|
|
/* The obstack where allocations are made. This is lazily allocated
|
|
so that we don't waste memory when there are no psymtabs. */
|
|
|
|
gdb::optional<auto_obstack> m_obstack;
|
|
};
|
|
|
|
|
|
extern const struct quick_symbol_functions psym_functions;
|
|
|
|
extern const struct quick_symbol_functions dwarf2_gdb_index_functions;
|
|
extern const struct quick_symbol_functions dwarf2_debug_names_functions;
|
|
|
|
/* Ensure that the partial symbols for OBJFILE have been loaded. If
|
|
VERBOSE is true, then this will print a message when symbols
|
|
are loaded. This function returns a range adapter suitable for
|
|
iterating over the psymtabs of OBJFILE. */
|
|
|
|
extern psymtab_storage::partial_symtab_range require_partial_symbols
|
|
(struct objfile *objfile, bool verbose);
|
|
|
|
#endif /* PSYMTAB_H */
|