#include "psymtab.h"
#include "objfiles.h"
+#include "gdbsupport/gdb_string_view.h"
/* A partial_symbol records the name, domain, and address class of
symbols whose types we have not parsed yet. For functions, it also
/* This structure is space critical. See space comments at the top of
symtab.h. */
-struct partial_symbol : public general_symbol_info
+struct partial_symbol
{
/* Return the section for this partial symbol, or nullptr if no
section has been set. */
struct obj_section *obj_section (struct objfile *objfile) const
{
- if (section >= 0)
- return &objfile->sections[section];
+ if (ginfo.section >= 0)
+ return &objfile->sections[ginfo.section];
return nullptr;
}
/* Return the unrelocated address of this partial symbol. */
CORE_ADDR unrelocated_address () const
{
- return value.address;
+ return ginfo.value.address;
}
/* Return the address of this partial symbol, relocated according to
the offsets provided in OBJFILE. */
CORE_ADDR address (const struct objfile *objfile) const
{
- return value.address + ANOFFSET (objfile->section_offsets, section);
+ return (ginfo.value.address
+ + ANOFFSET (objfile->section_offsets, ginfo.section));
}
/* Set the address of this partial symbol. The address must be
unrelocated. */
void set_unrelocated_address (CORE_ADDR addr)
{
- value.address = addr;
+ ginfo.value.address = addr;
}
+ /* Note that partial_symbol does not derive from general_symbol_info
+ due to the bcache. See add_psymbol_to_bcache. */
+
+ struct general_symbol_info ginfo;
+
/* Name space code. */
ENUM_BITFIELD(domain_enum_tag) domain : SYMBOL_DOMAIN_BITS;
void *read_symtab_private;
};
-/* Add any kind of symbol to a partial_symbol vector. */
+/* Specify whether a partial psymbol should be allocated on the global
+ list or the static list. */
+
+enum class psymbol_placement
+{
+ STATIC,
+ GLOBAL
+};
+
+/* Add a symbol to the 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.
-extern void add_psymbol_to_list (const char *, int,
- int, domain_enum,
- enum address_class,
- short /* section */,
- std::vector<partial_symbol *> *,
- CORE_ADDR,
- enum language, struct objfile *);
+ SECTION is the index of the section of OBJFILE in which the symbol is found.
-extern void init_psymbol_list (struct objfile *, int);
+ WHERE determines whether the symbol goes in the list of static or global
+ partial symbols of OBJFILE.
+
+ 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. */
+
+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);
+
+/* 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,
- std::vector<partial_symbol *> &,
- std::vector<partial_symbol *> &);
+ const char *, CORE_ADDR);
extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
-extern struct partial_symtab *allocate_psymtab (const char *,
- struct objfile *)
+/* 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);
-extern void discard_psymtab (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,
psymtab_discarder (struct objfile *objfile)
: m_objfile (objfile),
- m_psymtab (objfile->psymtabs)
+ m_psymtab (objfile->partial_symtabs->psymtabs)
{
}
~psymtab_discarder ()
{
if (m_objfile != NULL)
- while (m_objfile->psymtabs != m_psymtab)
- discard_psymtab (m_objfile, m_objfile->psymtabs);
+ m_objfile->partial_symtabs->discard_psymtabs_to (m_psymtab);
}
/* Keep any partial symbol tables that were built. */