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
{
CORE_ADDR addr)
ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3);
+ virtual ~partial_symtab ()
+ {
+ }
+
+ /* Read the full symbol table corresponding to this partial symbol
+ table. */
+ 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. */
+ virtual void expand_psymtab (struct objfile *) = 0;
+
+ /* Ensure that all the dependencies are read in. */
+ void expand_dependencies (struct objfile *);
+
+ /* Return true if the symtab corresponding to this psymtab has been
+ readin. */
+ virtual bool readin_p () const = 0;
+
+ /* Return a pointer to the compunit allocated for this source file.
+ Return nullptr if !readin or if there was no symtab. */
+ virtual struct compunit_symtab *get_compunit_symtab () 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 () const override
+ {
+ return readin;
+ }
+
+ /* Return a pointer to the compunit allocated for this source file.
+ Return nullptr if !readin or if there was no symtab. */
+ struct compunit_symtab *get_compunit_symtab () 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
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. */