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 associated with OBJFILE.
+ 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, 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 ()
{
}
+ /* 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 read_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;
- /* 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;
-
/* 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, 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 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 *);
-/* 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. */
-
-extern struct partial_symtab *allocate_psymtab (const char *filename,
- struct objfile *objfile)
- ATTRIBUTE_NONNULL (1);
-
static inline void
discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
{