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 (const char *filename, struct objfile *objfile)
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, struct objfile *objfile,
+ 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
{
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. */
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, struct objfile *objfile)
+ : standard_psymtab (filename, objfile)
+ {
+ }
+
+ legacy_psymtab (const char *filename, struct objfile *objfile,
+ CORE_ADDR addr)
+ : standard_psymtab (filename, objfile, 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
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 init_psymbol_list (struct objfile *objfile, int total_symbols);
-extern struct partial_symtab *start_psymtab_common (struct objfile *,
- const char *, CORE_ADDR);
-
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. */