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
{
{
}
- /* Read the full symbol table corresponding to this partial symbol
- table. */
+ /* 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;
- /* Psymtab expansion is done in two steps. The first step is a call
- to read_symtab; but while that is in progress, calls to
- expand_psymtab can be made. */
+ /* 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
{
int statics_offset = 0;
int n_static_syms = 0;
- /* True if the symtab corresponding to this psymtab has been readin.
- This is located here so that this structure packs better on
- 64-bit systems. */
-
- bool readin = false;
-
/* 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 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, struct objfile *objfile)
+ : partial_symtab (filename, objfile)
+ {
+ }
+
+ standard_psymtab (const char *filename, struct objfile *objfile,
+ CORE_ADDR addr)
+ : partial_symtab (filename, objfile, 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. */
not be used in new code, but exists to transition the somewhat
unmaintained "legacy" debug formats. */
-struct legacy_psymtab : public partial_symtab
+struct legacy_psymtab : public standard_psymtab
{
legacy_psymtab (const char *filename, struct objfile *objfile)
- : partial_symtab (filename, objfile)
+ : standard_psymtab (filename, objfile)
{
}
legacy_psymtab (const char *filename, struct objfile *objfile,
CORE_ADDR addr)
- : partial_symtab (filename, objfile, addr)
+ : standard_psymtab (filename, objfile, addr)
{
}
enum language language,
struct objfile *objfile);
+/* Add a symbol to the partial symbol table of OBJFILE. The psymbol
+ must be fully constructed, and the names must be set and intern'd
+ as appropriate. */
+
+extern void add_psymbol_to_list (const partial_symbol &psym,
+ psymbol_placement where,
+ struct objfile *objfile);
+
/* 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. */
extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
-static inline void
-discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
-{
- objfile->partial_symtabs->discard_psymtab (pst);
-}
-
/* 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. */