/* Private partial symbol table definitions.
- Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Copyright (C) 2009-2022 Free Software Foundation, Inc.
This file is part of GDB.
section has been set. */
struct obj_section *obj_section (struct objfile *objfile) const
{
- if (ginfo.section >= 0)
- return &objfile->sections[ginfo.section];
- return nullptr;
+ return ginfo.obj_section (objfile);
}
/* Return the unrelocated address of this partial symbol. */
the offsets provided in OBJFILE. */
CORE_ADDR address (const struct objfile *objfile) const
{
- return ginfo.value.address + objfile->section_offsets[ginfo.section];
+ return (ginfo.value.address
+ + objfile->section_offsets[ginfo.section_index ()]);
}
/* Set the address of this partial symbol. The address must be
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
They are all chained on partial symtab lists.
Even after the source file has been read into a symtab, the
- partial_symtab remains around. They are allocated on an obstack,
- objfile_obstack. */
+ partial_symtab remains around. */
struct partial_symtab
{
- partial_symtab ()
- : searched_flag (PST_NOT_SEARCHED),
- text_low_valid (0),
- text_high_valid (0)
+ /* 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,
+ CORE_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 raw low text address of this partial_symtab. */
CORE_ADDR raw_text_low () const
{
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,
+ CORE_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. */
/* 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. globals_offset is an integer offset
- within global_psymbols[]. */
+ finding a symbol within it. */
- int globals_offset = 0;
- int n_global_syms = 0;
+ std::vector<partial_symbol *> 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). This is an offset and size within
- static_psymbols[]. */
+ how long errors take). */
- int statics_offset = 0;
- int n_static_syms = 0;
-
- /* Non-zero if the symtab corresponding to this psymtab has been
- readin. This is located here so that this structure packs better
- on 64-bit systems. */
-
- unsigned char readin = 0;
+ std::vector<partial_symbol *> static_psymbols;
/* True iff objfile->psymtabs_addrmap is properly populated for this
partial_symtab. For discontiguous overlapping psymtabs is the only usable
info in PSYMTABS_ADDRMAP. */
- unsigned char psymtabs_addrmap_supported = 0;
+ bool psymtabs_addrmap_supported = false;
/* True if the name of this partial symtab is not a source file name. */
- unsigned char anonymous = 0;
+ bool anonymous = false;
/* A flag that is temporarily used when searching psymtabs. */
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,
+ CORE_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,
+ CORE_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 (*read_symtab) (struct partial_symtab *, struct objfile *) = nullptr;
+ 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
void *read_symtab_private = nullptr;
};
-/* Specify whether a partial psymbol should be allocated on the global
- list or the static list. */
-
-enum class psymbol_placement
+/* 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
{
- STATIC,
- GLOBAL
-};
+ 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;
+ }
-/* Add a symbol to the partial symbol table of OBJFILE.
+ private:
- If COPY_NAME is true, make a copy of NAME, otherwise use the passed
- reference.
+ /* The partial symbol storage object. */
+ psymtab_storage *m_partial_symtabs;
+ /* How far back to free. */
+ struct partial_symtab *m_psymtab;
+};
- THECLASS is the type of symbol.
+/* An implementation of quick_symbol_functions, specialized for
+ partial symbols. */
+struct psymbol_functions : public quick_symbol_functions
+{
+ explicit psymbol_functions (const std::shared_ptr<psymtab_storage> &storage)
+ : m_partial_symtabs (storage)
+ {
+ }
- SECTION is the index of the section of OBJFILE in which the symbol is found.
+ psymbol_functions ()
+ : m_partial_symtabs (new psymtab_storage)
+ {
+ }
- WHERE determines whether the symbol goes in the list of static or global
- partial symbols of OBJFILE.
+ bool has_symbols (struct objfile *objfile) override;
- COREADDR is the address of the symbol. For partial symbols that don't have
- an address, zero is passed.
+ bool has_unexpanded_symtabs (struct objfile *objfile) override;
- LANGUAGE is the language from which the symbol originates. This will
- influence, amongst other things, how the symbol name is demangled. */
+ struct symtab *find_last_source_symtab (struct objfile *objfile) override;
-extern void add_psymbol_to_list (gdb::string_view name,
- bool copy_name, domain_enum domain,
- enum address_class theclass,
- short section,
- psymbol_placement where,
- CORE_ADDR coreaddr,
- enum language language,
- struct objfile *objfile);
+ void forget_cached_source_info (struct objfile *objfile) override;
-/* Initialize storage for partial symbols. If partial symbol storage
- has already been initialized, this does nothing. TOTAL_SYMBOLS is
- an estimate of how many symbols there will be. */
+ enum language lookup_global_symbol_language (struct objfile *objfile,
+ const char *name,
+ domain_enum domain,
+ bool *symbol_found_p) override;
-extern void init_psymbol_list (struct objfile *objfile, int total_symbols);
+ void print_stats (struct objfile *objfile, bool print_bcache) override;
-extern struct partial_symtab *start_psymtab_common (struct objfile *,
- const char *, CORE_ADDR);
+ void dump (struct objfile *objfile) override;
-extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
+ void expand_all_symtabs (struct objfile *objfile) override;
-/* Allocate a new partial symbol table associated with OBJFILE.
- FILENAME (which must be non-NULL) is the filename of this partial
- symbol table; it is copied into the appropriate storage. A new
- partial symbol table is returned; aside from "next" and "filename",
- its fields are initialized to zero. */
+ void expand_matching_symbols
+ (struct objfile *,
+ const lookup_name_info &lookup_name,
+ domain_enum domain,
+ int global,
+ symbol_compare_ftype *ordered_compare) override;
-extern struct partial_symtab *allocate_psymtab (const char *filename,
- struct objfile *objfile)
- ATTRIBUTE_NONNULL (1);
+ bool expand_symtabs_matching
+ (struct objfile *objfile,
+ gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+ const lookup_name_info *lookup_name,
+ gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+ gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+ block_search_flags search_flags,
+ domain_enum domain,
+ enum search_domain kind) override;
-static inline void
-discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
-{
- objfile->partial_symtabs->discard_psymtab (pst);
-}
+ 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;
-/* 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:
+ struct compunit_symtab *find_compunit_symtab_by_address
+ (struct objfile *objfile, CORE_ADDR address) override;
+
+ void map_symbol_filenames (struct objfile *objfile,
+ gdb::function_view<symbol_filename_ftype> fun,
+ bool need_fullname) override;
- psymtab_discarder (struct objfile *objfile)
- : m_objfile (objfile),
- m_psymtab (objfile->partial_symtabs->psymtabs)
+ void relocated () override
{
+ m_psymbol_map.clear ();
}
- ~psymtab_discarder ()
+ /* Ensure the partial symbols for OBJFILE have been loaded. Return
+ a range adapter for the psymtabs. */
+ psymtab_storage::partial_symtab_range require_partial_symbols
+ (struct objfile *objfile);
+
+ /* Return the partial symbol storage associated with this
+ object. */
+ const std::shared_ptr<psymtab_storage> &get_partial_symtabs () const
{
- if (m_objfile != NULL)
- m_objfile->partial_symtabs->discard_psymtabs_to (m_psymtab);
+ return m_partial_symtabs;
}
- /* Keep any partial symbol tables that were built. */
- void keep ()
+ /* Replace the partial symbol table storage in this object with
+ SYMS. */
+ void set_partial_symtabs (const std::shared_ptr<psymtab_storage> &syms)
{
- m_objfile = NULL;
+ m_partial_symtabs = syms;
}
- private:
+ /* 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. */
- /* The objfile. If NULL this serves as a sentinel to indicate that
- the psymtabs should be kept. */
- struct objfile *m_objfile;
- /* How far back to free. */
- struct partial_symtab *m_psymtab;
+ 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 ();
+
+ void fill_psymbol_map (struct objfile *objfile,
+ struct partial_symtab *psymtab,
+ std::set<CORE_ADDR> *seen_addrs,
+ const std::vector<partial_symbol *> &symbols);
+
+ /* Storage for the partial symbols. */
+ std::shared_ptr<psymtab_storage> m_partial_symtabs;
+
+ /* Map symbol addresses to the partial symtab that defines the
+ object at that address. */
+
+ std::vector<std::pair<CORE_ADDR, partial_symtab *>> m_psymbol_map;
};
#endif /* PSYMPRIV_H */