From b7cadd86197e55698db85441b2792ca330a71a75 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 1 Aug 2023 10:08:23 -0600 Subject: [PATCH] Merge psympriv.h into psymtab.h psympriv.h was intended for use by code that created partial symbols. Now that no generic code needs psymtab.h any more, psympriv.h can be merged into psymtab.h. --- gdb/Makefile.in | 1 - gdb/ctfread.c | 2 +- gdb/dbxread.c | 2 +- gdb/mdebugread.c | 2 +- gdb/psympriv.h | 588 ----------------------------------------------- gdb/psymtab.c | 14 +- gdb/psymtab.h | 565 ++++++++++++++++++++++++++++++++++++++++++++- gdb/xcoffread.c | 2 +- 8 files changed, 574 insertions(+), 602 deletions(-) delete mode 100644 gdb/psympriv.h diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 54c5312e19a..9b992a3d8c0 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1438,7 +1438,6 @@ HFILES_NO_SRCDIR = \ progspace.h \ progspace-and-thread.h \ prologue-value.h \ - psympriv.h \ psymtab.h \ ravenscar-thread.h \ record.h \ diff --git a/gdb/ctfread.c b/gdb/ctfread.c index 005862c1097..16292c74b1a 100644 --- a/gdb/ctfread.c +++ b/gdb/ctfread.c @@ -80,7 +80,7 @@ #include "complaints.h" #include "block.h" #include "ctfread.h" -#include "psympriv.h" +#include "psymtab.h" #if ENABLE_LIBCTF diff --git a/gdb/dbxread.c b/gdb/dbxread.c index ddc61d9d539..7cddf6586ed 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -49,7 +49,7 @@ #include "cp-abi.h" #include "cp-support.h" #include "c-lang.h" -#include "psympriv.h" +#include "psymtab.h" #include "block.h" #include "aout/aout64.h" #include "aout/stab_gnu.h" /* We always use GNU stabs, not diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 83d287b523b..40ebe6ae9c5 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -55,7 +55,7 @@ #include "dictionary.h" #include "mdebugread.h" #include -#include "psympriv.h" +#include "psymtab.h" #include "source.h" #include "bfd.h" diff --git a/gdb/psympriv.h b/gdb/psympriv.h deleted file mode 100644 index 17c45e9220a..00000000000 --- a/gdb/psympriv.h +++ /dev/null @@ -1,588 +0,0 @@ -/* Private partial symbol table definitions. - - Copyright (C) 2009-2023 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 PSYMPRIV_H -#define PSYMPRIV_H - -#include "psymtab.h" -#include "objfiles.h" -#include "gdbsupport/gdb_string_view.h" - -/* A partial_symbol records the name, domain, and address class of - symbols whose types we have not parsed yet. For functions, it also - contains their memory address, so we can find them from a PC value. - Each partial_symbol sits in a partial_symtab, all of which are chained - on a partial symtab list and which points to the corresponding - normal symtab once the partial_symtab has been referenced. */ - -/* This structure is space critical. See space comments at the top of - symtab.h. */ - -struct partial_symbol -{ - /* Return the section for this partial symbol, or nullptr if no - section has been set. */ - struct obj_section *obj_section (struct objfile *objfile) const - { - return ginfo.obj_section (objfile); - } - - /* Return the unrelocated address of this partial symbol. */ - unrelocated_addr unrelocated_address () const - { - return ginfo.unrelocated_address (); - } - - /* Return the address of this partial symbol, relocated according to - the offsets provided in OBJFILE. */ - CORE_ADDR address (const struct objfile *objfile) const - { - return (CORE_ADDR (ginfo.unrelocated_address ()) - + objfile->section_offsets[ginfo.section_index ()]); - } - - /* Set the address of this partial symbol. The address must be - unrelocated. */ - void set_unrelocated_address (unrelocated_addr addr) - { - ginfo.set_unrelocated_address (addr); - } - - /* Note that partial_symbol does not derive from general_symbol_info - due to the bcache. See add_psymbol_to_bcache. */ - - struct general_symbol_info ginfo; - - /* Name space code. */ - - ENUM_BITFIELD(domain_enum) domain : SYMBOL_DOMAIN_BITS; - - /* Address class (for info_symbols). Note that we don't allow - synthetic "aclass" values here at present, simply because there's - no need. */ - - ENUM_BITFIELD(address_class) aclass : SYMBOL_ACLASS_BITS; -}; - -/* A convenience enum to give names to some constants used when - searching psymtabs. This is internal to psymtab and should not be - used elsewhere. */ - -enum psymtab_search_status - { - PST_NOT_SEARCHED, - PST_SEARCHED_AND_FOUND, - PST_SEARCHED_AND_NOT_FOUND - }; - -/* Specify whether a partial psymbol should be allocated on the global - list or the static list. */ - -enum class psymbol_placement -{ - STATIC, - GLOBAL -}; - -/* Each source file that has not been fully read in is represented by - a partial_symtab. This contains the information on where in the - executable the debugging symbols for a specific file are, and a - list of names of global symbols which are located in this file. - They are all chained on partial symtab lists. - - Even after the source file has been read into a symtab, the - partial_symtab remains around. */ - -struct partial_symtab -{ - /* Allocate a new partial symbol table. - - FILENAME (which must be non-NULL) is the filename of this partial - symbol table; it is copied into the appropriate storage. The - partial symtab will also be installed using - psymtab_storage::install. */ - - partial_symtab (const char *filename, - psymtab_storage *partial_symtabs, - objfile_per_bfd_storage *objfile_per_bfd) - ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); - - /* Like the above, but also sets the initial text low and text high - from the ADDR argument, and sets the global- and - static-offsets. */ - - partial_symtab (const char *filename, - psymtab_storage *partial_symtabs, - objfile_per_bfd_storage *objfile_per_bfd, - unrelocated_addr addr) - ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); - - virtual ~partial_symtab () - { - } - - /* Psymtab expansion is done in two steps: - - a call to read_symtab - - while that call is in progress, calls to expand_psymtab can be made, - both for this psymtab, and its dependencies. - This makes a distinction between a toplevel psymtab (for which both - read_symtab and expand_psymtab will be called) and a non-toplevel - psymtab (for which only expand_psymtab will be called). The - distinction can be used f.i. to do things before and after all - dependencies of a top-level psymtab have been expanded. - - Read the full symbol table corresponding to this partial symbol - table. Typically calls expand_psymtab. */ - virtual void read_symtab (struct objfile *) = 0; - - /* Expand the full symbol table for this partial symbol table. Typically - calls expand_dependencies. */ - virtual void expand_psymtab (struct objfile *) = 0; - - /* Ensure that all the dependencies are read in. Calls - expand_psymtab for each non-shared dependency. */ - void expand_dependencies (struct objfile *); - - /* Return true if the symtab corresponding to this psymtab has been - read in in the context of this objfile. */ - virtual bool readin_p (struct objfile *) const = 0; - - /* Return a pointer to the compunit allocated for this source file - in the context of this objfile. - - Return nullptr if the compunit was not read in or if there was no - symtab. */ - virtual struct compunit_symtab *get_compunit_symtab - (struct objfile *) const = 0; - - /* Return the unrelocated low text address of this - partial_symtab. */ - unrelocated_addr unrelocated_text_low () const - { - return m_text_low; - } - - /* Return the unrelocated_addr high text address of this - partial_symtab. */ - unrelocated_addr unrelocated_text_high () const - { - return m_text_high; - } - - /* Return the relocated low text address of this partial_symtab. */ - CORE_ADDR text_low (struct objfile *objfile) const - { - return CORE_ADDR (m_text_low) + objfile->text_section_offset (); - } - - /* Return the relocated high text address of this partial_symtab. */ - CORE_ADDR text_high (struct objfile *objfile) const - { - return CORE_ADDR (m_text_high) + objfile->text_section_offset (); - } - - /* Set the low text address of this partial_symtab. */ - void set_text_low (unrelocated_addr addr) - { - m_text_low = addr; - text_low_valid = 1; - } - - /* Set the high text address of this partial_symtab. */ - void set_text_high (unrelocated_addr addr) - { - m_text_high = addr; - text_high_valid = 1; - } - - /* Return true if this symtab is empty -- meaning that it contains - no symbols. It may still have dependencies. */ - bool empty () const - { - return global_psymbols.empty () && static_psymbols.empty (); - } - - /* Add a symbol to this partial symbol table of OBJFILE. - - If COPY_NAME is true, make a copy of NAME, otherwise use the passed - reference. - - THECLASS is the type of symbol. - - SECTION is the index of the section of OBJFILE in which the symbol is found. - - WHERE determines whether the symbol goes in the list of static or global - partial symbols. - - COREADDR is the address of the symbol. For partial symbols that don't have - an address, zero is passed. - - LANGUAGE is the language from which the symbol originates. This will - influence, amongst other things, how the symbol name is demangled. */ - - void add_psymbol (gdb::string_view name, - bool copy_name, domain_enum domain, - enum address_class theclass, - short section, - psymbol_placement where, - unrelocated_addr coreaddr, - enum language language, - psymtab_storage *partial_symtabs, - struct objfile *objfile); - - /* Add a symbol to this partial symbol table of OBJFILE. The psymbol - must be fully constructed, and the names must be set and intern'd - as appropriate. */ - - void add_psymbol (const partial_symbol &psym, - psymbol_placement where, - psymtab_storage *partial_symtabs, - struct objfile *objfile); - - - /* Indicate that this partial symtab is complete. */ - - void end (); - - /* Chain of all existing partial symtabs. */ - - struct partial_symtab *next = nullptr; - - /* Name of the source file which this partial_symtab defines, - or if the psymtab is anonymous then a descriptive name for - debugging purposes, or "". It must not be NULL. */ - - const char *filename = nullptr; - - /* Full path of the source file. NULL if not known. */ - - char *fullname = nullptr; - - /* Directory in which it was compiled, or NULL if we don't know. */ - - const char *dirname = nullptr; - - /* Range of text addresses covered by this file; texthigh is the - beginning of the next section. Do not refer directly to these - fields. Instead, use the accessors. The validity of these - fields is determined by the text_low_valid and text_high_valid - fields; these are located later in this structure for better - packing. */ - - unrelocated_addr m_text_low {}; - unrelocated_addr m_text_high {}; - - /* If NULL, this is an ordinary partial symbol table. - - If non-NULL, this holds a single includer of this partial symbol - table, and this partial symbol table is a shared one. - - A shared psymtab is one that is referenced by multiple other - psymtabs, and which conceptually has its contents directly - included in those. - - Shared psymtabs have special semantics. When a search finds a - symbol in a shared table, we instead return one of the non-shared - tables that include this one. - - A shared psymtabs can be referred to by other shared ones. - - The psymtabs that refer to a shared psymtab will list the shared - psymtab in their 'dependencies' array. - - In DWARF terms, a shared psymtab is a DW_TAG_partial_unit; but - of course using a name based on that would be too confusing, so - "shared" was chosen instead. - - Only a single user is needed because, when expanding a shared - psymtab, we only need to expand its "canonical" non-shared user. - The choice of which one should be canonical is left to the - debuginfo reader; it can be arbitrary. */ - - struct partial_symtab *user = nullptr; - - /* Array of pointers to all of the partial_symtab's which this one - depends on. Since this array can only be set to previous or - the current (?) psymtab, this dependency tree is guaranteed not - to have any loops. "depends on" means that symbols must be read - for the dependencies before being read for this psymtab; this is - for type references in stabs, where if foo.c includes foo.h, declarations - in foo.h may use type numbers defined in foo.c. For other debugging - formats there may be no need to use dependencies. */ - - struct partial_symtab **dependencies = nullptr; - - int number_of_dependencies = 0; - - /* Global symbol list. This list will be sorted after readin to - improve access. Binary search will be the usual method of - finding a symbol within it. */ - - std::vector global_psymbols; - - /* Static symbol list. This list will *not* be sorted after readin; - to find a symbol in it, exhaustive search must be used. This is - reasonable because searches through this list will eventually - lead to either the read in of a files symbols for real (assumed - to take a *lot* of time; check) or an error (and we don't care - how long errors take). */ - - std::vector static_psymbols; - - /* True if the name of this partial symtab is not a source file name. */ - - bool anonymous = false; - - /* A flag that is temporarily used when searching psymtabs. */ - - ENUM_BITFIELD (psymtab_search_status) searched_flag : 2; - - /* Validity of the m_text_low and m_text_high fields. */ - - unsigned int text_low_valid : 1; - unsigned int text_high_valid : 1; -}; - -/* A partial symtab that tracks the "readin" and "compunit_symtab" - information in the ordinary way -- by storing it directly in this - object. */ -struct standard_psymtab : public partial_symtab -{ - standard_psymtab (const char *filename, - psymtab_storage *partial_symtabs, - objfile_per_bfd_storage *objfile_per_bfd) - : partial_symtab (filename, partial_symtabs, objfile_per_bfd) - { - } - - standard_psymtab (const char *filename, - psymtab_storage *partial_symtabs, - objfile_per_bfd_storage *objfile_per_bfd, - unrelocated_addr addr) - : partial_symtab (filename, partial_symtabs, objfile_per_bfd, addr) - { - } - - bool readin_p (struct objfile *) const override - { - return readin; - } - - struct compunit_symtab *get_compunit_symtab (struct objfile *) const override - { - return compunit_symtab; - } - - /* True if the symtab corresponding to this psymtab has been - readin. */ - - bool readin = false; - - /* Pointer to compunit eventually allocated for this source file, 0 if - !readin or if we haven't looked for the symtab after it was readin. */ - - struct compunit_symtab *compunit_symtab = nullptr; -}; - -/* A partial_symtab that works in the historical db way. This should - not be used in new code, but exists to transition the somewhat - unmaintained "legacy" debug formats. */ - -struct legacy_psymtab : public standard_psymtab -{ - legacy_psymtab (const char *filename, - psymtab_storage *partial_symtabs, - objfile_per_bfd_storage *objfile_per_bfd) - : standard_psymtab (filename, partial_symtabs, objfile_per_bfd) - { - } - - legacy_psymtab (const char *filename, - psymtab_storage *partial_symtabs, - objfile_per_bfd_storage *objfile_per_bfd, - unrelocated_addr addr) - : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr) - { - } - - void read_symtab (struct objfile *objf) override - { - if (legacy_read_symtab) - (*legacy_read_symtab) (this, objf); - } - - void expand_psymtab (struct objfile *objf) override - { - (*legacy_expand_psymtab) (this, objf); - } - - /* Pointer to function which will read in the symtab corresponding to - this psymtab. */ - - void (*legacy_read_symtab) (legacy_psymtab *, struct objfile *) = nullptr; - - /* Pointer to function which will actually expand this psymtab into - a full symtab. */ - - void (*legacy_expand_psymtab) (legacy_psymtab *, struct objfile *) = nullptr; - - /* Information that lets read_symtab() locate the part of the symbol table - that this psymtab corresponds to. This information is private to the - format-dependent symbol reading routines. For further detail examine - the various symbol reading modules. */ - - void *read_symtab_private = nullptr; -}; - -/* Used when recording partial symbol tables. On destruction, - discards any partial symbol tables that have been built. However, - the tables can be kept by calling the "keep" method. */ -class psymtab_discarder -{ - public: - - psymtab_discarder (psymtab_storage *partial_symtabs) - : m_partial_symtabs (partial_symtabs), - m_psymtab (partial_symtabs->psymtabs) - { - } - - ~psymtab_discarder () - { - if (m_partial_symtabs != nullptr) - m_partial_symtabs->discard_psymtabs_to (m_psymtab); - } - - /* Keep any partial symbol tables that were built. */ - void keep () - { - m_partial_symtabs = nullptr; - } - - private: - - /* The partial symbol storage object. */ - psymtab_storage *m_partial_symtabs; - /* How far back to free. */ - struct partial_symtab *m_psymtab; -}; - -/* An implementation of quick_symbol_functions, specialized for - partial symbols. */ -struct psymbol_functions : public quick_symbol_functions -{ - explicit psymbol_functions (const std::shared_ptr &storage) - : m_partial_symtabs (storage) - { - } - - psymbol_functions () - : m_partial_symtabs (new psymtab_storage) - { - } - - bool has_symbols (struct objfile *objfile) override; - - bool has_unexpanded_symtabs (struct objfile *objfile) override; - - struct symtab *find_last_source_symtab (struct objfile *objfile) override; - - void forget_cached_source_info (struct objfile *objfile) override; - - enum language lookup_global_symbol_language (struct objfile *objfile, - const char *name, - domain_enum domain, - bool *symbol_found_p) override; - - void print_stats (struct objfile *objfile, bool print_bcache) override; - - void dump (struct objfile *objfile) override; - - void expand_all_symtabs (struct objfile *objfile) override; - - void expand_matching_symbols - (struct objfile *, - const lookup_name_info &lookup_name, - domain_enum domain, - int global, - symbol_compare_ftype *ordered_compare) override; - - bool expand_symtabs_matching - (struct objfile *objfile, - gdb::function_view file_matcher, - const lookup_name_info *lookup_name, - gdb::function_view symbol_matcher, - gdb::function_view expansion_notify, - block_search_flags search_flags, - domain_enum domain, - enum search_domain kind) override; - - struct compunit_symtab *find_pc_sect_compunit_symtab - (struct objfile *objfile, struct bound_minimal_symbol msymbol, - CORE_ADDR pc, struct obj_section *section, int warn_if_readin) override; - - struct compunit_symtab *find_compunit_symtab_by_address - (struct objfile *objfile, CORE_ADDR address) override - { - return nullptr; - } - - void map_symbol_filenames (struct objfile *objfile, - gdb::function_view fun, - bool need_fullname) override; - - /* Return a range adapter for the psymtabs. */ - psymtab_storage::partial_symtab_range partial_symbols - (struct objfile *objfile); - - /* Return the partial symbol storage associated with this - object. */ - const std::shared_ptr &get_partial_symtabs () const - { - return m_partial_symtabs; - } - - /* Replace the partial symbol table storage in this object with - SYMS. */ - void set_partial_symtabs (const std::shared_ptr &syms) - { - m_partial_symtabs = syms; - } - - /* Find which partial symtab contains PC and SECTION. Return NULL if - none. We return the psymtab that contains a symbol whose address - exactly matches PC, or, if we cannot find an exact match, the - psymtab that contains a symbol whose address is closest to PC. */ - - struct partial_symtab *find_pc_sect_psymtab - (struct objfile *objfile, - CORE_ADDR pc, - struct obj_section *section, - struct bound_minimal_symbol msymbol); - -private: - - /* Count the number of partial symbols in *THIS. */ - int count_psyms (); - - /* Storage for the partial symbols. */ - std::shared_ptr m_partial_symtabs; -}; - -#endif /* PSYMPRIV_H */ diff --git a/gdb/psymtab.c b/gdb/psymtab.c index fc450ac0e22..41ecf31424b 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -20,7 +20,7 @@ #include "defs.h" #include "symtab.h" #include "objfiles.h" -#include "psympriv.h" +#include "psymtab.h" #include "block.h" #include "filenames.h" #include "source.h" @@ -76,7 +76,7 @@ psymtab_storage::install_psymtab (partial_symtab *pst) -/* See psympriv.h. */ +/* See psymtab.h. */ psymtab_storage::partial_symtab_range psymbol_functions::partial_symbols (struct objfile *objfile) @@ -160,7 +160,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile, return best_pst; } -/* See psympriv.h. */ +/* See psymtab.h. */ struct partial_symtab * psymbol_functions::find_pc_sect_psymtab (struct objfile *objfile, @@ -1177,7 +1177,7 @@ psymbol_bcache::compare (const void *addr1, const void *addr2, int length) && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ()); } -/* See psympriv.h. */ +/* See psymtab.h. */ void partial_symtab::add_psymbol (const partial_symbol &psymbol, @@ -1205,7 +1205,7 @@ partial_symtab::add_psymbol (const partial_symbol &psymbol, list.push_back (psym); } -/* See psympriv.h. */ +/* See psymtab.h. */ void partial_symtab::add_psymbol (gdb::string_view name, bool copy_name, @@ -1231,7 +1231,7 @@ partial_symtab::add_psymbol (gdb::string_view name, bool copy_name, add_psymbol (psymbol, where, partial_symtabs, objfile); } -/* See psympriv.h. */ +/* See psymtab.h. */ partial_symtab::partial_symtab (const char *filename_, psymtab_storage *partial_symtabs, @@ -1265,7 +1265,7 @@ partial_symtab::partial_symtab (const char *filename_, } } -/* See psympriv.h. */ +/* See psymtab.h. */ void partial_symtab::expand_dependencies (struct objfile *objfile) diff --git a/gdb/psymtab.h b/gdb/psymtab.h index ceb1310ae53..41337d0db89 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -20,13 +20,13 @@ #ifndef PSYMTAB_H #define PSYMTAB_H +#include "objfiles.h" +#include "gdbsupport/gdb_string_view.h" #include "gdbsupport/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 @@ -134,4 +134,565 @@ private: gdb::optional m_obstack; }; +/* A partial_symbol records the name, domain, and address class of + symbols whose types we have not parsed yet. For functions, it also + contains their memory address, so we can find them from a PC value. + Each partial_symbol sits in a partial_symtab, all of which are chained + on a partial symtab list and which points to the corresponding + normal symtab once the partial_symtab has been referenced. */ + +/* This structure is space critical. See space comments at the top of + symtab.h. */ + +struct partial_symbol +{ + /* Return the section for this partial symbol, or nullptr if no + section has been set. */ + struct obj_section *obj_section (struct objfile *objfile) const + { + return ginfo.obj_section (objfile); + } + + /* Return the unrelocated address of this partial symbol. */ + unrelocated_addr unrelocated_address () const + { + return ginfo.unrelocated_address (); + } + + /* Return the address of this partial symbol, relocated according to + the offsets provided in OBJFILE. */ + CORE_ADDR address (const struct objfile *objfile) const + { + return (CORE_ADDR (ginfo.unrelocated_address ()) + + objfile->section_offsets[ginfo.section_index ()]); + } + + /* Set the address of this partial symbol. The address must be + unrelocated. */ + void set_unrelocated_address (unrelocated_addr addr) + { + ginfo.set_unrelocated_address (addr); + } + + /* Note that partial_symbol does not derive from general_symbol_info + due to the bcache. See add_psymbol_to_bcache. */ + + struct general_symbol_info ginfo; + + /* Name space code. */ + + ENUM_BITFIELD(domain_enum) domain : SYMBOL_DOMAIN_BITS; + + /* Address class (for info_symbols). Note that we don't allow + synthetic "aclass" values here at present, simply because there's + no need. */ + + ENUM_BITFIELD(address_class) aclass : SYMBOL_ACLASS_BITS; +}; + +/* A convenience enum to give names to some constants used when + searching psymtabs. This is internal to psymtab and should not be + used elsewhere. */ + +enum psymtab_search_status + { + PST_NOT_SEARCHED, + PST_SEARCHED_AND_FOUND, + PST_SEARCHED_AND_NOT_FOUND + }; + +/* Specify whether a partial psymbol should be allocated on the global + list or the static list. */ + +enum class psymbol_placement +{ + STATIC, + GLOBAL +}; + +/* Each source file that has not been fully read in is represented by + a partial_symtab. This contains the information on where in the + executable the debugging symbols for a specific file are, and a + list of names of global symbols which are located in this file. + They are all chained on partial symtab lists. + + Even after the source file has been read into a symtab, the + partial_symtab remains around. */ + +struct partial_symtab +{ + /* Allocate a new partial symbol table. + + FILENAME (which must be non-NULL) is the filename of this partial + symbol table; it is copied into the appropriate storage. The + partial symtab will also be installed using + psymtab_storage::install. */ + + partial_symtab (const char *filename, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd) + ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); + + /* Like the above, but also sets the initial text low and text high + from the ADDR argument, and sets the global- and + static-offsets. */ + + partial_symtab (const char *filename, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd, + unrelocated_addr addr) + ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); + + virtual ~partial_symtab () + { + } + + /* Psymtab expansion is done in two steps: + - a call to read_symtab + - while that call is in progress, calls to expand_psymtab can be made, + both for this psymtab, and its dependencies. + This makes a distinction between a toplevel psymtab (for which both + read_symtab and expand_psymtab will be called) and a non-toplevel + psymtab (for which only expand_psymtab will be called). The + distinction can be used f.i. to do things before and after all + dependencies of a top-level psymtab have been expanded. + + Read the full symbol table corresponding to this partial symbol + table. Typically calls expand_psymtab. */ + virtual void read_symtab (struct objfile *) = 0; + + /* Expand the full symbol table for this partial symbol table. Typically + calls expand_dependencies. */ + virtual void expand_psymtab (struct objfile *) = 0; + + /* Ensure that all the dependencies are read in. Calls + expand_psymtab for each non-shared dependency. */ + void expand_dependencies (struct objfile *); + + /* Return true if the symtab corresponding to this psymtab has been + read in in the context of this objfile. */ + virtual bool readin_p (struct objfile *) const = 0; + + /* Return a pointer to the compunit allocated for this source file + in the context of this objfile. + + Return nullptr if the compunit was not read in or if there was no + symtab. */ + virtual struct compunit_symtab *get_compunit_symtab + (struct objfile *) const = 0; + + /* Return the unrelocated low text address of this + partial_symtab. */ + unrelocated_addr unrelocated_text_low () const + { + return m_text_low; + } + + /* Return the unrelocated_addr high text address of this + partial_symtab. */ + unrelocated_addr unrelocated_text_high () const + { + return m_text_high; + } + + /* Return the relocated low text address of this partial_symtab. */ + CORE_ADDR text_low (struct objfile *objfile) const + { + return CORE_ADDR (m_text_low) + objfile->text_section_offset (); + } + + /* Return the relocated high text address of this partial_symtab. */ + CORE_ADDR text_high (struct objfile *objfile) const + { + return CORE_ADDR (m_text_high) + objfile->text_section_offset (); + } + + /* Set the low text address of this partial_symtab. */ + void set_text_low (unrelocated_addr addr) + { + m_text_low = addr; + text_low_valid = 1; + } + + /* Set the high text address of this partial_symtab. */ + void set_text_high (unrelocated_addr addr) + { + m_text_high = addr; + text_high_valid = 1; + } + + /* Return true if this symtab is empty -- meaning that it contains + no symbols. It may still have dependencies. */ + bool empty () const + { + return global_psymbols.empty () && static_psymbols.empty (); + } + + /* Add a symbol to this partial symbol table of OBJFILE. + + If COPY_NAME is true, make a copy of NAME, otherwise use the passed + reference. + + THECLASS is the type of symbol. + + SECTION is the index of the section of OBJFILE in which the symbol is found. + + WHERE determines whether the symbol goes in the list of static or global + partial symbols. + + COREADDR is the address of the symbol. For partial symbols that don't have + an address, zero is passed. + + LANGUAGE is the language from which the symbol originates. This will + influence, amongst other things, how the symbol name is demangled. */ + + void add_psymbol (gdb::string_view name, + bool copy_name, domain_enum domain, + enum address_class theclass, + short section, + psymbol_placement where, + unrelocated_addr coreaddr, + enum language language, + psymtab_storage *partial_symtabs, + struct objfile *objfile); + + /* Add a symbol to this partial symbol table of OBJFILE. The psymbol + must be fully constructed, and the names must be set and intern'd + as appropriate. */ + + void add_psymbol (const partial_symbol &psym, + psymbol_placement where, + psymtab_storage *partial_symtabs, + struct objfile *objfile); + + + /* Indicate that this partial symtab is complete. */ + + void end (); + + /* Chain of all existing partial symtabs. */ + + struct partial_symtab *next = nullptr; + + /* Name of the source file which this partial_symtab defines, + or if the psymtab is anonymous then a descriptive name for + debugging purposes, or "". It must not be NULL. */ + + const char *filename = nullptr; + + /* Full path of the source file. NULL if not known. */ + + char *fullname = nullptr; + + /* Directory in which it was compiled, or NULL if we don't know. */ + + const char *dirname = nullptr; + + /* Range of text addresses covered by this file; texthigh is the + beginning of the next section. Do not refer directly to these + fields. Instead, use the accessors. The validity of these + fields is determined by the text_low_valid and text_high_valid + fields; these are located later in this structure for better + packing. */ + + unrelocated_addr m_text_low {}; + unrelocated_addr m_text_high {}; + + /* If NULL, this is an ordinary partial symbol table. + + If non-NULL, this holds a single includer of this partial symbol + table, and this partial symbol table is a shared one. + + A shared psymtab is one that is referenced by multiple other + psymtabs, and which conceptually has its contents directly + included in those. + + Shared psymtabs have special semantics. When a search finds a + symbol in a shared table, we instead return one of the non-shared + tables that include this one. + + A shared psymtabs can be referred to by other shared ones. + + The psymtabs that refer to a shared psymtab will list the shared + psymtab in their 'dependencies' array. + + In DWARF terms, a shared psymtab is a DW_TAG_partial_unit; but + of course using a name based on that would be too confusing, so + "shared" was chosen instead. + + Only a single user is needed because, when expanding a shared + psymtab, we only need to expand its "canonical" non-shared user. + The choice of which one should be canonical is left to the + debuginfo reader; it can be arbitrary. */ + + struct partial_symtab *user = nullptr; + + /* Array of pointers to all of the partial_symtab's which this one + depends on. Since this array can only be set to previous or + the current (?) psymtab, this dependency tree is guaranteed not + to have any loops. "depends on" means that symbols must be read + for the dependencies before being read for this psymtab; this is + for type references in stabs, where if foo.c includes foo.h, declarations + in foo.h may use type numbers defined in foo.c. For other debugging + formats there may be no need to use dependencies. */ + + struct partial_symtab **dependencies = nullptr; + + int number_of_dependencies = 0; + + /* Global symbol list. This list will be sorted after readin to + improve access. Binary search will be the usual method of + finding a symbol within it. */ + + std::vector global_psymbols; + + /* Static symbol list. This list will *not* be sorted after readin; + to find a symbol in it, exhaustive search must be used. This is + reasonable because searches through this list will eventually + lead to either the read in of a files symbols for real (assumed + to take a *lot* of time; check) or an error (and we don't care + how long errors take). */ + + std::vector static_psymbols; + + /* True if the name of this partial symtab is not a source file name. */ + + bool anonymous = false; + + /* A flag that is temporarily used when searching psymtabs. */ + + ENUM_BITFIELD (psymtab_search_status) searched_flag : 2; + + /* Validity of the m_text_low and m_text_high fields. */ + + unsigned int text_low_valid : 1; + unsigned int text_high_valid : 1; +}; + +/* A partial symtab that tracks the "readin" and "compunit_symtab" + information in the ordinary way -- by storing it directly in this + object. */ +struct standard_psymtab : public partial_symtab +{ + standard_psymtab (const char *filename, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd) + : partial_symtab (filename, partial_symtabs, objfile_per_bfd) + { + } + + standard_psymtab (const char *filename, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd, + unrelocated_addr addr) + : partial_symtab (filename, partial_symtabs, objfile_per_bfd, addr) + { + } + + bool readin_p (struct objfile *) const override + { + return readin; + } + + struct compunit_symtab *get_compunit_symtab (struct objfile *) const override + { + return compunit_symtab; + } + + /* True if the symtab corresponding to this psymtab has been + readin. */ + + bool readin = false; + + /* Pointer to compunit eventually allocated for this source file, 0 if + !readin or if we haven't looked for the symtab after it was readin. */ + + struct compunit_symtab *compunit_symtab = nullptr; +}; + +/* A partial_symtab that works in the historical db way. This should + not be used in new code, but exists to transition the somewhat + unmaintained "legacy" debug formats. */ + +struct legacy_psymtab : public standard_psymtab +{ + legacy_psymtab (const char *filename, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd) + : standard_psymtab (filename, partial_symtabs, objfile_per_bfd) + { + } + + legacy_psymtab (const char *filename, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd, + unrelocated_addr addr) + : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr) + { + } + + void read_symtab (struct objfile *objf) override + { + if (legacy_read_symtab) + (*legacy_read_symtab) (this, objf); + } + + void expand_psymtab (struct objfile *objf) override + { + (*legacy_expand_psymtab) (this, objf); + } + + /* Pointer to function which will read in the symtab corresponding to + this psymtab. */ + + void (*legacy_read_symtab) (legacy_psymtab *, struct objfile *) = nullptr; + + /* Pointer to function which will actually expand this psymtab into + a full symtab. */ + + void (*legacy_expand_psymtab) (legacy_psymtab *, struct objfile *) = nullptr; + + /* Information that lets read_symtab() locate the part of the symbol table + that this psymtab corresponds to. This information is private to the + format-dependent symbol reading routines. For further detail examine + the various symbol reading modules. */ + + void *read_symtab_private = nullptr; +}; + +/* Used when recording partial symbol tables. On destruction, + discards any partial symbol tables that have been built. However, + the tables can be kept by calling the "keep" method. */ +class psymtab_discarder +{ + public: + + psymtab_discarder (psymtab_storage *partial_symtabs) + : m_partial_symtabs (partial_symtabs), + m_psymtab (partial_symtabs->psymtabs) + { + } + + ~psymtab_discarder () + { + if (m_partial_symtabs != nullptr) + m_partial_symtabs->discard_psymtabs_to (m_psymtab); + } + + /* Keep any partial symbol tables that were built. */ + void keep () + { + m_partial_symtabs = nullptr; + } + + private: + + /* The partial symbol storage object. */ + psymtab_storage *m_partial_symtabs; + /* How far back to free. */ + struct partial_symtab *m_psymtab; +}; + +/* An implementation of quick_symbol_functions, specialized for + partial symbols. */ +struct psymbol_functions : public quick_symbol_functions +{ + explicit psymbol_functions (const std::shared_ptr &storage) + : m_partial_symtabs (storage) + { + } + + psymbol_functions () + : m_partial_symtabs (new psymtab_storage) + { + } + + bool has_symbols (struct objfile *objfile) override; + + bool has_unexpanded_symtabs (struct objfile *objfile) override; + + struct symtab *find_last_source_symtab (struct objfile *objfile) override; + + void forget_cached_source_info (struct objfile *objfile) override; + + enum language lookup_global_symbol_language (struct objfile *objfile, + const char *name, + domain_enum domain, + bool *symbol_found_p) override; + + void print_stats (struct objfile *objfile, bool print_bcache) override; + + void dump (struct objfile *objfile) override; + + void expand_all_symtabs (struct objfile *objfile) override; + + void expand_matching_symbols + (struct objfile *, + const lookup_name_info &lookup_name, + domain_enum domain, + int global, + symbol_compare_ftype *ordered_compare) override; + + bool expand_symtabs_matching + (struct objfile *objfile, + gdb::function_view file_matcher, + const lookup_name_info *lookup_name, + gdb::function_view symbol_matcher, + gdb::function_view expansion_notify, + block_search_flags search_flags, + domain_enum domain, + enum search_domain kind) override; + + struct compunit_symtab *find_pc_sect_compunit_symtab + (struct objfile *objfile, struct bound_minimal_symbol msymbol, + CORE_ADDR pc, struct obj_section *section, int warn_if_readin) override; + + struct compunit_symtab *find_compunit_symtab_by_address + (struct objfile *objfile, CORE_ADDR address) override + { + return nullptr; + } + + void map_symbol_filenames (struct objfile *objfile, + gdb::function_view fun, + bool need_fullname) override; + + /* Return a range adapter for the psymtabs. */ + psymtab_storage::partial_symtab_range partial_symbols + (struct objfile *objfile); + + /* Return the partial symbol storage associated with this + object. */ + const std::shared_ptr &get_partial_symtabs () const + { + return m_partial_symtabs; + } + + /* Replace the partial symbol table storage in this object with + SYMS. */ + void set_partial_symtabs (const std::shared_ptr &syms) + { + m_partial_symtabs = syms; + } + + /* Find which partial symtab contains PC and SECTION. Return NULL if + none. We return the psymtab that contains a symbol whose address + exactly matches PC, or, if we cannot find an exact match, the + psymtab that contains a symbol whose address is closest to PC. */ + + struct partial_symtab *find_pc_sect_psymtab + (struct objfile *objfile, + CORE_ADDR pc, + struct obj_section *section, + struct bound_minimal_symbol msymbol); + +private: + + /* Count the number of partial symbols in *THIS. */ + int count_psyms (); + + /* Storage for the partial symbols. */ + std::shared_ptr m_partial_symtabs; +}; + #endif /* PSYMTAB_H */ diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 63eb538ca05..427029dd442 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -46,7 +46,7 @@ #include "stabsread.h" #include "expression.h" #include "complaints.h" -#include "psympriv.h" +#include "psymtab.h" #include "dwarf2/sect-names.h" #include "dwarf2/public.h" -- 2.30.2